Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
介绍# T! m& F! D. P3 L0 Q8 I( a& k
开发语言
1 e5 i1 f4 G) @8 ^6 p; U在NEO智能合约开发平台进行开发的优势之一是平台支持各种开发语言。
8 v0 p  y1 T% |# S! _* i3 SNEO推荐使用C#语言,不过它也支持使用Python, Java, Go, Ruby,之后还会进一步支持Kotlin, C/C++, JavaScript等开发语言。.! f* V( J- O; P" w# p2 S* N: c
尽管支持多种语言,但我们仍可以发现现有的很多项目使用的是C#、Python、Java,使用GO语言的并不多。因此,参考City of Zion (CoZ)上的资料,我想尝试写一篇关于使用GO语言开发的简单教程,希望能吸引更多使用GO语言的开发人员参与开发。" M9 a. A! x; K& R) |4 G- l. `
给GO开发人员的建议/ G* P6 _  |% F
无论你是编程新手还是经验丰富的开发人员,刚开始时都建议你在私有域或测试网上进行开发。/ X- c0 I* s# G2 F- @3 b8 Z
为什么?9 S8 _9 l  O8 F" T3 Y
因为在主网上部署NEP-5 Token需要消耗490个GAS。
3 y* P( Y! f, o  a写这篇文章的时候(2018年9月15日),GAS的市场价格是5.8美元,那么该笔费用就高达2842美元。对于任何创业公司而言,这都是一笔不小的费用。
& f% }) l" K# M按照GAS的历史最高价,每个Token的价格为95.87美元,那么仅仅部署一次智能合约,你的成本就要增加4,7000美元。# D# D* F6 Z) r% [, O" Y0 n7 K( w/ U
因此,刚开始开发的时候,建议你在私有域或者测试网上操作,当你准备好之后,再转到主网上部署合约。
+ z7 g5 ]3 O$ ?" X4 k! w# v2 K要求" j& K2 K2 J3 q% _3 _2 B. j
本教程中,开发环境的需求如下所示:- V' U5 J! N9 U3 `
操作系统 – 桌面版Ubuntu Desktop 18.04.1 LTS
0 n0 S8 |# K5 \! Q% ^# IGit 命令行接口 –Git
" w4 Y$ ^7 i* X) u, t2 T; t语言 – GO语言0 T8 P7 I7 L. {, m
Go语言依赖管理工具 – Dep
+ V' P' V0 R: U( n5 H* m( fDocker –Docker CE 和 Docker Compose
, n  c; x6 J( j2 n6 g6 B) W( |4 }编辑器 – Visual Studio Code, Extension: Go& ^6 e5 `5 w: p9 L9 h
使用到的NEO的资料1 ^& e- P6 n" `0 y. S; U9 ?
GO语言智能合约框架 – neo-storm
' {9 l( ?( X$ D& k) ]预建好的使用Python语言编写的neo-privnet-with-gas以及nep-scan镜像 –  neo-scan-docker
# e" k  Q5 Q: H7 x1 k重要提示:结果可能因NEO编译器和节点版本不同而有差异。8 _; l4 N. Q; p' n5 @2 d
本质上来说,有几种方法可以运行私有域,例如使用 neo-go 或者 neo-privatenet-docker。 但是,在本教程中,我们会使用slipo编写的 neo-scan-docker。 neo-scan-docker是用neo-python构建的,所以它带有一些“Python”组件。 此外,它还带有neo-scan的UI,允许您分析智能合约的部署事务。
) N1 S# d3 v2 i5 N* R*安装方法可能因操作系统而异。 相关的详细信息,请点击上面的链接查看。- n: G( v1 M/ q; o+ @6 a8 P5 |
配置你的环境
1 ^$ L) j3 C& j2 p: b首先,我们先用 neo-scan-docker来配置一下NEO私有域。
( E" ~3 F) @# \& V- b1 检查一下Git, Docker and Docker Compose这些工具是否已经准备好。
. B8 {4 E$ N* G2 B' I; brichie@Redbuntu:~/Desktop$ sudo git --version  O, s( Y  I1 o7 Z
git version 2.17.1
: V0 C0 P) y/ a4 G; mrichie@Redbuntu:~/Desktop$ sudo docker -v
! D) T$ y  ^$ \/ z, ]( U; J: h4 uDocker version 18.06.1-ce, build e68fc7a
. {: Q. g8 {0 O/ b9 Y7 Orichie@Redbuntu:~/Desktop$ sudo docker-compose -v
; p& Z( P3 I7 p, z% d% t7 ndocker-compose version 1.22.0, build f46880fe
  R: [! |! |) T4 V7 K0 S# e5 h2克隆(Clone) slipo的 neo-scan-docker仓库代码,并使用 docker-compose来加载Docker镜像。 下载镜像可能需要点时间,请耐心等待done状态的出现。
: G. C4 z# z5 drichie@Redbuntu:~/Desktop$ git clone https://github.com/slipo/neo-scan-docker.git
2 m4 g) w) {9 m' J# I2 nCloning into 'neo-scan-docker'...
- _" \" @9 B- eremote: Counting objects: 27, done.
7 f# O, }7 H7 E& k9 {+ V$ [0 r9 |  M* gremote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27* M& ^* b, K. d6 `+ m* r1 ^
Unpacking objects: 100% (27/27), done.( q# M5 P7 _/ {7 V3 s) H# T
richie@Redbuntu:~/Desktop$ cd neo-scan-docker/1 x* R( m/ t* {# V4 L* o# f
richie@Redbuntu:~/Desktop/neo-scan-docker$ sudo docker-compose up
/ V* _* C- z  ], V6 x  [Starting neo-scan-docker_postgresql_1 ... done' |8 b4 p2 H+ W7 k& x" a8 [' d4 O
Starting neo-privnet                  ...: ?- E# J) W" N3 U6 K1 p
done
- l6 \/ M6 M% uStarting neo-scan                     ...; G2 [9 H6 W( _/ b- G1 H0 y
done
1 p3 H9 X1 E: d9 M9 \* {Attaching to neo-scan-docker_postgresql_1, neo-privnet, neo-scan`
" a1 ^: {; d7 a+ E# f3 h3在你的主机文件中,添加127.0.0.1 neo-privnet。注意:主机文件的位置可能因操作系统而异。
- m8 v/ f. f- b. G  \  @- OUnix/Linux/macOS - /etc/hosts( K. T3 m7 ^$ |9 [4 D: l
Windows          - C:\Windows\System32\Drivers\etc\hosts`+ h5 e5 {! M. A/ r# u" A! T
4在浏览器中输入http://127.0.0.1:4000/,可以看到City of Zion (CoZ)提供的neo-scan网页界面。
5 K# q4 ]* `, j6 k( j+ j7 A( W0 _. ?* c% X6 {6 b! I
5点击钱包地址(Wallet Addresses),你可以看到预存有NEO和GAS的钱包地址。部署智能合约的时候我们需要使用到这些Token。更多信息,可以查看 neo-privatenet 。
( f2 `& f8 c2 H+ c( y  C导入WIF密钥可以获取预存有NEO和GAS的钱包的密钥。 私钥/WIF 密钥 KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr 地址: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y 脚本哈希值 (用于检查): b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
' I; d- s& G' ]3 ~( t9 @  k; U* c这样你的NEO私有域和neo-scan就已经配置好了。
6 E+ d8 |2 R: U" M& S下一步,配置neo-storm。, Q1 _6 h% b* |7 Y8 r% O7 T9 y* T
1在终端中输入下面这几条命令, go version、dep version以及echo $GOPATH,确认一下Go, Dep, GOPATH都已经准备好。
, h& Q4 E4 d+ X8 t" M; @richie@Redbuntu:~$ go version
  o2 y2 q# t+ w. F$ `go version go1.10.1 linux/amd64" d0 A" r1 R, V" f1 t
richie@Redbuntu:~$ dep version
8 g4 `- ]; d4 u/ ^: x" G5 Cdep:
5 p8 y- U: {; i3 W) I8 Z version     : devel
2 s) p# k+ m5 t, g* c: i8 o build date  : ) G& \6 a' M7 F& r9 ?' u
git hash    :
0 c! [) P3 @1 X8 D1 g* F; Z* Q go version  : go1.8.3! c! ?: e2 n+ K7 h2 Z" V$ k
go compiler : gc/ V6 K. I$ D  Q& j
platform    : linux/amd64; b( U6 r* K) k0 K; Y& O' `+ W
richie@Redbuntu:~$ echo $GOPATH' g, N, m6 C; I4 X, @# J' T4 n
/home/richie/go
6 D* F* o! c/ T2输入 go get命令获取neo-storm,输入dep命令检查依赖包,使用make install命令进行安装。 *忽略警告信息
5 c9 f5 F" |! D0 ]- v2 `richie@Redbuntu:~$ go get -u
6 Y8 i4 E  k$ K/ Fgithub.com/CityOfZion/neo-storm, w0 Z: }5 ^% x7 N  p* O7 c: E
package github.com/CityOfZion/neo-storm: no Go files in* g- O$ W& ~: n7 y: Y2 @
/home/richie/go/src/github.com/CityOfZion/neo-storm" c, q) j  t% k3 \7 Q, ]
richie@Redbuntu:~$ cd $GOPATH/src/github.com/CityOfZion/neo-storm
5 a, V6 Z; {7 ]) e2 Yrichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo dep ensure( J. {8 @  Z# _8 Q" F" k' l
-update
* j/ |) G$ w$ b- Y4 |2 [) e) {4 @dep: WARNING: Unknown field in manifest: prune
3 J* u( d6 ^" C! M" R8 P2 A/ crichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo make install
$ _& }& G9 p9 m; f7 ^0 Kinstalling project dependencies. p- g+ x! V6 u- g7 A- n- `
dep: WARNING: Unknown field in manifest: prune
* H4 n, k, z$ _; S* ~3 p. |installing neo-storm framework
0 P. d. H7 V3 N* F  idone installing, happy coding!9 X4 E* b$ ]1 c+ v4 P
3现在neo-storm已经安装好了,你可以测试一下。" |/ M. o: {5 E. y" ]' m
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$, Y$ p: ?' J4 F; n  w4 ^5 E9 K
neo-storm( F) `2 x2 x/ x; S
NAME:1 h+ |+ w' {/ ~, S
   neo-storm - Neo smart contract
2 {- m* v% _( k6 Aframework for the Go programming language# c* X  H/ s* h: g
USAGE:9 a2 H& j( I- ~. ^3 E3 a
   neo-storm [global options] command[command options][arguments...]! ?1 m2 Q! m* u% _" V( h
VERSION:
3 k2 f! d1 m# _  c' s1 y   0.0.0
) P6 r- X& h. x9 U( SCOMMANDS:
- A; `  V" ]8 l$ p2 _1 I1 Y     compile     compile a smart contract to an .avm file: E( S, F6 Q3 n$ }& [7 i# {  o
     testinvoke  testinvoke a smart contract against a remote NEO RPC node6 S; {5 O3 ]: g( k1 Y
     init        initialize a new smart-contract in a directory with boiler plate code" ]( o) r/ R; c/ v1 ]4 R* T
     help, h     Shows a list of commands or help for one command
2 Y( _5 K! h2 j9 b/ R4 z  n2 AGLOBAL OPTIONS:
; V5 t% e# _/ }( d   --help, -h     show help
/ W. _$ z8 x  K" _: a: B   --version, -v  print the version! h$ ^, z2 f& |0 e
4“安装完成,开心编码” ——接下来开始我们的第一个智能合约吧。% V' H  P9 {8 U( ^$ _: n* K
richie@Redbuntu:~/Desktop$ cd ~/Desktop4 C$ _. f, P$ K8 N* r# q0 t
richie@Redbuntu:~/Desktop$ neo-storm init -n NeoStormTest
3 _) p1 l' J8 X4 J% h2 kSuccessfully initialized smart contract [NeoStormTest]
  e& f. E4 s' Y1 l' g4 grichie@Redbuntu:~/Desktop$ cd NeoStormTest/% g& j7 l3 y; s: j& V6 {* `; B
richie@Redbuntu:~/Desktop/NeoStormTest$ ls6 R' N1 [: J' ^( c$ H# v! q
main.go
& h- `: s+ ?8 H6 lrichie@Redbuntu:~/Desktop/NeoStormTest$ cat main.go
. S: z7 S. {' b$ u% e' xpackage NeoStormTest
+ g2 o" [, G1 S0 k1 X# F3 ^5 simport "github.com/CityOfZion/neo-storm/interop/runtime"
' n' W2 I3 z' V* q: afunc Main(op string, args []interface{}) {' s# e& n: X+ `3 U
    runtime.Notify("Hello world!")
4 X( `! l3 b& P% F0 i发行NEP-5通证合约) V) {1 w+ x" Y* Y
1要在NEO上发行NEP-5通证,我们必须遵守它的通证标准。 *改进的NEP5可以在Github上查看,它允许Token上线NEX交易所。
# R9 I; d( ]0 _- VNEP-5 Token Standard  {  r+ [1 J, H, ?
Methods
( l7 e# [: N2 F- C2 Y2 P& R-totalSupply()
; k4 ~- R# @  _6 i: l-name()
% U$ u( A: C3 v-symbol()
0 D2 J4 w2 u8 g- k. W-decimals()* Q* }! s  g* }, |3 W/ \
-balanceOf(account)
8 W- j7 c& j2 j4 b1 Y-transfer(from, to, amount)
$ i5 B- R* x" [% {Events
0 y9 I7 M4 _9 t$ x. U* }-transfer(from, to, amount)
8 ?, c9 ]& R1 I9 A, M! _0 o* ~0 z: dNEP-5(.1) by NEX
0 Y! K0 ~- m* _& }$ k4 p2 S5 EMethods
0 A3 n  K8 n6 c7 c7 y5 K-totalSupply()
- D+ k" [- _; R; b3 t6 H-name()
+ x  e0 U) P0 c  V* w9 j/ y3 o- d-symbol()
, F) d. S: A/ B# o-decimals()
+ M2 x0 S6 }$ [0 [-balanceOf(ctx, account)# y  J1 |4 W) q4 G9 F3 s
-transfer(ctx, from, to, amount, callingScriptHash)
2 u; H& q+ E8 D9 W5 e& t-transferFrom(ctx, from, to, amount)
& @% Z3 k4 ]' a; k# z2 }* ?-approve(ctx, owner, spender, amount, callingScriptHash)" {: A2 K  ?; Y4 b6 Y# d
-allowance(ctx, owner, spender)( ?* W8 f0 Z" ?- H  P: P
2不用重新编写一个Token合约,你可以fork/clone我的github仓库。
8 w' h, [6 I+ e& Q; y, H  ^richie@Redbuntu:~/Desktop$ git clone https://github.com/maplerichie/neo-go-nep5 MyFirstNeoGoContract
; t# u8 h/ z' Z* V' N# y3启动代码编辑器(我用的是Visual Studio Code),将~/Desktop/MyFirstNeoGoContract 添加到你的工作区(workspace)。Neo-storm的examples文件夹里也有例子,可以点击https://github.com/CityOfZion/neo-storm/tree/master/examples/token查看。' L& ~( f' Q* C$ X2 y

! H# \$ T/ a5 U/ Y2 q; fhttps://github.com/maplerichie/neo-go-nep5
: D4 j8 P( l: x  W! }7 \  z4编辑package,修改NEP-5的属性值,例如decimals, multiplier, owner Address, Name, Symbol, TotalSupply。% Z( S: z; V) I9 g* F9 @7 z
Package:应该将package修改为 package MyFirstNeoGoContract ,从而与文件夹名称保持一致。7 v/ |9 h( |8 C. A
Decimals:用来设置Token使用的小数位数或者Token可被分割的最小单位。
) C9 o. _! H$ o1 A% w, c例如:NEO的小数点位数是0,意味着它是不可分的Token。因此不能转账或者接收小数个NEO,只能是整数个。小数只能在交易所使用,因为它们创建了自己的十进制系统来方便交易。$ y* [  y0 x+ |6 Q# L3 L3 i
Multiplier:这给出了Decimals和TotalSupply相乘时的值。 输入格式为10 ^ Decimals。
5 @9 A2 `/ |0 L  E/ k例如: decimals = 6时,multiplier的值应该是10^6,即multiplier = 1000000。
0 X- l& d' B1 O' cOwner: Token发行者的地址。这里我们使用neo-privetenet的地址AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y。: n0 j5 U' q5 P7 Y' J
Name: 字符串格式的NEP-5Token的名称。
* j: W, e( D  N1 ?+ u+ x! A) m8 R+ mSymbol: NEP-5Token符号,通常是3个字符的长度,但不是必须的。
3 Y  h% G8 d4 N7 W' VTotalSupply: 总发行量。设置一个总发行量可以防止通胀。
) [# w0 G/ D! x% h* V' T3 z5 M0 \0 ?3 q, u' M- g
5修改参数同时确保符合NEP-5Token标准。然后使用neo-storm来编译GO智能合约。8 F, }/ ^- J* ~! Y5 T9 d
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ neo-storm compile -i main.go -o main.avm1 x3 @! c4 _" S8 ~
6当前目录下你可以看到 main.avm文件。现在neo-storm不会运行检查NEP-5Token标准。我的经验是缺少owner Address信息时,会显示错误信息。
% U  K9 N; Y4 g2 G2 {7现在讲NEP-5合约部署到Privatenet Docker。这么做之前我们需要先获取Privatenet Docker ID值,然后在主机上复制main.avm文件并粘贴进Privatenet Docker镜像中,然后将它附加到运行的Docker中。
* m/ ]4 S: ~! Krichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo
" L* f& `5 D2 G0 ]' ]- R( Vdocker ps$ u0 q# [! r  w
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                                                       ! `% ?  U7 }& F8 t7 o# H
NAMES3 s' a2 j! c6 F  B5 p
69c60667835b        slipoh/neo-scan             "/bin/sh -c 'sleep
+ ^7 P) b, b* S1 Y3…"   6 hours ago         Up About a minute   0.0.0.0:4000->4000/tcp                                                      " Z6 X$ o8 @/ X
neo-scan- W6 \7 u5 b3 W8 r
88b358cdd8ff       . v7 G/ j# a" }+ T  y
cityofzion/neo-privatenet  9 U/ @9 f- \3 H' d2 I2 |7 s- i: {$ K
"/bin/bash /opt/run.…"  4 ^1 I9 M9 ^: @' P, l
6 hours ago         Up About a
# @0 o2 G& L* }+ J  o! pminute  ' P8 A' f/ X) g  y' w' h) q
0.0.0.0:20333-20336->20333-20336/tcp,4 E" g8 t) g+ Z; u0 O
0.0.0.0:30333-30336->30333-30336/tcp  7 E* }' ^( W1 d. [% w
neo-privnet. q4 S5 M0 J6 g9 t
ab96dc398c62        postgres:10.1              
' x6 }1 l5 @3 ]( `"docker-entrypoint.s…"  1 f4 u' ^' e' {& u
6 hours ago         Up About a
+ D- {1 k4 D" ]( y; ]minute   0.0.0.0:5432->5432/tcp                                                      7 Z% m" P# m4 f: S
neo-scan-docker_postgresql_1* f! K0 O/ v5 A
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm
; q' p! `$ {  [88b358cdd8ff:/neo-python
, K, z% g) F4 xrichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it- ]9 Z& Q# `0 }
88b358cdd8ff /bin/bash
( R9 Y. {2 F: h  t*共识节点运行在在screen sessions,使用’screen -ls’命令查看
1 ^0 Y, M( [5 N5 ~0 C8 w*neo-python安装在/neo-python目录下,目录下带有a neo-privnet.wallet文件) i  u# c0 S5 ^4 b6 l
*有问题可报告给:https://github.com/CityOfZion/neo-privatenet-docker$ x+ }& P% G" ]& ~! a
8在Docker上,打开neo-python-cli终端并使用密码coz解锁钱包。
# @7 d& T3 x! V, O  S8 Z, wroot@88b358cdd8ff:/neo-python# neopy$ w6 }0 e3 e* t9 q6 R. m4 I; X
Privatenet useragent '/NEO:2.7.6/', nonce: 513759764' p+ `, A# Q& W9 U( O$ l1 H
[I 180914 10:34:09 LevelDBBlockchain:114] Created Blockchain DB at /root/.neopython/Chains/privnet, Q0 ~0 s7 r7 y" s. A) g# P# Z" \
[I 180914 10:34:09 NotificationDB:73] Created Notification DB At: l( e7 j" M( |, v- F$ M' {+ B
/root/.neopython/Chains/privnet_notif 1 Z% V$ V  S  L3 P! J
NEO cli. Type 'help' to get started
# {( b: L4 O0 k5 k9 [" p! Bneo> open wallet neo-privnet.wallet
( w+ N' K3 H1 A+ u3 f[password]> ***
8 A, R7 h: B( aOpened wallet at neo-privnet.wallet# q+ e, k% Y* y3 n0 h$ v; n
9部署合约main.avm前,使用neo-scan看一看钱包余额。6 g8 B: A& S! h: W3 ?
neo> wallet
! K* L( F# G: W[I 180914 11:01:22 UserWallet:538] Script hash
0 ~  C6 D: j, ?2 s1 hb'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9' ! Q, _! d; R8 c, r' h
Used 0.357 Gas + X- ]5 ?3 ?* Z  r% V& \
Used 0.357 Gas ; ]1 P) j$ E* t/ V
Wallet {
/ W7 T3 r% e9 Z9 w/ d7 b    "path":
  _" t- P9 M* m' F$ b"neo-privnet.wallet",
! Z% c# G/ e1 M& g    "addresses": [* Y' X& \8 R% A) s0 q; l
        {: A7 Q, T! g! D0 `# w* x' j
            "version": 0,8 D3 d3 N0 `& ?. \
            "script_hash":
8 J" ~, c  ]0 x0 n' o! ~; Z"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",& A5 p. ~9 k, M0 H
            "frozen": false,7 p0 O% L: c/ @( {
            "votes": [],8 x* ~/ I8 g" Z& B# f
            "balances": {
9 U  a* t; b8 s         , [. N+ y% d' H, K/ p5 T% K
"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":0 R) e2 b* M) s+ M# ?1 m
"100000000.0",0 e! M9 `/ n/ s* w  L
              
* r6 `: \6 w% l0 R9 A! ?"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
( P; p6 e" V, Y5 w2 T"74589.9996"# c! Q  P7 S, E; [7 W# A
            },
  R  Q5 G; F6 D! {& G3 M& G* Y            "is_watch_only":
) t1 P0 B* I& C0 T# W7 W  D( \: }$ k  X9 Wfalse,; R3 ?9 B0 O# I: R
            "tokens": [# _; O( Q) |9 u
                "[a3640dd3c560c75528e5f861da5da98958d0d713]
+ f/ y& e- j% ~; `) S# n3 L$ v  ~NXT2 : 2500000.00000000"
5 f/ z/ g% i3 |/ i) H            ]  Z" G7 p- J- p* f& m, h+ I" x
        }
+ [" w% g' g6 s$ }- _0 _# k1 j0 D    ],; ~! S: k. P+ O. Q
    "height": 10294,
" h4 F4 f2 S6 C  T* p& `    "percent_synced": 100,
# N' Z! u. M1 r! e6 w4 Y; Q    "synced_balances": [
+ Y# F! K6 A5 b/ Z. f* h        "[NEO]: 100000000.0 ",
9 Q+ C7 y) v3 r# Q& l$ j# I        "[NEOGas]: 74589.9996
2 a! I& b$ h0 J6 H0 F& [",; A9 D) w, h. ~0 K" _
        "[NXT2]: 2500000 "% j4 ?5 A; Z; y4 L) c/ A7 [4 w
    ],
6 G2 o5 B0 W7 u7 `    "public_keys": [
5 r4 `4 e5 y3 m. R  [. {$ j        {$ `4 l! Q7 ]# k! o3 r3 ]
            "Address":
% s% a* ]3 y6 |, m! j2 O" u"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
& F0 |  o/ p4 s            "Public Key":
# }- _) ]! a0 i5 F: T9 }4 J6 D"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
. y3 z3 l$ O; ~, n1 A4 b        }, y; j+ f, j" W5 e% v
    ],0 ~$ a  _1 d/ ?+ C6 w8 x# F
    "tokens": [
6 J* T- b% w) g7 ?        {
: \+ y- V/ Q. m) c            "name": "NEX
0 M1 z% x) p( t. f7 wTemplate V2",
2 f* S) X+ t. W4 H7 D! y0 \            "symbol":
* F7 {7 v+ x4 p; r; `2 |% s"NXT2",( r! D# ^  T9 E6 Q" ]
            "decimals": 8,; h+ N. ^1 }. t* l$ Z% S) Z. D
            "script_hash":8 k9 U6 ^" c9 u8 Y0 S
"0xa3640dd3c560c75528e5f861da5da98958d0d713",
6 G; b: @. j7 T/ A$ A1 M8 c            "contract_address":/ [5 c* s8 Z' h2 i
"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"* n  [$ O* e1 |' v( l% n
        }) Z  ~* x* _, u, o1 ?. v/ G
    ],3 t9 c0 S  f0 e; U8 ?% N. h
    "claims": {4 ~- F5 Z/ j1 M: I7 k+ t* R
        "available":
! {( I: C- O1 P0 ]1 ~  T"0.0",4 P" y4 E- R$ y! C* G* c
        "unavailable":$ N, |4 Y4 D6 U0 D& l; g; ?" T) N
"7730.0"
7 G" X8 I# w, K2 q$ [1 N, z    }
; E$ \2 t! ^$ i9 L5 E" a}! H6 l# }. K3 F# k$ a
10看来可以开始部署了。再次提醒,钱包密码是coz。8 n: U8 t0 [1 K5 N  M$ r
neo> import contract main.avm 0710 05 True False 9 X# ~1 S3 f) H! [+ {/ T( H
contract properties: 1
0 s5 V6 |8 P8 J# _8 uPlease fill out the following contract details:
% c* q* |$ Z1 q9 i2 I! x+ y[Contract Name] > MyFirstNEOToken
3 P" r/ n! V& ^3 y+ M[Contract Version] > 1.0
1 V  e, j, H8 b, [# @  X4 c4 \[Contract Author] > Richie5 X) o4 |6 D. m
[Contract Email] > babierichie@hotmail.com$ U7 \# f: M; j0 J8 M* F# s. h
[Contract Description] > First NEO Token8 J6 l8 ]1 z1 s+ P) T
Creating smart contract....
( G3 i, x1 l- z8 }7 H5 J- B                 Name: MyFirstNEOToken
6 t. F5 s9 k: ?+ x              Version: 1.0
/ E/ D/ R+ K$ n               Author: Richie
- N+ K! ?. e/ d                Email: babierichie@hotmail.com + f7 e* V9 ~' L2 n" m  B* s" ~
          Description: First NEO Token + N/ o$ |. R8 W
        Needs Storage: True
1 {- [- B0 k# q3 T Needs Dynamic Invoke: False ' J" c+ E% X" C4 ^& l5 U
{0 f2 q" w. k  y1 k& X1 c
    "hash":/ K" P" X1 O4 I' T2 g
"0x4e9b87c96158a8e2cc4b74794f727b38947e9862",
7 g+ n9 l4 c7 A/ a9 C    "script": "...",
' b- k# W0 S8 J% H    "parameters":
7 `2 d( p( D9 i2 V" N"0710",
$ M. D5 }4 }+ o5 m) }/ V7 t    "returntype":
/ e0 C/ |( ^& r8 X"05"
% X, H0 n, ]! S! G+ s}) x+ x$ n" b  p, A! K
Used 500.0 Gas
8 e* a# G  h7 ?6 s/ |-------------------------------------------------------------------------------------------------------------------------------------
3 Z3 F+ M. s+ k2 [7 OTest deploy invoke successful9 d; T6 h$ _+ J; ]4 g" R3 S, v5 T
Total operations executed: 11 # u" p( A6 r( u
Results:
7 w& E; }7 F  w  _) a, @+ }0 P[]. S' |2 ~& N9 Q$ F& j- v# ?0 Y
Deploy Invoke TX GAS cost: 490.0
8 }/ e6 T9 p7 S5 l9 r4 U' IDeploy Invoke TX Fee: 0.0 : v" Q- L; x$ }: @% J! C
-------------------------------------------------------------------------------------------------------------------------------------1 q7 M0 g/ o: L$ z' B( K- F, \
Enter your password to continue and deploy this contract) S4 Q: }* c* o9 r/ S7 l
[password]> ***
, {) R1 m  L% I[I 180914 11:03:33 Transaction:613] Verifying transaction: b'9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114'
' V4 i/ e: R3 Q+ B3 qRelayed Tx: 9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114# v, L! i  O2 c, L9 Q
11使用给定的哈希值验证交易。 注意:不同机器的哈希值是不一样的。9 Y" D- n) \; @; t
neo> tx/ b. `# [  j; Q$ ~
9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114
) ^" S. L- o* ^! q# Y% m* I{9 k5 F% v4 r$ C. f7 _. g
    "txid": "0x9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114",
# s. ]4 Y" v2 d2 {    "type":
2 q4 o4 h4 y7 Q8 M"InvocationTransaction",1 t, v5 W1 s' s" c5 d# d/ {
    "version": 1,4 |. H9 @' y/ X# J9 i6 g
    "attributes": [],- {5 [5 w/ v: `4 T) w
    "vout": [
" s" p% @' x" v  E        {
* T% @1 E9 B) e1 f            "n": 0,
1 @% v1 B- A0 |            "asset":
) z, @& S# }) H+ ]" O% P) b"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",) R. ^+ [% y6 d* }
            "value":% \# }/ l' x- N  {) B1 ^& J
"25493.9997",
/ ?( {; f+ S  P            "address":
% {1 V' C/ h, O/ ]( o) {"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"
# S2 y/ [7 \: Y/ r1 \' |        }
: C& I2 r9 g1 y; W' M; N9 z0 s    ],2 A  S0 e% z# v) u. Q
    "vin": [# x  N  i& K8 S; p& J
        {' [6 J% P' E7 q# ?' T
            "txid":6 F# b% ^/ V0 `) ]% J. v
"475a091ccaa6330320a29884f5f8796a260bdba91352dd409d16787b37d8be26",
* j: J* a+ \& F3 k2 w/ }! Y            "vout": 0+ i- ?7 J0 z8 }
        }
0 y. J9 }- [) N' f6 T+ s    ],
- g4 R9 Q3 Y4 c6 P' b8 X" _    "sys_fee":1 ^" w- @# @) B$ s7 q) h
"4.9e-06",
+ v' u5 F( F% m% A& {8 P+ K    "net_fee":; i8 d$ p1 k7 U2 {
"489.9999951",
+ @- I: i. @  m$ H  A1 e" F    "scripts": [6 C: l+ z3 l6 E) z8 k  O
        {5 D& R8 p: y2 p
            "invocation":* Z& _% u  T- A7 p+ ~
"40510fa6630ef581108057ebe967cd306522466a32eaf068cf3717da1e640b866246c013033e3c878ebf9247a5a3500178b21b126b3af63ed07a86b0d2c4f34c89",* r3 J# n) y+ n
            "verification":
1 ^/ q8 G+ V2 b7 U# R"21031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac"
. D6 q3 r6 C% Z; t& z        }
& h: f7 @: A! ?: `# k    ],8 }% }$ A. {' e& g# Z8 w2 t& _% G
    "script": "...",7 s' }1 m, K1 O$ H7 F. H) K! {6 L
    "gas": 49000000000,
' Q6 s! U- K, d, |: T( T    "height": 10302,  @. g$ }& [' _$ Z, S! f
    "unspents": [3 w* O  P: {. M* s9 L
        {
2 I5 W# t! z3 R& a            "n": 0,
% M9 \4 i/ e1 q) f* I8 @4 F" c            "asset":
- r" r, D/ o* R5 ~"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
& g. b( |$ `7 y& p/ d" a+ Y+ T# H            "value":
9 V4 b! S3 h5 Y6 R2 t  A"25493.9997",
3 G: Z7 P* F9 X- T8 ?, r/ |/ u            "address":; e6 w5 g* O6 e$ W7 U
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"0 A$ T3 J9 v3 _  o
        }
, [# b3 R, S3 ~0 w/ K0 x    ]
  ^$ Z: F+ A, [3 Q& U/ W" Z}
7 v# Q( G6 }/ U4 k12交易显示后,再次查看钱包余额。 在步骤9,我们的GAS余额为74589.9996,现在,GAS余额变为74099.9996。 因为这减少的490个 GAS已用于合约部署!7 x" G* ?* e3 H' q3 c' v$ e+ C9 B, H, w
neo> wallet
0 V6 j3 z% ^6 O: z% Z0 n[I 180914 11:18:38 UserWallet:538] Script hash
; H1 p' R' y3 V) I' sb'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
5 z7 X) p5 T& ^/ E8 r; M: \1 k: TUsed 0.357 Gas
. b9 b( `3 {4 Y& j9 |Used 0.357 Gas
& ~. H! H" U8 ^9 Z7 ^3 c. wWallet {
. A3 E# X2 r! e$ z    "path":
9 ^, u8 u4 _  m5 C9 S# w5 J6 C"neo-privnet.wallet",
8 J" R$ C  G/ k- E- t    "addresses": [, [" M7 @" L2 J( R6 M: \
        {: p4 W1 P5 v2 j/ Y. u
            "version": 0,
) j2 P4 c9 |: N3 e1 n            "script_hash":) @3 k0 i7 I) J+ X/ T9 \
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",8 n' S- s/ k0 N% o9 U! b8 d8 L2 l
            "frozen": false,6 {7 O& K" w3 E8 W8 \) n4 k
            "votes": [],4 S" U+ C0 g2 I( M; Q9 o
            "balances": {, @/ P% f2 f" ?5 J
               
& ^' W5 f0 Y$ y8 k5 s# g"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":( A8 }2 |) M* z8 ]5 U
"100000000.0",
3 u/ C# q5 m2 ]! Y0 V' a" [: c               
) j9 S# K9 V5 B+ ?5 N"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":  U+ f# M: r$ s9 S
"74099.9995"
$ @. }' U! H8 ?( a4 d            },* x4 l% ?$ |8 v+ {6 y  n
            "is_watch_only":
4 ~: Q3 t) \8 ]9 g% U8 \false,
# N9 G1 ~  k3 z3 V            "tokens": [- B+ K& x0 }5 |, [
               / z4 ?# t$ V9 Q% X( ?
"[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 :  i1 p3 z$ e1 N+ `; d/ C+ o5 U
2500000.00000000"
) @' ?1 w! B$ n4 X            ]/ P$ T; J) d/ D8 C
        }' C8 p; A2 Q6 z, H
    ],$ Y4 x; }" @' j1 W
    "height": 10348,
7 ]; V/ B; f  E5 @    "percent_synced": 100,* |5 ]" Y  W- B1 N
    "synced_balances": [
1 f) R+ i$ a6 ~) K) t# i        "[NEO]: 100000000.0 ",
1 Q& V, C, J  I        "[NEOGas]: 48605.9999
+ ^9 n& {$ o( n* Y1 u",' S/ H% [, K: T# b& Y
        "[NXT2]: 2500000 "
; H+ G3 b6 f6 g+ m    ],& W, O' P8 j9 Y1 K5 r  [) @
    "public_keys": [
  |) j) h; ?  K# Y+ J        {
9 ]& j  L  B) A! }, P$ t2 u            "Address":
8 [+ b1 X1 k; R0 J: C# D  k) L" y"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",' p$ o/ S- f, }
            "Public Key":  s5 K. X0 a" F6 i0 S2 L
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"4 P/ L/ O6 [& `& ~
        }
: L1 Q/ G) _. x    ],
1 B* ^) r3 P- P! K" j    "tokens": [' X, H9 s5 r+ ?, Z' I& R
        {
& B  D8 H, j# Q" L; b$ _            "name": "NEX
9 ^1 @6 c& F- H7 OTemplate V2",+ ?; w8 a/ @8 I
            "symbol": "NXT2",
! b. U$ s6 T, P9 d            "decimals": 8,$ L# j2 s: g6 e3 C3 M1 e' \- q
            "script_hash":
( \! S3 |8 t: x7 r7 ["0xa3640dd3c560c75528e5f861da5da98958d0d713",2 V* e: Z7 G; I0 E
            "contract_address":
2 p) |' ?8 E* f! ~( E"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"- ~; c; B. [/ D0 A- y; L
        }
3 U' ~' `0 v7 ~    ],3 n+ V7 |, N6 Z* N" K6 d
    "claims": {& N0 u/ ~6 n9 w- q
        "available":
7 r; i2 i' k; q6 l! h"0.0",
2 `6 u0 @" Z, Q! V  V: i# G        "unavailable": "8652.0"
2 ~2 F0 s! R3 o2 H$ G    }0 z  }% \- Z5 J5 G+ h: f9 z
}
5 s7 H! C$ I# T4 M) H我们也可以看一看部署好的合约。
- r8 C, i9 K; v6 F4 xneo> contract search My1 _2 ?0 z, Z( z& E' k5 @; `! b
Found 1 results for My* s8 p! d# k; r! Z
{
( P2 i$ B( E3 c9 E& r! S    "version": 0,
* L& J# }. g( e$ p0 W  q; s: B    "code": {4 g( H* m$ j' c/ ^" E
        "hash": "0x4e9b87c96158a8e2cc4b74794f727b38947e9862",
1 G' ?2 @$ e$ n! R        "script": "...",5 z: E2 Z, C7 W
        "parameters": "0710",: C+ s3 U0 a/ O4 i5 ]1 ]
        "returntype": 5
! d/ Q2 n3 X) C# R9 z/ i    },
% D- c2 \, h4 t1 s    "name": "MyFirstNEOToken",& T* ~/ g8 }6 M8 l, Y1 ^% h
    "code_version": "1.0",
7 G& R% Z" L0 e1 ?% v1 I    "author": "Richie",
/ U' E! F# Y/ @+ f9 W% a    "email": "babierichie@hotmail.com",2 k1 A9 m* R! C: z4 S! q( u
    "description": "First NEO Token",  U% ?. s% A6 a& N1 u; \+ y9 F( w- q
    "properties": {
- ^/ E% r- U* u. f! n* k* n0 i        "storage": true,
0 e2 r. c/ w0 e, s- U        "dynamic_invoke": false+ w; d6 g: |2 d8 y, J+ o& z
    }
$ m  `! `, u- }& f+ D) v/ e}$ F5 g1 c! ~; _1 m
13最后,我们可以尝试使用钱包的密码coz,来调用这个带有合约哈希值的Token。
4 u- `+ N* T, U0 T& Cneo> testinvoke8 ?+ i$ D+ A% E0 `: Q/ S0 a' H
0x4e9b87c96158a8e2cc4b74794f727b38947e9862 deploy []  k2 R3 T4 j  S9 W  `. X
好了,现在你已经在NEO的私有域上成功的发行了NEP-5Token。: o6 h8 ?' y' N4 J& {, W. c# E
最后
" F4 ]/ ~! G0 F4 g5 \6 n; P7 c希望对于Gophers来说,能很轻松地照着本教程学习。也希望GO开发人员能加入 NEO’s Discord,一起开发学习。你一定要试一试!
  b" E6 S+ L& l# S4 s如果您真的需要我的帮助,请在Discord上联系我(LikKee.Richie#5647)
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14