Hi 游客

更多精彩,请登录!

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

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14