Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
介绍; Y' f8 w4 B% m- P7 a. L8 ]
开发语言
2 h9 m2 V8 h0 y' f. f$ B4 ~在NEO智能合约开发平台进行开发的优势之一是平台支持各种开发语言。; g( R2 j/ P0 y! H9 I$ U, L6 p+ F
NEO推荐使用C#语言,不过它也支持使用Python, Java, Go, Ruby,之后还会进一步支持Kotlin, C/C++, JavaScript等开发语言。.0 C1 C6 {' `' p% t& ]& {0 g
尽管支持多种语言,但我们仍可以发现现有的很多项目使用的是C#、Python、Java,使用GO语言的并不多。因此,参考City of Zion (CoZ)上的资料,我想尝试写一篇关于使用GO语言开发的简单教程,希望能吸引更多使用GO语言的开发人员参与开发。4 U  `& l* m7 Q7 g. h# j5 u
给GO开发人员的建议7 I+ @: E( D' B- X" R" c; L0 B* [
无论你是编程新手还是经验丰富的开发人员,刚开始时都建议你在私有域或测试网上进行开发。
9 J( J5 O. X! i5 I/ _为什么?/ Z7 ^$ r) {; O5 g4 J
因为在主网上部署NEP-5 Token需要消耗490个GAS。
5 j: [2 z: e& R& {$ E写这篇文章的时候(2018年9月15日),GAS的市场价格是5.8美元,那么该笔费用就高达2842美元。对于任何创业公司而言,这都是一笔不小的费用。
! H0 @6 a; N/ ^8 b1 A- I7 Z7 U按照GAS的历史最高价,每个Token的价格为95.87美元,那么仅仅部署一次智能合约,你的成本就要增加4,7000美元。
: D9 M1 H, r$ k& r9 j$ P因此,刚开始开发的时候,建议你在私有域或者测试网上操作,当你准备好之后,再转到主网上部署合约。
+ O/ @3 w3 Z! \* `要求' ~  F, |" Z* y5 J; c7 i
本教程中,开发环境的需求如下所示:
/ u: z2 d# f. c操作系统 – 桌面版Ubuntu Desktop 18.04.1 LTS! C' j- t1 {, c7 X
Git 命令行接口 –Git
3 b7 p, y3 o& g* A语言 – GO语言
! `7 e, `, L) X" h" [Go语言依赖管理工具 – Dep
0 [9 X& O' K* V0 f% Q' K& fDocker –Docker CE 和 Docker Compose* N9 j! ?5 a4 u1 S$ ?( e8 @1 F
编辑器 – Visual Studio Code, Extension: Go4 r' c# K6 t8 O+ m7 L1 X
使用到的NEO的资料
* Q4 W! w4 O# [GO语言智能合约框架 – neo-storm
! |1 Y( o0 p0 y5 `* R预建好的使用Python语言编写的neo-privnet-with-gas以及nep-scan镜像 –  neo-scan-docker
1 ^! `8 M' q; W6 Y8 m+ b重要提示:结果可能因NEO编译器和节点版本不同而有差异。; E& C. i8 B& f$ {" B
本质上来说,有几种方法可以运行私有域,例如使用 neo-go 或者 neo-privatenet-docker。 但是,在本教程中,我们会使用slipo编写的 neo-scan-docker。 neo-scan-docker是用neo-python构建的,所以它带有一些“Python”组件。 此外,它还带有neo-scan的UI,允许您分析智能合约的部署事务。! k+ R; J- M1 {  f9 z  i
*安装方法可能因操作系统而异。 相关的详细信息,请点击上面的链接查看。
; U# I( Y0 K4 b9 [8 t) j3 M配置你的环境: l0 g1 V0 u. w9 _  @* S- _
首先,我们先用 neo-scan-docker来配置一下NEO私有域。
% U3 s; g% Z1 c1 检查一下Git, Docker and Docker Compose这些工具是否已经准备好。) X4 M" ?' h7 l! n' ]% C* |
richie@Redbuntu:~/Desktop$ sudo git --version
/ W5 [0 Q: Y. }9 C3 v  A: u5 Y0 ngit version 2.17.1
; J% b; n6 J; S+ I) hrichie@Redbuntu:~/Desktop$ sudo docker -v
5 V3 r( M4 ?; w9 h+ h+ rDocker version 18.06.1-ce, build e68fc7a0 K/ o2 J8 u) ?, l  ?6 ]. a, W5 z
richie@Redbuntu:~/Desktop$ sudo docker-compose -v0 S& u! D) V& }7 N1 h( I  H
docker-compose version 1.22.0, build f46880fe
2 a- G( V8 u/ Y) ~, `2克隆(Clone) slipo的 neo-scan-docker仓库代码,并使用 docker-compose来加载Docker镜像。 下载镜像可能需要点时间,请耐心等待done状态的出现。8 E; A7 y8 u7 M
richie@Redbuntu:~/Desktop$ git clone https://github.com/slipo/neo-scan-docker.git# h: d, m4 b" R
Cloning into 'neo-scan-docker'...6 G5 \0 N8 B/ _8 {' }
remote: Counting objects: 27, done.
: I0 j% Z4 d  G) D# k4 }. B$ {remote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27+ S9 c; q4 L- \: C+ }( H7 w7 p- e# n/ C
Unpacking objects: 100% (27/27), done.
: g) y# k0 H& Z) a8 ~$ A2 Crichie@Redbuntu:~/Desktop$ cd neo-scan-docker/
$ }2 }1 p1 J  u8 `' A9 ~2 D7 Drichie@Redbuntu:~/Desktop/neo-scan-docker$ sudo docker-compose up! S& m& x* R- b
Starting neo-scan-docker_postgresql_1 ... done
. G% \! E7 L2 F) O6 U- AStarting neo-privnet                  ...3 o. y$ r  ~2 m0 M
done. b" F+ ]8 ?* z, t6 @. r8 t0 o
Starting neo-scan                     ...# X; A& a8 ^5 r) Y
done0 }$ G6 Y2 _0 U
Attaching to neo-scan-docker_postgresql_1, neo-privnet, neo-scan`
8 M9 ]' B. L% f. L+ D, J3 @3在你的主机文件中,添加127.0.0.1 neo-privnet。注意:主机文件的位置可能因操作系统而异。
& P& y% d* O& o; s8 ^3 |Unix/Linux/macOS - /etc/hosts
; K, D3 k. \' c' f' I# ?Windows          - C:\Windows\System32\Drivers\etc\hosts`
2 ~3 p/ r! s7 i. B/ N6 L; U+ o1 X4在浏览器中输入http://127.0.0.1:4000/,可以看到City of Zion (CoZ)提供的neo-scan网页界面。
% {, D+ I% z4 ~" m7 V3 `1 C* W2 ?  o/ j. e5 Y; V
5点击钱包地址(Wallet Addresses),你可以看到预存有NEO和GAS的钱包地址。部署智能合约的时候我们需要使用到这些Token。更多信息,可以查看 neo-privatenet 。4 k3 @$ `# c. d! J' i( i
导入WIF密钥可以获取预存有NEO和GAS的钱包的密钥。 私钥/WIF 密钥 KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr 地址: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y 脚本哈希值 (用于检查): b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
* {8 ~9 E1 N, E* g这样你的NEO私有域和neo-scan就已经配置好了。- b/ t& D$ o% [2 j% j( u
下一步,配置neo-storm。1 L; q/ ^4 f7 a
1在终端中输入下面这几条命令, go version、dep version以及echo $GOPATH,确认一下Go, Dep, GOPATH都已经准备好。
" V) y. r* Y3 Krichie@Redbuntu:~$ go version( B6 ~! `$ R: Z9 `  a8 F
go version go1.10.1 linux/amd642 H% m' S5 l% D$ O5 |
richie@Redbuntu:~$ dep version
9 T) P; m  Z+ K$ k) tdep:
4 a3 @3 R/ t2 @! D+ d# i version     : devel9 _* l2 Q' Z) p- w+ e7 W8 c
build date  :
; B: g8 e5 e6 ?7 V& R  z% H% V git hash    :
8 n1 y( a! w) s8 X3 i) V5 ?3 ] go version  : go1.8.3! i8 c3 B( r  c4 Z
go compiler : gc4 p7 H# ?- B" e! a
platform    : linux/amd64
5 S1 ]2 L( l& S! e. Q& |richie@Redbuntu:~$ echo $GOPATH
$ |& c. |7 P2 |) E( Q5 A/home/richie/go
0 [& Q/ X. e/ _1 l2输入 go get命令获取neo-storm,输入dep命令检查依赖包,使用make install命令进行安装。 *忽略警告信息
: D5 m# \: u$ q8 s/ mrichie@Redbuntu:~$ go get -u
& {7 t  J# i- M; H  r* r) Tgithub.com/CityOfZion/neo-storm- }# J  w# d7 d$ X9 L+ i  I1 S
package github.com/CityOfZion/neo-storm: no Go files in. w( H5 T% v% X: P7 h
/home/richie/go/src/github.com/CityOfZion/neo-storm
9 R& ~) ?# j0 j/ |3 [6 Z$ @richie@Redbuntu:~$ cd $GOPATH/src/github.com/CityOfZion/neo-storm# r7 c- j, z7 x. L5 A0 N& D
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo dep ensure
) f! |+ S0 `& V0 v7 d3 s! W2 U, r-update9 M# U: C5 k; p9 L, _
dep: WARNING: Unknown field in manifest: prune( @8 e) L3 j3 K4 J1 j3 f
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo make install
3 ]- j" }7 W7 \installing project dependencies( E+ P8 Z1 q/ a5 b' i: W3 m
dep: WARNING: Unknown field in manifest: prune# P5 u# [5 @, V# \) \0 V
installing neo-storm framework8 g; x# ]4 E( @$ u2 Z% b9 w; r
done installing, happy coding!
& b5 r  c  U+ |9 L; l3现在neo-storm已经安装好了,你可以测试一下。
0 X( ^  i8 o9 p  ]! a3 ?6 Y2 frichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$
' e; S4 @2 b5 ?' l" [" [neo-storm
4 o+ l! f- M& r0 h9 I9 [8 Z9 DNAME:5 x* v0 B! u+ Q3 {7 L1 }7 u* z/ P
   neo-storm - Neo smart contract
6 }6 I0 V! v4 P1 Zframework for the Go programming language7 Z& T4 |: C5 x1 ^! F$ J# x
USAGE:
3 |* l. A' a' D( h: l   neo-storm [global options] command[command options][arguments...]
, f) e0 E  y* S4 vVERSION:
8 @1 @7 ~6 T! F1 b8 t   0.0.0
7 e+ d! L* C/ ^' ZCOMMANDS:
+ r- F0 [' L; D* }% q     compile     compile a smart contract to an .avm file$ u4 l8 u; a9 Q
     testinvoke  testinvoke a smart contract against a remote NEO RPC node
/ z" d9 l* y( B; n( x     init        initialize a new smart-contract in a directory with boiler plate code  p/ Q9 \% S, l/ u1 R% @
     help, h     Shows a list of commands or help for one command
+ W  ?/ P- W! B6 y: m: Y- iGLOBAL OPTIONS:
7 p! I+ Q+ Z" L$ G# ?# N   --help, -h     show help6 M5 h% r9 z6 ]& z0 w
   --version, -v  print the version7 ^. E% M2 J6 X
4“安装完成,开心编码” ——接下来开始我们的第一个智能合约吧。+ u1 ?0 M3 R7 j9 j
richie@Redbuntu:~/Desktop$ cd ~/Desktop
. E' {: d$ c1 `1 h( Rrichie@Redbuntu:~/Desktop$ neo-storm init -n NeoStormTest
6 o' y4 ]1 z! b) |6 z1 W+ @Successfully initialized smart contract [NeoStormTest]
4 u+ A3 ?# }/ X1 Hrichie@Redbuntu:~/Desktop$ cd NeoStormTest/
+ A* i2 D, P) |9 Z5 Yrichie@Redbuntu:~/Desktop/NeoStormTest$ ls  M7 h& `  x. x6 [' G
main.go
! p, k# @9 w: r. j. |" Z, {( Frichie@Redbuntu:~/Desktop/NeoStormTest$ cat main.go: O0 F! f$ x+ h/ h3 p3 @
package NeoStormTest
1 {. c; N/ ]3 U- V' ^import "github.com/CityOfZion/neo-storm/interop/runtime"
$ I/ F+ ]6 ~) Gfunc Main(op string, args []interface{}) {
* _+ @# p7 f0 a* O5 @( M5 q4 T0 l3 X    runtime.Notify("Hello world!")  [" s+ s) I7 `( W, q, [
发行NEP-5通证合约
( {/ h% X+ f3 a1要在NEO上发行NEP-5通证,我们必须遵守它的通证标准。 *改进的NEP5可以在Github上查看,它允许Token上线NEX交易所。' D) M* j/ c/ P0 w* m
NEP-5 Token Standard* L1 K1 S5 n( k4 D
Methods" i: @* `8 y4 o$ {5 u! b& M5 ]( y& n
-totalSupply()
% h! [& r& `/ R+ y! h, n& D/ F+ G, a9 S* t-name()
+ u3 e, i1 _0 E: g/ V! j/ g8 v-symbol()
0 ]& K# K; s/ i  m5 X% m8 F8 Y7 L-decimals()3 G, x3 E) V( _
-balanceOf(account)
! c3 `# l3 X# m& t; J  }-transfer(from, to, amount)
& g$ l1 y6 v2 O+ l7 J" wEvents4 k# T* E+ m2 G5 T* H3 R% n
-transfer(from, to, amount)8 F# j" B7 H0 @+ t! ~/ B
NEP-5(.1) by NEX7 _( x" n6 V* R! k
Methods
$ \( L2 j1 n( k9 a% H. J3 I8 [) h-totalSupply(), Q) g  j5 p2 ~1 m! R
-name()
5 U8 n% M! F0 c# g" X! J-symbol()- L. }7 X" H% M
-decimals()" Q1 q6 K8 }9 j3 J, Y* U  S; D
-balanceOf(ctx, account)4 B9 R2 Y' V, s( ^1 J
-transfer(ctx, from, to, amount, callingScriptHash)7 P, Z9 O& y. R: P
-transferFrom(ctx, from, to, amount)
0 V8 W1 h5 q! }- [-approve(ctx, owner, spender, amount, callingScriptHash)
  T; w& b# r: }  c# U5 X9 c4 {1 d-allowance(ctx, owner, spender)
! _- I0 ]7 ]3 v# w, L2不用重新编写一个Token合约,你可以fork/clone我的github仓库。
5 j+ k3 ^, ?/ @5 k4 y5 ]7 S5 Frichie@Redbuntu:~/Desktop$ git clone https://github.com/maplerichie/neo-go-nep5 MyFirstNeoGoContract
5 w3 y7 O* u3 v: j( B3启动代码编辑器(我用的是Visual Studio Code),将~/Desktop/MyFirstNeoGoContract 添加到你的工作区(workspace)。Neo-storm的examples文件夹里也有例子,可以点击https://github.com/CityOfZion/neo-storm/tree/master/examples/token查看。
4 A- ?* M, Z+ G" A4 C; T; n4 f0 Q
. |# d, w, i- dhttps://github.com/maplerichie/neo-go-nep5( N4 Z/ g5 S5 i# V1 o2 q
4编辑package,修改NEP-5的属性值,例如decimals, multiplier, owner Address, Name, Symbol, TotalSupply。6 R# T$ i2 y! c7 }( l6 j2 m
Package:应该将package修改为 package MyFirstNeoGoContract ,从而与文件夹名称保持一致。5 Y- m: G& Z2 ?$ b% j& J
Decimals:用来设置Token使用的小数位数或者Token可被分割的最小单位。
* E% r% @# }/ d/ L例如:NEO的小数点位数是0,意味着它是不可分的Token。因此不能转账或者接收小数个NEO,只能是整数个。小数只能在交易所使用,因为它们创建了自己的十进制系统来方便交易。
  N9 Q0 A) {4 }* q7 i% C/ [Multiplier:这给出了Decimals和TotalSupply相乘时的值。 输入格式为10 ^ Decimals。
8 H9 V; y. Q3 W  V0 t( ^例如: decimals = 6时,multiplier的值应该是10^6,即multiplier = 1000000。
$ M' X/ a* C+ f0 ]Owner: Token发行者的地址。这里我们使用neo-privetenet的地址AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y。
  P- q9 t7 v0 t; dName: 字符串格式的NEP-5Token的名称。
8 Y0 T' I9 X, {. `4 bSymbol: NEP-5Token符号,通常是3个字符的长度,但不是必须的。& V* j8 m' M6 A5 j4 [. _) }
TotalSupply: 总发行量。设置一个总发行量可以防止通胀。! P6 r6 [+ W% ^) R" A
# M* ^: Q: q. J6 t/ q% v
5修改参数同时确保符合NEP-5Token标准。然后使用neo-storm来编译GO智能合约。2 t. }; Y; A! x- h
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ neo-storm compile -i main.go -o main.avm
: k1 ^( Q8 |/ d$ b  l/ k6当前目录下你可以看到 main.avm文件。现在neo-storm不会运行检查NEP-5Token标准。我的经验是缺少owner Address信息时,会显示错误信息。
2 X( {- N4 h5 G' K/ ]. U7现在讲NEP-5合约部署到Privatenet Docker。这么做之前我们需要先获取Privatenet Docker ID值,然后在主机上复制main.avm文件并粘贴进Privatenet Docker镜像中,然后将它附加到运行的Docker中。9 q/ H5 _! A$ l( X6 G) c1 ^/ [
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo
# t1 x; ^& h3 C8 G; L2 jdocker ps$ A5 c1 z3 i- B% Q4 F, }
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                                                       9 z% C2 D" `, j1 i% o; Z) [
NAMES& q3 @" b( [7 V9 R* v
69c60667835b        slipoh/neo-scan             "/bin/sh -c 'sleep; f  A/ `9 A. H" z
3…"   6 hours ago         Up About a minute   0.0.0.0:4000->4000/tcp                                                      3 {8 _# x  d' E. `& G' s0 X8 Y
neo-scan
: T7 I2 Z) i. ~2 h( \5 P) y& D88b358cdd8ff       ! ?5 M$ O0 ^# E! q
cityofzion/neo-privatenet  
% ?3 ~- p/ g6 ]% M4 E2 H"/bin/bash /opt/run.…"  
" X) ~" o! G- _$ |& u) S6 hours ago         Up About a! l. Y. L/ K! C( l- }6 t3 e6 j
minute  
7 e! h$ ^$ \( p. [) b/ ?0.0.0.0:20333-20336->20333-20336/tcp,
- @* C: G2 y+ S5 \0.0.0.0:30333-30336->30333-30336/tcp  ! y% v! g: M4 n' a( g+ R
neo-privnet( e% J$ n$ u5 _; `! a- u
ab96dc398c62        postgres:10.1              
+ X6 |+ d8 T9 H"docker-entrypoint.s…"  , ?& {3 h* E, _
6 hours ago         Up About a$ @- h9 I# x; ]
minute   0.0.0.0:5432->5432/tcp                                                      / ]/ e4 _5 I# o* Q4 ~% h' f8 p
neo-scan-docker_postgresql_1
$ W7 c9 d; E1 r! Qrichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm
: a, x5 F9 z3 p0 J9 W: t5 E9 m88b358cdd8ff:/neo-python
, x1 L" P9 ?5 Jrichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it) [% a* R  `8 d3 H7 O5 i$ a
88b358cdd8ff /bin/bash. O( u3 a3 x7 W9 k7 K. e. b" |3 G
*共识节点运行在在screen sessions,使用’screen -ls’命令查看7 h  A3 j0 I, G3 M
*neo-python安装在/neo-python目录下,目录下带有a neo-privnet.wallet文件
4 I* M, a7 m/ y  X*有问题可报告给:https://github.com/CityOfZion/neo-privatenet-docker
" j; e0 I. I- u# `8在Docker上,打开neo-python-cli终端并使用密码coz解锁钱包。
# V+ Q  S( `+ D  t! {8 U" w# Vroot@88b358cdd8ff:/neo-python# neopy, k8 S+ C, G0 o" y, U" H# x) o
Privatenet useragent '/NEO:2.7.6/', nonce: 513759764$ _9 z9 K( b0 q4 M  ]* |) y
[I 180914 10:34:09 LevelDBBlockchain:114] Created Blockchain DB at /root/.neopython/Chains/privnet
  b- N! _6 h0 v# V, f) B/ C/ Y[I 180914 10:34:09 NotificationDB:73] Created Notification DB At' _8 u8 W7 |! k+ s9 ]
/root/.neopython/Chains/privnet_notif
; |3 |) t: [' _' o, hNEO cli. Type 'help' to get started
7 C; Y9 B) f) z0 s4 o9 |9 \1 |neo> open wallet neo-privnet.wallet  V  {! k8 t( }% i6 R5 w/ s/ f. I
[password]> ***, S' h; c. w. i% G% P- v% X; f
Opened wallet at neo-privnet.wallet4 }" m$ |* q  k5 y
9部署合约main.avm前,使用neo-scan看一看钱包余额。$ _. R: h$ p5 Y1 W8 J5 `
neo> wallet
) E# d4 o/ z7 I! Y& m" ~[I 180914 11:01:22 UserWallet:538] Script hash
0 X) k4 x  B% i5 Tb'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
; h6 o% I  D' R" A3 D4 G% IUsed 0.357 Gas
2 G  j! t1 @" @% ^& \3 ^Used 0.357 Gas
" p% {) E8 Q" {3 B7 \Wallet {3 o6 T$ m1 a; |- v1 T7 b- P
    "path":/ M- `  r* x, v1 W+ l+ A  v% E
"neo-privnet.wallet",
& p1 s3 ~! }: x/ E+ S& ]    "addresses": [* C" g6 x$ h* G, y
        {0 p- [8 t4 Z/ D" L8 L0 k7 O
            "version": 0,
) B! N- ]( D; d2 A+ U7 ]9 |" [            "script_hash":9 U2 Z. _( E1 z, u& z
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",$ [2 Y3 h4 \) Y. R$ w
            "frozen": false,
9 N! G8 b6 [6 g% y* ~' c            "votes": [],
& g! m! C! @# @8 W% b/ P            "balances": {
  w* x1 ^$ I1 i( D/ J0 S         & ^. J$ G4 ]+ h4 ?: g9 q$ M3 s
"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
, R( x+ k( h3 u7 ~. p"100000000.0",
# t& X. ]" O5 U+ G( h              ' k  p' ^9 n1 l( ^  e' S+ t! m2 a6 y
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
5 h8 T5 W6 J& z2 p"74589.9996"+ G3 u1 \3 {9 o7 h# e) M/ p
            },
0 l; {5 W, r8 A& h  i: y9 ]. P            "is_watch_only":& o, i) b5 c: V  E6 w
false,* f" U% ?* K& S0 {; q+ @
            "tokens": [
- z- O, V" M: r                "[a3640dd3c560c75528e5f861da5da98958d0d713]/ r7 y( S3 ~( H. N% m9 a
NXT2 : 2500000.00000000"
  l! b" b' `5 j6 X2 O8 A, D) n            ]$ Z3 R& m4 @$ y9 ~
        }, ~8 Y4 L" z. W5 p7 m  X. m
    ],( f6 D0 z# i3 K$ [+ }5 N* M& O/ m
    "height": 10294,
$ A& C- I* G  g/ E0 w& o& _3 c2 {+ e0 Q    "percent_synced": 100,, g5 P$ h$ T5 P7 y' ^0 t
    "synced_balances": [
, L- a) l  b7 k: X9 L) E        "[NEO]: 100000000.0 ",. C' {4 `  E; z) [! ]9 K
        "[NEOGas]: 74589.9996
: n3 ~5 m/ u" i+ a+ U",) b( I0 y: r; B4 c" @) p
        "[NXT2]: 2500000 "2 a0 f% \& i, h0 Y# O; V2 r
    ]," S+ C3 h4 X# L+ K8 D
    "public_keys": [" T+ P$ n9 a1 t7 W9 X
        {
4 m9 Q% ^% x1 l# x# I. H            "Address":5 g0 {5 [9 \6 M* Z
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",* t9 l; Y7 A+ \: j. G3 W; N
            "Public Key":$ c4 q* Q, |0 \
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
! c3 t* o, h2 A0 j8 o        }5 d, t* c) r3 |* I
    ],
' d# Y0 |5 `' _' |; `1 x) H    "tokens": [
6 f, \& {6 B8 M* `  [; Y3 E( l        {
8 D# c: R6 E' E            "name": "NEX/ _% Q0 V& q4 ?
Template V2",6 i7 ?9 l5 F5 z4 k6 S4 u
            "symbol":6 [5 b: [: h* @" x, Z' w+ x
"NXT2",
7 b1 T, B9 ]' a            "decimals": 8,, x' c  J+ a9 G; h7 ?& L. T. Y
            "script_hash":
% w! I9 g8 O% T5 r! f2 x"0xa3640dd3c560c75528e5f861da5da98958d0d713",
; B4 U# q! l1 i$ E+ i+ e6 I            "contract_address":& b% U% d1 S8 R* [5 p7 F+ r
"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"' L/ s+ ?0 A5 k  W
        }: O  @3 r0 s5 @2 Y- ~2 Q; d2 C: M
    ],, s7 h) M( V" i# I2 p) R
    "claims": {3 X  A" u- g- P
        "available":
2 y% J0 V0 A+ Z4 h4 U6 T"0.0",
6 @! V) Q; X7 _6 [4 U% U+ N        "unavailable":
' M( Q4 W0 @- v; _6 U% u4 g"7730.0"4 m6 b( g) c. S0 a% f3 `  `
    }
% F  K2 |6 q. v}) j) k8 Y( P! f! U0 u
10看来可以开始部署了。再次提醒,钱包密码是coz。
$ ^& |* m/ K! }( B$ tneo> import contract main.avm 0710 05 True False 2 t  [/ k. D5 G7 M( U/ R
contract properties: 1
) C( ?+ i2 V/ G2 Q/ o6 RPlease fill out the following contract details:2 X* ?$ M, N  P- y
[Contract Name] > MyFirstNEOToken
, ~5 c  O$ C' t8 N% w1 C[Contract Version] > 1.00 Q. q  S7 ^3 }' p( A5 X
[Contract Author] > Richie- v: U9 J* K# v* A6 H4 x
[Contract Email] > babierichie@hotmail.com
+ }# p% i3 }* S1 ~3 z[Contract Description] > First NEO Token! b6 j* e* N& v" e7 Y9 F
Creating smart contract....
& v' `8 X) p- J. z- z                 Name: MyFirstNEOToken ! u; J- m) w9 ?3 j
              Version: 1.0! E/ s) z: r5 T! y( `1 [
               Author: Richie ' z% v" P1 L1 n% c
                Email: babierichie@hotmail.com # k4 W; o, j0 ]  `! [7 y, f# Q5 l/ n
          Description: First NEO Token
, i, q1 {1 o1 f4 |. i        Needs Storage: True
4 r" a" j; V& Q Needs Dynamic Invoke: False 6 U5 c" j$ ~, S. a$ a
{
, X, N; t3 n1 k3 c    "hash":3 N2 j' Z8 x* f% {7 \8 S7 Z9 o
"0x4e9b87c96158a8e2cc4b74794f727b38947e9862",
  M5 }' |+ u+ \  {7 V" A3 W    "script": "...",: y" p2 M/ X# p, b3 ~9 S1 y0 \
    "parameters":% X  C: t* `* \' R
"0710",
' F( z3 ]6 ?7 O/ D    "returntype":
5 b- G9 ~% v! N2 Q; i2 D"05"* S( A. s& E4 q7 P. M
}
8 T! J6 Y( Y) X- z/ @  g- E, Q+ T7 VUsed 500.0 Gas( Z) a5 R1 f6 E' m1 X
-------------------------------------------------------------------------------------------------------------------------------------
0 ?4 |# \* I0 j4 l% ~( VTest deploy invoke successful
4 g' m$ R6 j+ j( dTotal operations executed: 11 . F5 E2 v! p! O' A( [7 O- n  L
Results:7 D% c2 |$ N& @
[]
; R! k4 X/ b' ~) Q- _Deploy Invoke TX GAS cost: 490.0 + Y9 f4 w& H' a# d$ f8 J& K
Deploy Invoke TX Fee: 0.0 9 ~( z* s3 r" n7 M6 I0 P, P
-------------------------------------------------------------------------------------------------------------------------------------
5 ]- t0 M" e5 g/ T& k: LEnter your password to continue and deploy this contract
' d# N: q* n# Y$ t' O  E[password]> ***
- i# Y' P* t1 Z" n& D9 R$ ?[I 180914 11:03:33 Transaction:613] Verifying transaction: b'9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114'" |- z/ y9 n2 C% y+ ?' ]
Relayed Tx: 9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114& O# y( J! o2 i% \* m0 j
11使用给定的哈希值验证交易。 注意:不同机器的哈希值是不一样的。
0 A  m: ^/ |, Q: ?  r5 X& P; xneo> tx" \: B1 _6 @) J$ ~$ _0 @% Y( J
9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114/ B  x) j8 d2 Q
{3 \1 A: C) O. ~: |
    "txid": "0x9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114",! e+ j! E5 \* b) n7 G( y' T
    "type":
- D. o* ^- u" L8 Y4 j4 U9 X6 S+ I"InvocationTransaction",
  }1 j2 L$ D9 {, Z- {" s2 I    "version": 1,
9 y/ w7 \+ ~7 }6 H: Y$ x9 B    "attributes": [],
3 A, F; ^) W: H    "vout": [  O: d$ {8 A9 @+ p$ [( C% y  ?% G
        {
( g  q) E' i7 g' F$ x  g: |' S            "n": 0,! |  ?8 O/ i4 h8 `. [/ s9 @' ?
            "asset":1 \5 ~; d6 M4 w+ g
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",( H7 x5 A7 `1 @! I
            "value":5 _; k0 P6 D$ O+ N6 }. D
"25493.9997",) o8 G& [: Y& f$ [
            "address":
( e/ G6 R) u1 H, p"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"* G+ P& U5 J  w; x3 l
        }
2 p3 z( }9 x! \. i& T    ],
  F$ M$ k  X! C7 H, {    "vin": [4 V" P0 Q, V8 T* E6 W' Q$ M
        {
; v7 v1 {& {8 A7 g            "txid":
8 o2 S# H6 ?# J2 ~5 `"475a091ccaa6330320a29884f5f8796a260bdba91352dd409d16787b37d8be26",  L5 k/ e5 ?2 k
            "vout": 0' |1 q, C# [/ b7 I7 X1 C) n
        }
; l" f4 ~3 e' j) k    ],5 X% ?" |  f! _, t$ @4 f, }# R4 f) p  |
    "sys_fee":
* R. [1 F# T% w( `5 Q/ G"4.9e-06",5 ?/ l( X( p# m
    "net_fee":
3 X1 N8 k. X. W- m% z( @3 j"489.9999951",
( W4 `6 `) M6 f! O    "scripts": [: G! E% ]: T6 G8 ^# N
        {0 Z+ e9 g, i( ~
            "invocation":
6 ~' q; ]) P! {9 d+ q- E"40510fa6630ef581108057ebe967cd306522466a32eaf068cf3717da1e640b866246c013033e3c878ebf9247a5a3500178b21b126b3af63ed07a86b0d2c4f34c89",) k* l5 P; I4 h. s/ R  K
            "verification":
' K# ?& ^  v$ q6 @"21031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac"
' V9 @$ x3 Q7 {$ [$ H0 I2 |) U; H  v        }
8 X+ B8 J/ u5 P% B. e2 N  ?    ],
, C- s  F8 {0 i# J$ k    "script": "...",5 e. E$ @9 T- P7 _  ]; G
    "gas": 49000000000,
9 A! Q0 {6 U6 V/ k8 n2 ?2 d    "height": 10302,+ }3 ~4 q& n: U8 Z- m8 I
    "unspents": [$ S: e. d7 m# v
        {
& m' F8 D4 V5 R9 j! q0 O            "n": 0,
, O/ e# C: ~8 `7 i- e% D# F            "asset":
) b7 r0 z# A! d" q; A( K- E"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
, A" M1 |8 ^9 Z) @            "value":& _: ]4 n, q1 j- F4 |: G/ k
"25493.9997",
3 ]1 [: K# e" B+ R, p# L- R* j5 s            "address":
5 {6 G7 I/ x1 k* G0 V) r"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"3 g/ g1 T3 S) }$ E+ l0 U
        }4 x- t' L/ X; L$ B# \& U0 D
    ]* E/ N( B3 f* V/ P, y
}
1 z* {& [; @& p- f6 W12交易显示后,再次查看钱包余额。 在步骤9,我们的GAS余额为74589.9996,现在,GAS余额变为74099.9996。 因为这减少的490个 GAS已用于合约部署!
% f- y/ h$ m) h* [9 qneo> wallet
) \& ~$ P+ h% s[I 180914 11:18:38 UserWallet:538] Script hash' U8 ?4 Y' M; }$ o8 o- d/ ^
b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9' 8 f3 E* K- [( i- {
Used 0.357 Gas & R$ J! k2 s: ]$ e
Used 0.357 Gas ) p$ x0 Q5 x0 Q. ]9 h$ Y3 l
Wallet {
! J7 ^1 _$ s8 m. _7 \; s5 B    "path":
+ f5 r+ R: k. N"neo-privnet.wallet",
+ _! b3 f- g# u% u$ q    "addresses": [* Y2 u6 ?; K5 r( D& e% B! o" U
        {
; V; y( J* E# L- p7 g. Q0 c0 f2 h2 N            "version": 0,
& r. s+ H0 s% ]) ?. q  t            "script_hash":
: a& o7 v, K1 S& X6 W"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
+ k. t0 J6 E& X6 J6 `            "frozen": false,# L. y/ S% ~/ V
            "votes": [],
8 y+ J$ b* }; A& }0 i            "balances": {1 W* |* ~! H1 x9 n
               ) G. l9 q) r: U/ h9 ~
"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
0 p# x) B- X+ T$ Z+ c"100000000.0",: [: H' `, k: ~# m3 p2 o/ {5 o
               
; y; T6 U* |! A2 x3 s"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
4 B8 }: ^2 V2 T+ C"74099.9995"8 b, C! [8 [% N+ i! Q' g
            },: m6 V8 {( m3 f/ Z  W  g
            "is_watch_only":$ D& V; n7 ~. z5 s  A# E" x0 o  O
false,
# j$ ]/ v1 C$ N+ E            "tokens": [
0 f* B% F: p  }) q% L; y* y               - {1 c- j- G( [3 G$ n9 r2 B4 H
"[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 :
" F, _  \3 K! [! Y8 d, T4 U2500000.00000000"
- W7 @; q4 F6 T( H6 d9 W            ]# O- Z4 H* }4 V; d. W* k+ }2 ?
        }% u! v2 ~9 J9 r4 F4 d
    ],
' V. @7 v  [! h% H    "height": 10348,
0 ?! h2 Y: _+ F2 K! R1 N- M    "percent_synced": 100,0 {4 t" S0 w- Q9 V* {8 i
    "synced_balances": [2 j3 P' {  e0 ^8 j; a
        "[NEO]: 100000000.0 ",
: o( {5 x( i; R9 f        "[NEOGas]: 48605.9999- x6 U# `: `( Z+ p+ ]# F2 h
",
& a: v' W) K9 ]! F9 ~! `' o9 B! ]6 H        "[NXT2]: 2500000 "
; Q7 Z* U3 M/ L6 A, s# P3 q  X( u4 e    ],
! G- W9 j- B9 r" c% z1 v2 ?    "public_keys": [
1 B% [5 b7 n- s9 K9 i  c2 ~        {
9 U/ m# F+ P" ?            "Address":
4 s9 b5 i% O( }"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",% B5 V/ d& v7 q0 {  S
            "Public Key":9 q* X3 n8 k+ w$ S- l, i
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a": M5 ]6 T1 Z3 E) e2 d+ n
        }0 d8 m% I7 N5 C# T
    ],
3 M* m! k' R" S    "tokens": [
+ c/ X+ v( H# r! g  M* m        {
# g& A4 O1 H! i& s7 Q            "name": "NEX
+ i: o8 T2 h) l, y; A& n7 H: i8 uTemplate V2",; V! v, G( `; j. c) I8 r2 d
            "symbol": "NXT2",4 Q. L  l( {+ ~6 C: u9 e- z$ c
            "decimals": 8,
  {) H  b2 S5 \            "script_hash":
; R6 y) e% }. e& v6 E! O# w"0xa3640dd3c560c75528e5f861da5da98958d0d713",
, {0 M! `  e# e; ]. N1 o( g) v$ Q            "contract_address":9 ]6 w( v0 ]! H
"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"  W% r, j: J4 ^4 H8 U3 Z
        }/ E# z$ K. |9 ^+ n8 C) F
    ],
( v  u' }9 d6 \/ m4 V( Z    "claims": {( h9 w9 ?" M% z
        "available":, d$ A6 _3 e2 X6 @7 V
"0.0",& U( P- |* D: r! R9 H" ?9 \
        "unavailable": "8652.0"8 N& f  @% J/ r3 @
    }4 I6 a' k  P" B. F& @. B; @& j7 b5 u( w
}& ^6 l) N! C$ h& n/ M7 j
我们也可以看一看部署好的合约。
" Z. X6 h- P7 W* C- ^; }' i: |- eneo> contract search My
' g( v1 L$ Q; _. I+ H: bFound 1 results for My+ e  ^! ]; K0 z" T6 L. w  ]/ b# m
{: C1 y; V4 U( U, R  ?
    "version": 0,
1 S  v  b( C9 E5 L/ d  m. Z    "code": {
9 r7 ~! i0 h: p# o# b0 h9 p        "hash": "0x4e9b87c96158a8e2cc4b74794f727b38947e9862",
& o3 T  L; u% r, s" k) b        "script": "...",
+ g) y; U. \& _+ |# ^        "parameters": "0710",
: {0 h2 F. S6 A  Y        "returntype": 5" h( a4 u5 \8 \' m& n0 w( c# N0 B
    },
  f' _$ k8 ?$ y+ Y7 T9 u    "name": "MyFirstNEOToken",
. p% k0 E6 Z1 j' T' p1 q" ~    "code_version": "1.0",
# q/ k. ~. T! b2 G4 P    "author": "Richie",
4 z  d4 {1 V( M/ [% J6 u" E' t    "email": "babierichie@hotmail.com",
& u/ ?* A) [0 b" x- K& \2 r    "description": "First NEO Token",7 ?* a# W, d& k0 d1 I' d: j
    "properties": {
& B3 E& e1 t6 t2 T; }: Q4 h        "storage": true,9 L; ], @! I3 P$ S
        "dynamic_invoke": false: g& o. I9 |+ x' X0 i, B
    }- l0 }$ ~7 g; A, C+ q: d8 ~
}8 L% Z5 _) X- ^  H' j
13最后,我们可以尝试使用钱包的密码coz,来调用这个带有合约哈希值的Token。: G- s- L' x( \
neo> testinvoke
/ {8 a  \& s+ |% Q0x4e9b87c96158a8e2cc4b74794f727b38947e9862 deploy []
  \* R4 S) `5 F7 t8 f9 Q好了,现在你已经在NEO的私有域上成功的发行了NEP-5Token。
1 H. g% [, A7 X* H* S最后; N8 o1 L# L4 w! ]! k" g; k! K+ }
希望对于Gophers来说,能很轻松地照着本教程学习。也希望GO开发人员能加入 NEO’s Discord,一起开发学习。你一定要试一试!+ t+ P8 a3 c4 z+ H( l
如果您真的需要我的帮助,请在Discord上联系我(LikKee.Richie#5647)
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14