Hi 游客

更多精彩,请登录!

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

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14