Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
介绍: g0 E( I, A8 b
开发语言
  W/ |- e& k. Y在NEO智能合约开发平台进行开发的优势之一是平台支持各种开发语言。0 m( V' w+ o/ f: ?5 w* V
NEO推荐使用C#语言,不过它也支持使用Python, Java, Go, Ruby,之后还会进一步支持Kotlin, C/C++, JavaScript等开发语言。.  n2 Y6 c* r5 q. o' \1 s+ r: o
尽管支持多种语言,但我们仍可以发现现有的很多项目使用的是C#、Python、Java,使用GO语言的并不多。因此,参考City of Zion (CoZ)上的资料,我想尝试写一篇关于使用GO语言开发的简单教程,希望能吸引更多使用GO语言的开发人员参与开发。
% q3 H# \' E+ [# o& W/ |. T给GO开发人员的建议8 ^7 \% O: \" `7 _
无论你是编程新手还是经验丰富的开发人员,刚开始时都建议你在私有域或测试网上进行开发。& a  V/ A  `0 H: Z' r) \
为什么?9 w* y% b+ S0 d8 v6 Q
因为在主网上部署NEP-5 Token需要消耗490个GAS。* A8 ~& T% h5 G. s0 p2 f+ B, `
写这篇文章的时候(2018年9月15日),GAS的市场价格是5.8美元,那么该笔费用就高达2842美元。对于任何创业公司而言,这都是一笔不小的费用。4 V8 u8 j( l1 @/ q' X
按照GAS的历史最高价,每个Token的价格为95.87美元,那么仅仅部署一次智能合约,你的成本就要增加4,7000美元。
0 `6 [. U  X( b' S# R因此,刚开始开发的时候,建议你在私有域或者测试网上操作,当你准备好之后,再转到主网上部署合约。4 I; h: ~/ p6 e' S+ x+ S
要求
4 e" G1 e4 d9 J- Z  M) k2 h本教程中,开发环境的需求如下所示:
8 U) {1 G& K+ p& ]. D操作系统 – 桌面版Ubuntu Desktop 18.04.1 LTS
& h0 O, C8 t) n+ ]' ZGit 命令行接口 –Git
% b4 F+ Q3 A' ?0 M  |0 i语言 – GO语言. D0 [+ G7 d1 ^6 t: H
Go语言依赖管理工具 – Dep/ S* L) p6 X3 ]* G, O  t
Docker –Docker CE 和 Docker Compose0 T- @. {$ T5 h
编辑器 – Visual Studio Code, Extension: Go
" J1 g. Y! q7 P" ^& s* e使用到的NEO的资料$ ?. e/ B5 ?5 V# M. D% l
GO语言智能合约框架 – neo-storm9 V; C& s, ~+ o
预建好的使用Python语言编写的neo-privnet-with-gas以及nep-scan镜像 –  neo-scan-docker) Q- j- @2 Z( Y6 L
重要提示:结果可能因NEO编译器和节点版本不同而有差异。
) b3 U" Q  V" L- W$ \7 K0 d本质上来说,有几种方法可以运行私有域,例如使用 neo-go 或者 neo-privatenet-docker。 但是,在本教程中,我们会使用slipo编写的 neo-scan-docker。 neo-scan-docker是用neo-python构建的,所以它带有一些“Python”组件。 此外,它还带有neo-scan的UI,允许您分析智能合约的部署事务。
* ?# q/ w; P2 k1 {: a9 F- p7 ?*安装方法可能因操作系统而异。 相关的详细信息,请点击上面的链接查看。( j+ w0 e: y' C! p2 H2 @' @, k
配置你的环境: V& V3 K5 k$ k
首先,我们先用 neo-scan-docker来配置一下NEO私有域。
1 U1 X: ]8 d; w2 M( E7 ^( ~3 V1 检查一下Git, Docker and Docker Compose这些工具是否已经准备好。
+ V! K( u" Y9 p* N. j4 G" Lrichie@Redbuntu:~/Desktop$ sudo git --version
2 A% C: [, r( Z, bgit version 2.17.1
2 z, T6 B7 p% F. irichie@Redbuntu:~/Desktop$ sudo docker -v
. N/ ?# }, r( P# D0 O# XDocker version 18.06.1-ce, build e68fc7a
4 d$ x1 `) j( U. w0 B0 \) b. Grichie@Redbuntu:~/Desktop$ sudo docker-compose -v& x7 p; w5 R1 M- [. m0 m
docker-compose version 1.22.0, build f46880fe! e& \$ a2 K( e+ r4 @" J5 \
2克隆(Clone) slipo的 neo-scan-docker仓库代码,并使用 docker-compose来加载Docker镜像。 下载镜像可能需要点时间,请耐心等待done状态的出现。1 {' v6 A6 M* Y9 @9 h6 v& Q! \  p4 a
richie@Redbuntu:~/Desktop$ git clone https://github.com/slipo/neo-scan-docker.git
& ?- E; W( F6 M& U% }& HCloning into 'neo-scan-docker'...
& X0 z4 C3 M9 ^, jremote: Counting objects: 27, done., p/ T7 b9 V) p+ I5 b+ C4 P5 Y
remote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27
# E# h5 c$ p0 qUnpacking objects: 100% (27/27), done.
7 v( N1 O7 U- Q) O! Z$ Nrichie@Redbuntu:~/Desktop$ cd neo-scan-docker/
$ n& h% G4 n- ]! }richie@Redbuntu:~/Desktop/neo-scan-docker$ sudo docker-compose up  e* `( ^$ m$ U+ s$ E
Starting neo-scan-docker_postgresql_1 ... done9 W! L1 _: g5 r% f; E
Starting neo-privnet                  ...
" x9 a9 {; a) f, f5 X( [1 ~+ gdone
" \! l0 S2 n1 W2 `/ _9 \' u5 rStarting neo-scan                     ...
% C* W# k# f. C2 W; @done
0 T$ i# c0 \* v# ?Attaching to neo-scan-docker_postgresql_1, neo-privnet, neo-scan`! X/ h1 j: U1 t2 `$ l  I' @
3在你的主机文件中,添加127.0.0.1 neo-privnet。注意:主机文件的位置可能因操作系统而异。3 \4 I$ K1 U& B5 U  H1 }, j; I3 k
Unix/Linux/macOS - /etc/hosts3 i7 d; L6 T. I# O7 D
Windows          - C:\Windows\System32\Drivers\etc\hosts`9 }2 r/ W" ]$ s2 g8 \
4在浏览器中输入http://127.0.0.1:4000/,可以看到City of Zion (CoZ)提供的neo-scan网页界面。
- h: w! r  L, J5 m7 y: x8 F9 c* o: U; @
5点击钱包地址(Wallet Addresses),你可以看到预存有NEO和GAS的钱包地址。部署智能合约的时候我们需要使用到这些Token。更多信息,可以查看 neo-privatenet 。/ P) r5 T( Q. ~
导入WIF密钥可以获取预存有NEO和GAS的钱包的密钥。 私钥/WIF 密钥 KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr 地址: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y 脚本哈希值 (用于检查): b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
% [* t2 G) g* Q6 F7 T& ]这样你的NEO私有域和neo-scan就已经配置好了。, }, `* _' b5 ~/ e# C
下一步,配置neo-storm。$ @# l$ b7 n9 @+ u( T2 Y
1在终端中输入下面这几条命令, go version、dep version以及echo $GOPATH,确认一下Go, Dep, GOPATH都已经准备好。: j6 n3 L: n  I2 w
richie@Redbuntu:~$ go version4 O! l. Z' P, _$ U) W
go version go1.10.1 linux/amd64
0 B' D: U+ J! Z. Q9 B7 k& p- L  Srichie@Redbuntu:~$ dep version& R9 P0 ?; A: k7 L7 a
dep:# E: e  I$ T! v/ W( v' b, b( q
version     : devel
: J/ U" F* g4 I, \ build date  : / M4 h. M# u1 l
git hash    : 9 R2 X8 K, h7 C# j9 M8 J9 {
go version  : go1.8.3, l, [% f4 C3 T  c& c/ K( Q
go compiler : gc
: o% H$ J6 u6 `" |0 |  V# t platform    : linux/amd64
" R4 H0 S% p* N0 c9 mrichie@Redbuntu:~$ echo $GOPATH
2 R3 R4 z2 l0 W9 T$ {* g; o/home/richie/go( t! c' l: e$ d' R3 J
2输入 go get命令获取neo-storm,输入dep命令检查依赖包,使用make install命令进行安装。 *忽略警告信息. Y/ E! A4 W& l$ Z) C
richie@Redbuntu:~$ go get -u
( e8 `2 g4 Q& A" z5 y/ ~9 ?github.com/CityOfZion/neo-storm: x: X9 W+ o- p. i) y
package github.com/CityOfZion/neo-storm: no Go files in5 P2 N  {# ]* g8 B" g) m- H
/home/richie/go/src/github.com/CityOfZion/neo-storm0 ?6 q( e7 ]* T4 h8 N
richie@Redbuntu:~$ cd $GOPATH/src/github.com/CityOfZion/neo-storm
" e7 B3 L: x6 [1 X- ?) irichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo dep ensure8 J7 s) g7 D6 {- z
-update5 i0 ^3 _5 w! n$ c
dep: WARNING: Unknown field in manifest: prune
7 X* O! @" k. z  @0 P; i- ?5 l# Hrichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo make install7 ?' V* X" f( C7 n' b2 _+ t, ]
installing project dependencies/ {8 X/ [1 F! n" `! m" t: _
dep: WARNING: Unknown field in manifest: prune
  X) C" J% o& c+ l% y+ Hinstalling neo-storm framework6 N! a% Q7 m2 G$ u$ W( V1 e" k, z
done installing, happy coding!
- a( D0 ?8 W- f/ \: }3现在neo-storm已经安装好了,你可以测试一下。
) N" K* Y1 y- ~" ]$ |- Wrichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$
. c/ |( x; T' E0 l. Qneo-storm2 ^: F; P1 Q# y7 R, q1 b. m8 `3 H
NAME:
. _2 O6 B1 w" {& `, _( V- a   neo-storm - Neo smart contract% ?3 W. E9 x) Y, a
framework for the Go programming language
+ o! ~0 V& a3 s: CUSAGE:! A* n/ B6 o7 V' B, j
   neo-storm [global options] command[command options][arguments...]
% h; D4 |6 G3 [+ P8 uVERSION:
* g# T5 K/ D8 `( `  ~   0.0.0: V) Q: q3 Q- N" Y  C0 J& W
COMMANDS:5 P* B! q6 W& L6 A# O6 N
     compile     compile a smart contract to an .avm file: }* s  W$ k- V& {# y9 l/ S4 ]
     testinvoke  testinvoke a smart contract against a remote NEO RPC node+ \% p6 E% G1 w
     init        initialize a new smart-contract in a directory with boiler plate code5 C1 N+ @/ m& @
     help, h     Shows a list of commands or help for one command
' r* _5 \) m; }; n3 EGLOBAL OPTIONS:" x$ _) \. K* |  g) F" ?6 j6 D5 k: x
   --help, -h     show help
- Z% F% z$ _( _( p+ A$ R   --version, -v  print the version
% D' |5 j$ M7 R5 [4 Z5 z3 F. }4“安装完成,开心编码” ——接下来开始我们的第一个智能合约吧。
, d& p# \' R( b) v2 Drichie@Redbuntu:~/Desktop$ cd ~/Desktop
3 c7 ^4 x6 h0 L  ]. ]" R5 c4 vrichie@Redbuntu:~/Desktop$ neo-storm init -n NeoStormTest
# R; r6 F9 M2 ]( X9 bSuccessfully initialized smart contract [NeoStormTest]
3 e! q" B3 f! \9 f% Nrichie@Redbuntu:~/Desktop$ cd NeoStormTest/
8 ^! e" b& @4 y7 w7 b1 Q: arichie@Redbuntu:~/Desktop/NeoStormTest$ ls+ }6 @3 T' c  `- d5 Q
main.go4 {& b* m! S' T, U! A# k- N  [" O
richie@Redbuntu:~/Desktop/NeoStormTest$ cat main.go6 Q1 Z0 Q+ ~2 q2 g: t# y
package NeoStormTest
# G4 D5 y3 O/ k/ B9 a  V9 o) kimport "github.com/CityOfZion/neo-storm/interop/runtime"2 s0 \4 f9 `- T3 k% E
func Main(op string, args []interface{}) {6 X  k9 a* R( n
    runtime.Notify("Hello world!")
! J- }4 q2 D4 p1 z& C- ]' ~发行NEP-5通证合约5 Q, Y& X) q4 X6 c5 f) d( d
1要在NEO上发行NEP-5通证,我们必须遵守它的通证标准。 *改进的NEP5可以在Github上查看,它允许Token上线NEX交易所。
4 h; L6 K9 s. L: R  R$ b/ d8 kNEP-5 Token Standard
9 C" d8 i7 R6 f  o7 h2 S6 q( i  \2 jMethods6 V: `- H2 Y7 ?+ q+ C. H5 m& Z
-totalSupply()3 f0 M9 |. [9 u* t2 Q2 C" I
-name()
' s$ C5 `' P- T" l7 Q8 L-symbol()* m) ], R/ U! Z5 n  `
-decimals()
) E2 P7 w  q! y" D. q% f& F-balanceOf(account)
& J3 x5 B8 D: C3 z$ M6 o% f3 y-transfer(from, to, amount)# N1 C8 n- a& K# a& R3 D
Events
9 Z' }& p- y" C. ~-transfer(from, to, amount)& v1 ~2 H5 a; G  `
NEP-5(.1) by NEX
8 \0 s7 r" e& X% }4 PMethods
' C* V7 O* L  \2 f+ k) T-totalSupply()
8 [2 B* P6 k; I-name()6 L7 f" V% W8 C) R; g
-symbol()( I5 X7 e, |4 @( M$ ~6 V3 i1 V0 ?; |
-decimals()
, }, J+ \; Y" n$ `-balanceOf(ctx, account)
2 ~+ x& K: R/ A3 I6 l! I-transfer(ctx, from, to, amount, callingScriptHash)
6 h$ N% @! n9 O-transferFrom(ctx, from, to, amount)
( `( W4 h: M+ H-approve(ctx, owner, spender, amount, callingScriptHash)" r4 A# [( L& K0 ]2 Z7 X
-allowance(ctx, owner, spender)" g% r* A1 E  c( V( j, a' ^+ C
2不用重新编写一个Token合约,你可以fork/clone我的github仓库。
/ ]( @; ]; D! E! G2 p) \9 N" @richie@Redbuntu:~/Desktop$ git clone https://github.com/maplerichie/neo-go-nep5 MyFirstNeoGoContract7 c3 Q9 i8 C+ e! _
3启动代码编辑器(我用的是Visual Studio Code),将~/Desktop/MyFirstNeoGoContract 添加到你的工作区(workspace)。Neo-storm的examples文件夹里也有例子,可以点击https://github.com/CityOfZion/neo-storm/tree/master/examples/token查看。6 H6 e  n2 ~7 R  C6 R+ l# U

' c! v, b3 ]/ C" x1 \6 {https://github.com/maplerichie/neo-go-nep52 A; C- H" K% H
4编辑package,修改NEP-5的属性值,例如decimals, multiplier, owner Address, Name, Symbol, TotalSupply。
+ I7 @7 m& ]6 E; i- l$ i, M/ b- U2 `' UPackage:应该将package修改为 package MyFirstNeoGoContract ,从而与文件夹名称保持一致。4 H! c: n$ m% g% O3 [1 n
Decimals:用来设置Token使用的小数位数或者Token可被分割的最小单位。
; v1 i/ N+ F, w* t例如:NEO的小数点位数是0,意味着它是不可分的Token。因此不能转账或者接收小数个NEO,只能是整数个。小数只能在交易所使用,因为它们创建了自己的十进制系统来方便交易。
, v. F, _) R" H0 m! sMultiplier:这给出了Decimals和TotalSupply相乘时的值。 输入格式为10 ^ Decimals。" x4 [/ |+ q  r4 L  b# _
例如: decimals = 6时,multiplier的值应该是10^6,即multiplier = 1000000。
% l) }3 B4 |/ Q/ j7 b# X* wOwner: Token发行者的地址。这里我们使用neo-privetenet的地址AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y。4 l* g6 f- n% A- _: Z
Name: 字符串格式的NEP-5Token的名称。
0 W  C7 X# u# NSymbol: NEP-5Token符号,通常是3个字符的长度,但不是必须的。
, z  N  i* m( u% ]; n% hTotalSupply: 总发行量。设置一个总发行量可以防止通胀。# m! X7 u3 |. W: y9 K7 n

+ N* r9 [% S2 C6 P$ v2 G) S  v5修改参数同时确保符合NEP-5Token标准。然后使用neo-storm来编译GO智能合约。
1 r( y8 z' m$ \0 ~' K- C# hrichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ neo-storm compile -i main.go -o main.avm
0 H# W; O' a1 G0 j8 h7 g6当前目录下你可以看到 main.avm文件。现在neo-storm不会运行检查NEP-5Token标准。我的经验是缺少owner Address信息时,会显示错误信息。
: }0 _0 A' R( }7现在讲NEP-5合约部署到Privatenet Docker。这么做之前我们需要先获取Privatenet Docker ID值,然后在主机上复制main.avm文件并粘贴进Privatenet Docker镜像中,然后将它附加到运行的Docker中。
3 n3 f- w5 Y* X. D3 Yrichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo
0 {2 \9 `. F  J1 S* k+ [; y: e7 adocker ps
, P3 R4 ]) E. QCONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                                                       , A  g1 c. m2 y( P0 p3 Y
NAMES* Z# }' S/ }- z( k4 ~/ o
69c60667835b        slipoh/neo-scan             "/bin/sh -c 'sleep6 v+ L9 G" N1 f: n. P
3…"   6 hours ago         Up About a minute   0.0.0.0:4000->4000/tcp                                                      
) v7 H. l& l+ W  Wneo-scan; l  p; H2 |" y; d) b! h9 D+ z
88b358cdd8ff       0 i& `. i! H- |
cityofzion/neo-privatenet  
3 e: A; L. w1 _; ]% v( }"/bin/bash /opt/run.…"  
$ I) V, y) j- X% {! P9 j6 hours ago         Up About a
# \, D+ o+ g0 g. ?minute  9 l. Q: }" t$ D, s
0.0.0.0:20333-20336->20333-20336/tcp,& {) L& B2 B& A$ h/ m
0.0.0.0:30333-30336->30333-30336/tcp  
$ L* B( Z, y9 b' \# rneo-privnet
! Q4 m! `. q$ E1 `' Bab96dc398c62        postgres:10.1              ' B( i+ M" b) w" b% f
"docker-entrypoint.s…"  6 B; `  b% |- g$ b# \" L
6 hours ago         Up About a
6 ]; F' m0 S7 x/ V! }5 h5 p1 vminute   0.0.0.0:5432->5432/tcp                                                      
6 o0 p# D! \2 [neo-scan-docker_postgresql_1
- s8 V* c* ]( e0 Crichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm
3 u$ X) m  A6 D% `* G88b358cdd8ff:/neo-python
$ b  @2 c% p1 E7 ~6 `* Y7 t& _richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it7 W5 t2 g+ u8 |3 @3 {
88b358cdd8ff /bin/bash
& T5 w) G+ N+ J% `( n( L*共识节点运行在在screen sessions,使用’screen -ls’命令查看
' r' t) b7 o+ S% D  r% ~- A& J) p*neo-python安装在/neo-python目录下,目录下带有a neo-privnet.wallet文件& H" J$ d# j+ P% W- ?
*有问题可报告给:https://github.com/CityOfZion/neo-privatenet-docker
# S7 Z+ I% D6 D8在Docker上,打开neo-python-cli终端并使用密码coz解锁钱包。1 j+ Y- n7 a. ?3 M
root@88b358cdd8ff:/neo-python# neopy9 s; Z: _$ r' Y' q3 }1 ~( ]  _
Privatenet useragent '/NEO:2.7.6/', nonce: 513759764
0 q! [/ R" P3 i6 G: P$ F[I 180914 10:34:09 LevelDBBlockchain:114] Created Blockchain DB at /root/.neopython/Chains/privnet5 J$ ]" {% ]9 {7 ]8 x  g
[I 180914 10:34:09 NotificationDB:73] Created Notification DB At0 }% u7 j( x: t* y; T! T5 \  |
/root/.neopython/Chains/privnet_notif
5 Y  N% \+ S! a7 dNEO cli. Type 'help' to get started
+ C9 v! v5 x* U, i3 Cneo> open wallet neo-privnet.wallet
9 \' Q! p! I8 I[password]> ***
8 ^& a' m3 \/ h$ U4 @) k6 ROpened wallet at neo-privnet.wallet
3 d& g. P* d# a$ [1 c, @# k9部署合约main.avm前,使用neo-scan看一看钱包余额。+ k: h8 g" S' ^7 Q
neo> wallet" K4 A- J* Q7 ^1 b
[I 180914 11:01:22 UserWallet:538] Script hash
) [% k: n9 K( J* j5 Z% Db'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
" G: q  d/ K* }5 Z. zUsed 0.357 Gas
. _  e0 \5 x/ c2 @: dUsed 0.357 Gas 2 }5 g% P* {$ h  d% J, X1 t
Wallet {- G; N7 t0 U9 G4 e
    "path":
7 s0 R+ X0 a" x) ~. U- _/ K"neo-privnet.wallet",0 z7 W  @' L1 E% {2 R0 b" u
    "addresses": [" I# ~; [; P" l- z* _
        {9 |* I- I4 x' a3 s
            "version": 0,' W! U: d. g3 H9 a6 E& j8 `% M
            "script_hash":
! o: g$ B* h! t' o' O, H: e' u"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",( Y5 N% y* z  t# Z. h/ P
            "frozen": false,6 K5 e+ m- J0 _% i. x
            "votes": [],
6 v! V& Q, D5 G# E( d2 l            "balances": {
( j+ O6 V2 A2 O2 y, _- a6 N         
0 c1 Y$ c3 o8 P0 ~% v5 B"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
" s" b9 ?/ `5 l5 s"100000000.0",4 |9 x' m' \9 c- `1 g
              . o7 I- H- n: Z* ?8 I& U
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":+ f, J3 A! K2 N( `. K" N( C
"74589.9996"
: o9 ]) Y$ A' K/ c            },
' q& Y, [1 H) W0 h. W, b5 ^: u( M; Y            "is_watch_only":4 ^4 l) ^/ M( F4 }
false,
! a% ?7 r  K5 k5 m; e( I  E+ N            "tokens": [
! _$ b# a5 r) M% k                "[a3640dd3c560c75528e5f861da5da98958d0d713]
' s8 \. V$ B9 r7 nNXT2 : 2500000.00000000": r4 I) f/ i4 y
            ]( R! j# H% l" P, ~0 v
        }
0 p$ r4 {* }  G0 K$ P8 n' D6 o# Y4 @    ],  r1 X6 B0 s9 Y( ]  x* w
    "height": 10294,: V1 N! @8 U& Y
    "percent_synced": 100," R' r& [- N2 D8 r
    "synced_balances": [
9 |4 R! e3 J& O' h3 t+ A/ X* j        "[NEO]: 100000000.0 ",
) F; ]( J4 ]+ {' @3 a1 [7 o( v        "[NEOGas]: 74589.9996+ J, e, U; ]$ f) p* Y
",# h, `0 ]2 [+ p( a9 k+ M6 f
        "[NXT2]: 2500000 ": s0 b& t' O0 X  ]( Z/ Q3 R
    ],& C8 y8 V/ A2 ]; o. J% v* ^
    "public_keys": [5 V. _. M, h( ~8 l9 r# A+ o6 C/ M
        {
1 ?( j6 W- A& F* M7 v  @6 K8 O( J            "Address":0 g! r+ l$ v( T7 ~, z* T7 X7 \/ t
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",1 H- C1 @- @. d
            "Public Key":
* E2 e8 V( T: x& p4 x( o"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
4 H+ }; [- g6 `5 ]" u        }
* b7 i9 Y; m2 l; ^# m+ `1 Q( A    ],
1 W( \2 O( J& J; z) h    "tokens": [
  W# E3 n  ~' z& G' K! V        {
( I$ I* j/ U- w( u3 d& C3 I            "name": "NEX
  q+ I# J0 ?! q. B$ l: Y3 N- B+ ~Template V2",
  D5 u% g1 G2 X. s9 Z- ?            "symbol":
2 L7 V  Q" Q& n4 A1 o0 F$ p) y"NXT2",
# J# R' l3 t8 Z1 B) G1 x; t# `            "decimals": 8,
" F* s+ A' y4 W            "script_hash":
$ n+ P0 v! w" t2 h3 s1 |"0xa3640dd3c560c75528e5f861da5da98958d0d713",
2 b  z" d0 }' e9 z            "contract_address":
5 p0 A% H2 j3 j$ K# g7 H/ r"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b": _7 ^$ j1 m3 k1 Q6 K. U/ `
        }. d- S8 t) L, D4 u5 S+ u( Y
    ],
& j0 q9 U/ K+ F& D. {    "claims": {0 M# Q) n4 V; Z( O5 b. ?1 O2 V5 y
        "available":+ E& Z# R. g' S9 j9 p) a$ a6 A
"0.0",
1 u" ~: {; ~2 D$ C- C  x        "unavailable":
" N" k, v; j& S3 f$ p# k& v: \4 p"7730.0"  n" W# G" ?* U, s( {, ~
    }5 Q! T% a6 X6 ~. H
}, H) r: y8 l& @+ \1 T$ g+ e- F
10看来可以开始部署了。再次提醒,钱包密码是coz。* S- M) M5 P# n* V+ o- F5 J4 R7 [
neo> import contract main.avm 0710 05 True False $ u3 m/ u& X0 s
contract properties: 1. o/ U8 l+ W/ f. D
Please fill out the following contract details:$ l! g' @; O; D4 W/ `1 t
[Contract Name] > MyFirstNEOToken0 z, x  ^. I5 L+ u' x8 S
[Contract Version] > 1.0
  }% l" d; ~# V6 B/ m4 {[Contract Author] > Richie
4 s" ]( y& n8 B4 \8 X8 I  d) e) W[Contract Email] > babierichie@hotmail.com0 w5 Y$ `. M; J  @+ m
[Contract Description] > First NEO Token
$ e7 X' y9 P+ x& a5 {Creating smart contract....
( {" X* T/ v* q4 X4 r* x! N                 Name: MyFirstNEOToken
0 a" z- W# l; g: F0 W- y* z9 C* m2 G              Version: 1.0
( Z7 s2 f# H  k, z               Author: Richie 8 _. e' b" U/ k0 ^7 h3 I# J! P
                Email: babierichie@hotmail.com * Y; N9 f: H: i9 f1 W' {& X# a
          Description: First NEO Token , e9 @+ A4 I& T( M! u: p
        Needs Storage: True
# c. q+ C* ^0 m* K/ j0 W0 H8 r Needs Dynamic Invoke: False $ R5 L: u9 c  [* S
{
% R3 y, g8 c& `! D5 R( ?0 M6 d+ I    "hash":2 b. n7 A  k5 C* V) I( G
"0x4e9b87c96158a8e2cc4b74794f727b38947e9862",
" B) R6 q9 F' e( m    "script": "...",
7 d+ ?' e, t1 K: B  U. p    "parameters":
  u* |- J& L/ G"0710",
* F& b& ]: h+ }* h( s- Y    "returntype":; Q0 u% B' n/ U3 k
"05"1 X3 X# ^$ s  B% A, }7 R0 ]
}5 U  w/ c. {% I! ^* G( O8 _
Used 500.0 Gas
2 `" m  ^4 Z. J: A. M& N-------------------------------------------------------------------------------------------------------------------------------------
( I! Y, \1 x! r% N  `8 ~4 MTest deploy invoke successful& }4 u5 R5 D; W/ U
Total operations executed: 11
* c1 i+ f7 [2 Q, F; S7 w' aResults:
1 L; [( `0 h' |[]8 n* d# E2 s( {7 j9 T# g/ P
Deploy Invoke TX GAS cost: 490.0 - X& L; J/ {4 S  v) C) K* ]1 _' N. o
Deploy Invoke TX Fee: 0.0 4 J: i, l2 C4 ]6 {1 g) x7 W
-------------------------------------------------------------------------------------------------------------------------------------- q8 G9 i  P+ N) i
Enter your password to continue and deploy this contract
/ y! A/ v& z, `[password]> ***0 {! M: @' W7 A& K
[I 180914 11:03:33 Transaction:613] Verifying transaction: b'9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114'( `1 X0 ]% t, p' U: L+ i7 Q" j
Relayed Tx: 9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114$ j4 q2 j6 O2 h' O/ t8 K
11使用给定的哈希值验证交易。 注意:不同机器的哈希值是不一样的。# ?# ?, |" f/ `
neo> tx& q5 D* M' }# \2 z
9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114
5 f  j, G  i! t0 B1 F# c# V: w{  d% v( {& z# V
    "txid": "0x9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114",
, [# d' w! M2 I$ o    "type":) _0 [) k( q4 F4 s& t. o
"InvocationTransaction",; f) A- Z* J% V1 ~! W; c( E4 X& I
    "version": 1,2 m6 B$ A8 ?4 k3 _
    "attributes": [],0 W, u. i  c+ ]- V: B' h
    "vout": [
2 ]9 a/ t- w! ?  T& P        {- h+ S  z/ M. E4 k" d" w
            "n": 0,
( i% e# c- O* Z- A  L            "asset":
$ t: m& \  H  C! N"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
2 |2 b* s) _* _/ G* a4 w+ E. X            "value":
' b. F9 h9 {; ]3 [& E6 M"25493.9997",( i% V% X; p7 ]" D
            "address":, }' k& y. R0 ?! }0 F. }
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"
# b) n7 I5 Q& Z& l        }
7 t2 @6 ?" E) Q. T* z1 K) o    ],
+ y* i: w: C4 k+ B    "vin": [
8 K5 b+ v5 s* F8 G: C6 {+ ^        {
7 c9 b* u* h  S$ \4 G            "txid":
/ N1 g6 X( |9 [/ V, m' U( p- V2 N1 S"475a091ccaa6330320a29884f5f8796a260bdba91352dd409d16787b37d8be26",
; i& c5 W5 b, I+ U! l& `" Q8 q            "vout": 0
, x- H' N# h" |5 Q$ R8 @; o        }- r/ G# B% L8 m0 p
    ],
; j2 T, G" J) s2 @$ E" p5 S# ]4 M8 {    "sys_fee":
8 a4 R+ v, f5 m5 X( S" i0 O, \"4.9e-06"," [4 }* ], p* h3 d2 p
    "net_fee":+ `- }; p) h( x% l/ W9 r  v
"489.9999951",
" L* i+ D7 n4 h' D4 V    "scripts": [1 U5 V0 _/ d7 A
        {
& `, N$ {3 T7 n3 B* `' L: d            "invocation":
) J8 }4 ?. j# u# U; l4 v"40510fa6630ef581108057ebe967cd306522466a32eaf068cf3717da1e640b866246c013033e3c878ebf9247a5a3500178b21b126b3af63ed07a86b0d2c4f34c89",! A# ^4 u. V+ Z
            "verification":( W: |5 a7 I2 x* w, O4 m8 M
"21031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac"
/ k5 n& V+ V# n5 x/ D- ?) L, Z) J        }2 ]% l" X2 _7 J/ j
    ]," c, s. n0 S5 l% Q) ^* p# Q" i
    "script": "...",1 r  q- v/ Y$ L* s: I
    "gas": 49000000000,# e! D" Y" I  j. U; o+ o
    "height": 10302,+ a6 _) z& K, D7 \
    "unspents": [
0 a7 }0 Z$ X4 \+ ~+ X8 [: U        {
/ Q  h' S  d. l- [0 E, j) F            "n": 0,
" ~) h" o' @; P7 O            "asset":
& F5 {  {9 p, h9 h, x2 ]. e+ r& s"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",* @4 {: m# g; `" F/ Z
            "value":2 U* n% ~7 @+ }% Z2 H/ `0 V
"25493.9997",) i5 B3 C  v, T9 T# M
            "address":& q, x" o1 l* _1 q( J) a) r
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"
& n' I  Z) n' F& Y        }
- R8 L# x8 U$ O2 {; b    ]& N5 N2 G8 Z5 u! E( x
}
9 d7 P( t2 y  R" l4 N12交易显示后,再次查看钱包余额。 在步骤9,我们的GAS余额为74589.9996,现在,GAS余额变为74099.9996。 因为这减少的490个 GAS已用于合约部署!
0 B( K) g7 R* Z; Vneo> wallet
1 o( ?2 I9 S6 b3 N: r( p, A[I 180914 11:18:38 UserWallet:538] Script hash9 V) g  z4 t% g+ ^# W, g: ~& U
b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
( z* s5 B' \, i# s0 aUsed 0.357 Gas ; r/ a( W$ p9 L% `" |0 r9 F9 F3 K
Used 0.357 Gas . D0 o+ K: ]8 S0 y
Wallet {
- i8 o6 u( J0 |8 ^( ?( l7 ~8 e    "path":
! r; A2 c, V! P$ D. ]"neo-privnet.wallet",
4 D' ?; Q$ l+ {8 b% W7 v    "addresses": [
  `  W! r6 z1 u: L% z        {0 L4 @2 J7 G4 M; L( F
            "version": 0,& e7 ]' L" l3 v- L
            "script_hash":
5 T2 z# n- R0 j/ i9 h# i  R"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
% m4 Q$ Q' t! H! Z/ I            "frozen": false,
3 x1 D7 z  r  Z0 Z7 f            "votes": [],
5 K4 X. Q& }. b7 r; P+ g9 ^            "balances": {* n5 }% ?# \* P- J8 @/ f, Q
               3 @9 ~% ^" p1 u8 m/ p' g7 p" p
"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
7 Z4 R& E; u  ^, i* ]/ F7 a"100000000.0",
3 u* k3 r3 O4 T* ~               1 Q) {7 H: ?" @( w9 b
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
& e# U% L4 W$ |9 F; G"74099.9995"
9 W3 x' A0 X4 N! X* b3 _3 W            },
' a; J- A  V  d2 n) N: [            "is_watch_only":
  G: Q8 [8 D" rfalse,
) R( L5 V, w. f) H            "tokens": [6 P, V/ A, R3 {6 y  V8 i
               # M% P. f! o  T- u) S; s$ ~
"[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 :
+ `6 w4 g' P* N1 x8 G) |2500000.00000000"
$ q, d  N: ^% H$ Z- _8 L! m3 ~# i) h8 }            ]
7 H9 [$ J) c  d! m) }* P0 K        }
2 q! c& b3 i9 L; @: N    ],+ P: x9 S8 ]2 c& O7 c
    "height": 10348,/ A, U5 }8 N& T! [* A, C$ U
    "percent_synced": 100,
7 I* h; h+ {: I( |    "synced_balances": [
- I9 M% R) ?1 w9 l. l        "[NEO]: 100000000.0 ",
6 X% w1 W7 `# e' E0 L: R        "[NEOGas]: 48605.9999
+ D, o7 w2 y: p! B",% j. u- B* L9 _; j" X0 n
        "[NXT2]: 2500000 "/ F. X0 j$ k8 w9 u- Q/ n! \# x" i
    ],
0 Y; P% j1 a; F    "public_keys": [
/ y7 b: \, O  p: N( w& ~. {        {
- N" U6 ~. S" Z# l            "Address":
+ q4 v& q( T5 m+ R"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",- `& C1 R! e. e$ p
            "Public Key":- k9 t/ l. _$ C4 Y' |/ g
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
1 \, D! ]6 F) u2 o* t        }( ]* r, a# [" q2 y
    ],
! r6 s; t& s/ u) o- e    "tokens": [1 f: K7 g- O2 K; H+ M, }, B$ }
        {- R. g% H2 ^2 w! c! r2 b
            "name": "NEX" [8 x  x# X6 n$ Y& R
Template V2",
( H2 b7 S/ {; Y1 D5 ~            "symbol": "NXT2",
6 p. Q& x9 U/ z+ v$ a0 H            "decimals": 8,6 Y" q8 y5 {1 v, ~) I
            "script_hash":$ d  W+ Z  D& J
"0xa3640dd3c560c75528e5f861da5da98958d0d713",% n$ ^0 i$ s- K/ p$ h0 v
            "contract_address":
9 p6 C9 W3 s1 f, c"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"
7 p% |1 Z( _5 O/ y        }
# J6 A  J. U: g" g: f8 K, r    ],0 Q/ J# P) k8 Y, h3 s
    "claims": {
7 h9 i9 f! `& w7 r        "available":, J; V, |3 A- ?3 H/ k5 J& e1 x
"0.0",( y! P3 \; y: K& l7 [2 a* K
        "unavailable": "8652.0"
8 F9 S1 f& w/ l: ?( o# q' H& |" ?    }
3 s+ {: ^/ S) f* i}$ q  O6 J8 j$ l  _3 l
我们也可以看一看部署好的合约。
( Z+ ?1 W# a  _& e* _) z2 Xneo> contract search My, b( R$ k8 B6 V0 F
Found 1 results for My/ p0 r& k! K" D$ o
{( A1 G9 T0 Q) j1 q; ~3 Y
    "version": 0,
7 q' O  O. S* V: e* n% K    "code": {
" \$ _; U( R- t+ D0 s        "hash": "0x4e9b87c96158a8e2cc4b74794f727b38947e9862",5 D2 M! m' \. J: e/ C! d% ~
        "script": "...",
' A& ~4 X0 s' d1 f        "parameters": "0710",( b. f/ ^3 j$ C, v
        "returntype": 5
; }: v& N& k% |/ B    },  R) {- ~8 p9 Q1 R' a
    "name": "MyFirstNEOToken",3 u1 A! M2 l9 }( i. D1 q
    "code_version": "1.0",  g& m6 A7 Z# i$ L5 e
    "author": "Richie",
: W/ Q+ j) f% x1 W    "email": "babierichie@hotmail.com",
$ K' v, u. i3 `; b! V    "description": "First NEO Token",7 V. x' x- W9 e/ G+ H9 J  U
    "properties": {
2 P9 J0 t6 y0 }. h3 ]0 b* l# i$ a' S        "storage": true,
0 ^3 p: t& D$ m: b6 A0 r, G$ y        "dynamic_invoke": false
1 C$ o; D2 z/ i! c. j/ r3 J/ e# q    }) r+ O2 C8 t6 _+ A2 e- S
}
. m! f5 ^; o+ B) a# [13最后,我们可以尝试使用钱包的密码coz,来调用这个带有合约哈希值的Token。
+ |4 j! r! s' Mneo> testinvoke
0 R! s3 M- L& V4 Z3 b0x4e9b87c96158a8e2cc4b74794f727b38947e9862 deploy []# a( W& L7 X" C+ ]- t; X
好了,现在你已经在NEO的私有域上成功的发行了NEP-5Token。
0 P" P6 K# A+ b9 `: R最后4 F" z/ v" N2 g, j
希望对于Gophers来说,能很轻松地照着本教程学习。也希望GO开发人员能加入 NEO’s Discord,一起开发学习。你一定要试一试!
1 q  f! Y5 X1 @9 x如果您真的需要我的帮助,请在Discord上联系我(LikKee.Richie#5647)
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14