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