使用GO语言在NEO私有链发行NEP-5 Token的开发指南
V刘晨曦
发表于 2022-12-2 15:25:23
138
0
0
开发语言# D0 V# Q! a/ D1 w
在NEO智能合约开发平台进行开发的优势之一是平台支持各种开发语言。9 }6 v# Y" s5 O
NEO推荐使用C#语言,不过它也支持使用Python, Java, Go, Ruby,之后还会进一步支持Kotlin, C/C++, JavaScript等开发语言。.
尽管支持多种语言,但我们仍可以发现现有的很多项目使用的是C#、Python、Java,使用GO语言的并不多。因此,参考City of Zion (CoZ)上的资料,我想尝试写一篇关于使用GO语言开发的简单教程,希望能吸引更多使用GO语言的开发人员参与开发。
给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美元。对于任何创业公司而言,这都是一笔不小的费用。
按照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. ?
本教程中,开发环境的需求如下所示:
操作系统 – 桌面版Ubuntu Desktop 18.04.1 LTS9 f* h& ^2 A4 |. D5 c) u Y
Git 命令行接口 –Git; a+ S4 ^9 m ~/ v% A! \
语言 – GO语言
Go语言依赖管理工具 – Dep$ q. I2 V# j+ ~( b7 r/ p
Docker –Docker CE 和 Docker Compose% ~+ s6 P: c, r
编辑器 – Visual Studio Code, Extension: Go
使用到的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,允许您分析智能合约的部署事务。
*安装方法可能因操作系统而异。 相关的详细信息,请点击上面的链接查看。
配置你的环境+ 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
richie@Redbuntu:~/Desktop$ sudo docker -v
Docker version 18.06.1-ce, build e68fc7a8 n6 f8 a4 h2 P( e+ B0 i
richie@Redbuntu:~/Desktop$ sudo docker-compose -v
docker-compose version 1.22.0, build f46880fe
2克隆(Clone) slipo的 neo-scan-docker仓库代码,并使用 docker-compose来加载Docker镜像。 下载镜像可能需要点时间,请耐心等待done状态的出现。
richie@Redbuntu:~/Desktop$ git clone https://github.com/slipo/neo-scan-docker.git
Cloning into 'neo-scan-docker'...
remote: Counting objects: 27, done.# ]! ^2 Y* A* L _2 ^
remote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27
Unpacking objects: 100% (27/27), done.
richie@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
Starting neo-scan ...
done
Attaching to neo-scan-docker_postgresql_1, neo-privnet, neo-scan`
3在你的主机文件中,添加127.0.0.1 neo-privnet。注意:主机文件的位置可能因操作系统而异。
Unix/Linux/macOS - /etc/hosts, W% \1 j+ o# X2 l
Windows - C:\Windows\System32\Drivers\etc\hosts`
4在浏览器中输入http://127.0.0.1:4000/,可以看到City of Zion (CoZ)提供的neo-scan网页界面。
/ 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
dep:
version : devel5 H0 g0 u( i# o8 a
build date :
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
/home/richie/go3 p% c+ n; {' b1 M6 i8 N7 g
2输入 go get命令获取neo-storm,输入dep命令检查依赖包,使用make install命令进行安装。 *忽略警告信息
richie@Redbuntu:~$ go get -u
github.com/CityOfZion/neo-storm8 n5 w& {7 N# ^) R
package github.com/CityOfZion/neo-storm: no Go files in
/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
-update- l0 Z) r! S. Z8 ^' w
dep: WARNING: Unknown field in manifest: prune
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo make install
installing project dependencies! \0 c/ `+ W9 G1 N7 s
dep: WARNING: Unknown field in manifest: prune/ {! I- |/ u, D6 D0 w
installing neo-storm framework
done 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$
neo-storm: r) l/ b6 q7 G# _+ O; A! \
NAME:
neo-storm - Neo smart contract) ?% }6 L; @, W- ?
framework for the Go programming language
USAGE:
neo-storm [global options] command[command options][arguments...]0 C- S' ?. V# H3 R. }; T
VERSION:
0.0.0
COMMANDS: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
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
GLOBAL OPTIONS:
--help, -h show help; G* j; y4 ?6 v3 f0 f1 C
--version, -v print the version
4“安装完成,开心编码” ——接下来开始我们的第一个智能合约吧。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/
richie@Redbuntu:~/Desktop/NeoStormTest$ ls( N( f8 g' K. l3 }' Z! k
main.go
richie@Redbuntu:~/Desktop/NeoStormTest$ cat main.go
package 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{}) {
runtime.Notify("Hello world!"); Z! O5 M% ]# `* J
发行NEP-5通证合约+ {! l1 U! c* O1 _
1要在NEO上发行NEP-5通证,我们必须遵守它的通证标准。 *改进的NEP5可以在Github上查看,它允许Token上线NEX交易所。
NEP-5 Token Standard
Methods
-totalSupply()
-name()
-symbol()# W4 C/ a U( [2 G! X$ s
-decimals()! w8 g. I- Q& N, l/ d; R. @% A
-balanceOf(account)
-transfer(from, to, amount)
Events
-transfer(from, to, amount)
NEP-5(.1) by NEX
Methods5 I; `( M8 f" d
-totalSupply()3 ?+ I4 l% b4 F. i) L9 b
-name()
-symbol()/ ^, Q1 p& f3 O# ?+ V/ @
-decimals()
-balanceOf(ctx, account)
-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)
2不用重新编写一个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查看。
/ 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。
Package:应该将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,只能是整数个。小数只能在交易所使用,因为它们创建了自己的十进制系统来方便交易。
Multiplier:这给出了Decimals和TotalSupply相乘时的值。 输入格式为10 ^ Decimals。5 X' n# m; |! k
例如: decimals = 6时,multiplier的值应该是10^6,即multiplier = 1000000。
Owner: Token发行者的地址。这里我们使用neo-privetenet的地址AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y。2 o& _3 A1 ^4 s3 S0 O+ a8 v
Name: 字符串格式的NEP-5Token的名称。
Symbol: NEP-5Token符号,通常是3个字符的长度,但不是必须的。
TotalSupply: 总发行量。设置一个总发行量可以防止通胀。
+ ]; 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中。
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
3…" 6 hours ago Up About a minute 0.0.0.0:4000->4000/tcp
neo-scan
88b358cdd8ff
cityofzion/neo-privatenet / {+ I; V. f7 c2 e
"/bin/bash /opt/run.…"
6 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,
0.0.0.0:30333-30336->30333-30336/tcp 9 X, Q O. M( p$ V7 j0 q
neo-privnet
ab96dc398c62 postgres:10.1
"docker-entrypoint.s…"
6 hours ago Up About a
minute 0.0.0.0:5432->5432/tcp
neo-scan-docker_postgresql_1
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm/ I- u9 [' G* C) v. H# e/ a& _
88b358cdd8ff:/neo-python
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it
88b358cdd8ff /bin/bash
*共识节点运行在在screen sessions,使用’screen -ls’命令查看+ W5 e; [# D( n% }( g+ i
*neo-python安装在/neo-python目录下,目录下带有a neo-privnet.wallet文件
*有问题可报告给: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
[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
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
[I 180914 11:01:22 UserWallet:538] Script hash
b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
Used 0.357 Gas ' i) q2 h4 } [) m# e
Used 0.357 Gas
Wallet {
"path":; x" X3 Z5 |0 x# h
"neo-privnet.wallet",
"addresses": [
{
"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,
"votes": [],, ~. r- `# u7 N& o) G
"balances": {( Y! f2 U- z- |* P
"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
"100000000.0",
r: N0 f9 c0 |
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":9 P; Z0 I5 m* k
"74589.9996"
},( i3 b- x6 D) l/ B3 Q) J( u5 i
"is_watch_only":
false,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"
]
}
],
"height": 10294, o7 u' B% l( N6 I& Z
"percent_synced": 100,
"synced_balances": [% r1 O0 A$ |( a* G( R
"[NEO]: 100000000.0 ",
"[NEOGas]: 74589.9996, O3 D+ b9 V0 U; T
",
"[NXT2]: 2500000 "* X2 c- t) J1 y. g: m
],
"public_keys": [8 E# {: u) w c( X* \5 r
{
"Address":
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
"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
Template V2",8 u4 ~: ~7 }8 ^. L( h0 J' b8 v
"symbol":
"NXT2",
"decimals": 8,- {+ C" I4 V, l' `8 K% V) o2 F
"script_hash":
"0xa3640dd3c560c75528e5f861da5da98958d0d713",3 V; ^! R4 J2 ]) |* \' R; _
"contract_address":
"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":
"0.0",# t0 F; q, o% Z: k$ n/ d* r& B
"unavailable":
"7730.0". f% h$ Z9 \9 \" N) |' h
}
} P4 M0 _) x5 Z( ~' H. r l1 _/ C
10看来可以开始部署了。再次提醒,钱包密码是coz。( ]* f) M* |. D
neo> import contract main.avm 0710 05 True False
contract properties: 1
Please fill out the following contract details:
[Contract Name] > MyFirstNEOToken) T# g# O/ F! f/ Y- b& e6 S$ m- e& N! _
[Contract Version] > 1.0
[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
Author: Richie
Email: babierichie@hotmail.com 9 G' I3 @9 \4 ^+ H! V0 U
Description: First NEO Token
Needs Storage: True
Needs Dynamic Invoke: False : ?4 H4 Z' U! e( T
{
"hash":
"0x4e9b87c96158a8e2cc4b74794f727b38947e9862",
"script": "...",) X. b, F) u5 W7 F! I
"parameters":
"0710",
"returntype":
"05"
}
Used 500.0 Gas
-------------------------------------------------------------------------------------------------------------------------------------! Y9 w& g7 R X, r* X0 |$ l" n
Test deploy invoke successful
Total operations executed: 11
Results:
[]! 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
-------------------------------------------------------------------------------------------------------------------------------------
Enter your password to continue and deploy this contract2 F" L; z- q) Q8 [) n) I
[password]> ***
[I 180914 11:03:33 Transaction:613] Verifying transaction: b'9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114'
Relayed 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
{
"txid": "0x9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114",
"type":6 L, }- X9 ?5 c |6 y+ M
"InvocationTransaction",( @5 g# y6 \' h# Q5 P: ]' g( X* d" J
"version": 1,
"attributes": [],
"vout": [
{
"n": 0,
"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",
"address":
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"
}
],* K" E1 v3 i* n) H+ q! R
"vin": [
{
"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
],
"sys_fee":
"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
{
"invocation":; C' O O; N. T0 q7 h
"40510fa6630ef581108057ebe967cd306522466a32eaf068cf3717da1e640b866246c013033e3c878ebf9247a5a3500178b21b126b3af63ed07a86b0d2c4f34c89",& J/ Q5 r) Q0 o9 j
"verification":
"21031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac"
}; h( F3 d9 p* s
],
"script": "...",
"gas": 49000000000,
"height": 10302,
"unspents": [
{
"n": 0,' B$ t: g$ B2 ?
"asset":
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
"value":
"25493.9997",8 T! z. @# X: e- b9 z
"address":
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y": W/ I, s& W3 i) {/ n6 S
}
]( r2 H/ x9 e/ W( ?+ {9 ~( P0 e; M
}
12交易显示后,再次查看钱包余额。 在步骤9,我们的GAS余额为74589.9996,现在,GAS余额变为74099.9996。 因为这减少的490个 GAS已用于合约部署!0 G p( |8 B8 M
neo> wallet
[I 180914 11:18:38 UserWallet:538] Script hash
b'#\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
Wallet {3 Y; r1 U4 o' G j G; l
"path":
"neo-privnet.wallet",
"addresses": [6 R; O& d0 \, q1 Y w2 A2 M. A
{
"version": 0,4 \) Q" B: b0 {8 c
"script_hash":
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
"frozen": false,
"votes": [],
"balances": {
4 C! Q0 l; v# W+ `3 i
"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
"100000000.0",
"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,
"tokens": [
; E4 s5 p I0 H" _. t7 {4 u8 `1 ?
"[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 :1 n# Y; O+ n3 J# H0 J
2500000.00000000"
]
}" ?) y: M P+ |2 V6 x3 P4 b/ t
],
"height": 10348,
"percent_synced": 100,
"synced_balances": [
"[NEO]: 100000000.0 ",
"[NEOGas]: 48605.9999
",
"[NXT2]: 2500000 "
],
"public_keys": [
{+ Q4 X _) e: B; p3 Q
"Address":
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",2 J% Y3 O+ ^6 v! P4 v+ x6 Y
"Public Key":
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"* K( l' R. q' {0 j
}; u6 D& t6 }0 n
],0 H4 | P* f7 A: q- D. `# l
"tokens": [
{
"name": "NEX! o% V, ^0 H! k# a5 E8 @* W6 ^
Template V2",0 u! C+ c8 m$ ]) o9 n( O+ s
"symbol": "NXT2",
"decimals": 8,
"script_hash":
"0xa3640dd3c560c75528e5f861da5da98958d0d713",
"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": {
"available":
"0.0",$ z$ q- Y, r0 ^6 A+ `; b
"unavailable": "8652.0"
}
}7 G% e( E! ?9 w4 i
我们也可以看一看部署好的合约。; d" x& i, c8 G6 Q- [8 U' u& p9 o
neo> contract search My
Found 1 results for My/ }; Y! `6 H+ y3 i1 S: ]
{
"version": 0,
"code": {" d* U5 s% a# z- j( s" ^
"hash": "0x4e9b87c96158a8e2cc4b74794f727b38947e9862",: Z; F& w( h$ `! C8 i
"script": "...",
"parameters": "0710",! d% Q+ U" q, Q1 ] T
"returntype": 5
},
"name": "MyFirstNEOToken",% u* ]' Z( O" U! \
"code_version": "1.0",
"author": "Richie",, P; E+ A5 n$ Y9 h' \# D/ g# p
"email": "babierichie@hotmail.com",
"description": "First NEO Token",
"properties": {8 l0 V6 w, v( K0 e3 {* Z. p
"storage": true,
"dynamic_invoke": false
}
}! }- Z$ S; z' Q
13最后,我们可以尝试使用钱包的密码coz,来调用这个带有合约哈希值的Token。( ?5 L; d% ]5 l
neo> testinvoke P2 l& ^$ |. K- ^
0x4e9b87c96158a8e2cc4b74794f727b38947e9862 deploy []
好了,现在你已经在NEO的私有域上成功的发行了NEP-5Token。
最后
希望对于Gophers来说,能很轻松地照着本教程学习。也希望GO开发人员能加入 NEO’s Discord,一起开发学习。你一定要试一试!# q; N! u! a* n/ Q+ v
如果您真的需要我的帮助,请在Discord上联系我(LikKee.Richie#5647)
成为第一个吐槽的人