使用GO语言在NEO私有链发行NEP-5 Token的开发指南
V刘晨曦
发表于 2022-12-2 15:25:23
66
0
0
开发语言' {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等开发语言。.
尽管支持多种语言,但我们仍可以发现现有的很多项目使用的是C#、Python、Java,使用GO语言的并不多。因此,参考City of Zion (CoZ)上的资料,我想尝试写一篇关于使用GO语言开发的简单教程,希望能吸引更多使用GO语言的开发人员参与开发。
给GO开发人员的建议
无论你是编程新手还是经验丰富的开发人员,刚开始时都建议你在私有域或测试网上进行开发。 \" 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美元。
因此,刚开始开发的时候,建议你在私有域或者测试网上操作,当你准备好之后,再转到主网上部署合约。1 K. {; ?, h7 X1 b
要求3 q3 H3 C" l5 k- E1 u0 h' I, \
本教程中,开发环境的需求如下所示:
操作系统 – 桌面版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的资料
GO语言智能合约框架 – neo-storm
预建好的使用Python语言编写的neo-privnet-with-gas以及nep-scan镜像 – neo-scan-docker
重要提示:结果可能因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,允许您分析智能合约的部署事务。
*安装方法可能因操作系统而异。 相关的详细信息,请点击上面的链接查看。$ 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这些工具是否已经准备好。
richie@Redbuntu:~/Desktop$ sudo git --version
git version 2.17.1% B" q T W- d2 Z! i
richie@Redbuntu:~/Desktop$ sudo docker -v
Docker version 18.06.1-ce, build e68fc7a
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状态的出现。
richie@Redbuntu:~/Desktop$ git clone https://github.com/slipo/neo-scan-docker.git
Cloning into 'neo-scan-docker'...0 r% T: o( n7 s$ _( m% ]
remote: Counting objects: 27, done.
remote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27
Unpacking objects: 100% (27/27), done.0 _& o, z& @0 M8 _
richie@Redbuntu:~/Desktop$ cd neo-scan-docker/
richie@Redbuntu:~/Desktop/neo-scan-docker$ sudo docker-compose up' u! T; ?/ T- {: Y4 n' \
Starting neo-scan-docker_postgresql_1 ... done
Starting neo-privnet ...
done
Starting 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`
3在你的主机文件中,添加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`
4在浏览器中输入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。
1在终端中输入下面这几条命令, go version、dep version以及echo $GOPATH,确认一下Go, Dep, GOPATH都已经准备好。, d( ~+ ]! i1 d0 K! [
richie@Redbuntu:~$ go version
go version go1.10.1 linux/amd64) b( e7 y4 h+ x \* ]
richie@Redbuntu:~$ dep version
dep:. 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
/home/richie/go( Z8 T$ w9 F0 F7 |3 j# h" x
2输入 go get命令获取neo-storm,输入dep命令检查依赖包,使用make install命令进行安装。 *忽略警告信息
richie@Redbuntu:~$ go get -u
github.com/CityOfZion/neo-storm
package github.com/CityOfZion/neo-storm: no Go files in
/home/richie/go/src/github.com/CityOfZion/neo-storm
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
dep: WARNING: Unknown field in manifest: prune
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo make install* [5 v$ d( t3 o8 x; W, y( Q
installing project dependencies
dep: 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!
3现在neo-storm已经安装好了,你可以测试一下。
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$
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...]
VERSION:4 P' ?+ i6 Q0 a5 v; B
0.0.0
COMMANDS:" D" Y- W5 {5 y6 W- l
compile compile a smart contract to an .avm file
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
help, h Shows a list of commands or help for one command. m/ H3 M" u4 n9 D0 F# I! t4 @
GLOBAL OPTIONS:
--help, -h show help
--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
Successfully initialized smart contract [NeoStormTest]. L2 ]. e; O. N% U) L
richie@Redbuntu:~/Desktop$ cd NeoStormTest/
richie@Redbuntu:~/Desktop/NeoStormTest$ ls3 b8 ~' k9 j5 c) d
main.go
richie@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{}) {
runtime.Notify("Hello world!")( G( S- Z4 [0 F5 C
发行NEP-5通证合约
1要在NEO上发行NEP-5通证,我们必须遵守它的通证标准。 *改进的NEP5可以在Github上查看,它允许Token上线NEX交易所。% j, M1 k. t4 d1 B* M0 c
NEP-5 Token Standard
Methods+ C% [3 I4 p) R2 @/ y
-totalSupply()
-name()
-symbol()
-decimals()6 ?( k7 y! I( s
-balanceOf(account)/ G8 C8 l- |/ r# e# t1 j
-transfer(from, to, amount)
Events
-transfer(from, to, amount)
NEP-5(.1) by NEX
Methods& a) @3 j! h% O. d
-totalSupply()
-name()
-symbol()) w# f, m4 U" y. r
-decimals(). x3 v2 N; a) s0 @1 e
-balanceOf(ctx, account)
-transfer(ctx, from, to, amount, callingScriptHash)
-transferFrom(ctx, from, to, amount)
-approve(ctx, owner, spender, amount, callingScriptHash)( V- j1 D, y1 s0 g
-allowance(ctx, owner, spender)
2不用重新编写一个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
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可被分割的最小单位。
例如:NEO的小数点位数是0,意味着它是不可分的Token。因此不能转账或者接收小数个NEO,只能是整数个。小数只能在交易所使用,因为它们创建了自己的十进制系统来方便交易。6 f$ a2 G7 h( z6 d, v6 g
Multiplier:这给出了Decimals和TotalSupply相乘时的值。 输入格式为10 ^ Decimals。
例如: decimals = 6时,multiplier的值应该是10^6,即multiplier = 1000000。
Owner: Token发行者的地址。这里我们使用neo-privetenet的地址AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y。
Name: 字符串格式的NEP-5Token的名称。/ H. Y" p0 N' y5 ^6 v4 N0 A' A
Symbol: NEP-5Token符号,通常是3个字符的长度,但不是必须的。
TotalSupply: 总发行量。设置一个总发行量可以防止通胀。
5修改参数同时确保符合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信息时,会显示错误信息。
7现在讲NEP-5合约部署到Privatenet Docker。这么做之前我们需要先获取Privatenet Docker ID值,然后在主机上复制main.avm文件并粘贴进Privatenet Docker镜像中,然后将它附加到运行的Docker中。
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo
docker 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
69c60667835b 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
neo-scan
88b358cdd8ff
cityofzion/neo-privatenet # \. l' o; Q' m" ]) h# m: Q
"/bin/bash /opt/run.…"
6 hours ago Up About a
minute & @# N9 k2 ]$ }& w
0.0.0.0:20333-20336->20333-20336/tcp,
0.0.0.0:30333-30336->30333-30336/tcp
neo-privnet- J6 b0 [& [; g$ D3 S
ab96dc398c62 postgres:10.1 9 F9 K G- s# Q o \4 s
"docker-entrypoint.s…"
6 hours ago Up About a% ?0 T1 z. v* n$ L7 {9 K7 E
minute 0.0.0.0:5432->5432/tcp
neo-scan-docker_postgresql_1# n% V) c/ g3 ?1 q
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm
88b358cdd8ff:/neo-python
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it/ f4 A' x7 H! m& V) W7 K1 V
88b358cdd8ff /bin/bash
*共识节点运行在在screen sessions,使用’screen -ls’命令查看
*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解锁钱包。
root@88b358cdd8ff:/neo-python# neopy8 W" h% M$ P* [4 }1 b, X( W
Privatenet useragent '/NEO:2.7.6/', nonce: 513759764
[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
neo> open wallet neo-privnet.wallet
[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
[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'
Used 0.357 Gas v* f/ `2 P3 f9 W9 ?
Used 0.357 Gas
Wallet {
"path":
"neo-privnet.wallet",# }, {2 {9 v) r* N( w& ~
"addresses": [: N6 Y3 T8 R4 ~) \; ]
{) O5 b5 _4 `' e- K* h
"version": 0,
"script_hash":& I; `, o4 g0 e$ u" `0 a6 S8 {) M
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
"frozen": false,3 ]( U+ M& y) v4 z2 C
"votes": [],
"balances": {) N- @3 o$ \8 G% o9 p
! ]5 G7 L. {% \; D3 T8 F
"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
"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"
},/ a0 P7 q2 p/ G% \' {( i
"is_watch_only":( F$ F. G" }* r3 h* V/ n' F$ P k
false,
"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
]
} 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,
"synced_balances": [
"[NEO]: 100000000.0 ",. t$ Q& L2 J# Z! {, s
"[NEOGas]: 74589.9996
",2 p$ J2 a* V0 h# z
"[NXT2]: 2500000 "
],
"public_keys": [ i: g6 y. y- }' M) N- T0 G
{
"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
}
],; 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",
"symbol":
"NXT2",( |5 N# N' _5 y% s& E( O
"decimals": 8,
"script_hash":
"0xa3640dd3c560c75528e5f861da5da98958d0d713",
"contract_address":. |* u7 p, O! e! [4 u4 _
"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"
}
],
"claims": {( J# c+ n4 R( }7 A; p
"available":
"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
}
}
10看来可以开始部署了。再次提醒,钱包密码是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
Please fill out the following contract details:+ X4 t: C2 d- T7 K6 [) C
[Contract Name] > MyFirstNEOToken
[Contract Version] > 1.0+ V9 {" P* g' R( f
[Contract Author] > Richie
[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....
Name: MyFirstNEOToken
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
Needs Dynamic Invoke: False
{# h9 I# i! d& L: R
"hash":
"0x4e9b87c96158a8e2cc4b74794f727b38947e9862",- I5 E0 T9 F) d& @+ I+ t* [+ P
"script": "...",6 \# Z9 k" o, ]( R& j' x
"parameters":
"0710",
"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
-------------------------------------------------------------------------------------------------------------------------------------8 \4 n1 P3 o8 p6 e* Z) B# F+ F7 Q- _
Test deploy invoke successful
Total operations executed: 11
Results:
[]9 U" c* T; X& T% d- j
Deploy Invoke TX GAS cost: 490.0
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
11使用给定的哈希值验证交易。 注意:不同机器的哈希值是不一样的。
neo> tx
9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd65691145 N3 w5 l4 U) @" C
{2 v- h4 f" k" `$ ^
"txid": "0x9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114",
"type":% q5 s# O$ p: T0 |
"InvocationTransaction",
"version": 1,' W9 n$ P) b! Q0 h8 ?
"attributes": [],
"vout": [) E" [+ u, [, p5 U0 Q7 X
{
"n": 0,
"asset":' a O: _9 A/ I8 e
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
"value":
"25493.9997",' q+ }' M9 v) z. Z) x) i5 e7 V5 ^
"address":( R- G1 R8 k% G3 P
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"
}* 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":
"475a091ccaa6330320a29884f5f8796a260bdba91352dd409d16787b37d8be26",
"vout": 0! M; j- O! W6 \3 K# @
}, a" @& B' p$ [6 u9 q7 r7 K9 f
],
"sys_fee":
"4.9e-06",: H8 f( Z# ?/ n) C" d7 D: r
"net_fee":
"489.9999951",
"scripts": [
{
"invocation":$ b, A) X+ Y n4 u; Q3 g
"40510fa6630ef581108057ebe967cd306522466a32eaf068cf3717da1e640b866246c013033e3c878ebf9247a5a3500178b21b126b3af63ed07a86b0d2c4f34c89",
"verification":& B& J& a* |5 B1 o% e
"21031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac"
}
],
"script": "...",
"gas": 49000000000,7 W) \3 [8 ~% L0 `# E# `2 c6 }
"height": 10302,0 N9 N( O7 D, f9 `& m
"unspents": [
{* T- d! H9 d9 e; \& M; J& q% \1 [
"n": 0,
"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":
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"
}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
[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
Used 0.357 Gas
Wallet {( F" e- g9 {5 o7 ^6 Z8 p* o) D
"path":& y* O) ^& I; c: q( ~% r$ A
"neo-privnet.wallet",
"addresses": [1 H9 G" }1 a: A1 ~0 m& H" [
{
"version": 0,
"script_hash":
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
"frozen": false,
"votes": [],
"balances": {! A" g/ ]' ^8 k# Z
2 @3 C% |. |' {
"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
"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":
false,: H1 ?3 t/ A( Y' _
"tokens": [
& j8 `# Z% q5 V) n3 K9 x
"[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 :
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
],
"height": 10348,
"percent_synced": 100,6 w8 l, w, d& r+ _4 m! U
"synced_balances": [
"[NEO]: 100000000.0 ",6 D8 U( I# @( u; {; C8 g
"[NEOGas]: 48605.9999
",
"[NXT2]: 2500000 "
],
"public_keys": [* Y* {! ?6 t: {( n' \
{
"Address":
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
"Public Key":
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"8 @8 x: O( Y: V( l0 Z. a [ J: j
}: L# t" @) A w; x9 ~
],
"tokens": [* a$ [! Q' M, u0 P% a
{% o- i6 v/ d" d5 I
"name": "NEX
Template V2",' X/ J9 t+ D) l
"symbol": "NXT2",
"decimals": 8,: k" Z9 ?' K2 n' O; s8 Q1 s
"script_hash":
"0xa3640dd3c560c75528e5f861da5da98958d0d713",
"contract_address":
"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"
}4 E: |7 A4 A' @
],
"claims": {% t; H- L; t" S8 A' d8 o
"available":
"0.0",+ p* ?/ H0 ]3 c
"unavailable": "8652.0"! [6 O' |) ]% [+ [2 n
}
}7 X3 |% E) ?/ x- f/ u9 M. |
我们也可以看一看部署好的合约。
neo> contract search My
Found 1 results for My
{* 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": "...",
"parameters": "0710",
"returntype": 5: x5 l9 \ @, T3 w- H* ]9 X
}," `& x0 D- O' n& p) Z1 |3 S2 J
"name": "MyFirstNEOToken",
"code_version": "1.0",; |( d3 u$ V( W" k8 @
"author": "Richie",
"email": "babierichie@hotmail.com",! n; W9 n3 S) Y
"description": "First NEO Token",4 d: Y- \% e; b9 I0 b( N
"properties": {
"storage": true,& w+ a8 H: |; ^1 [) n
"dynamic_invoke": false
}
}. B* ~- d0 f j
13最后,我们可以尝试使用钱包的密码coz,来调用这个带有合约哈希值的Token。
neo> testinvoke& J1 x5 L; Y& _+ u& `7 N- t0 W
0x4e9b87c96158a8e2cc4b74794f727b38947e9862 deploy []
好了,现在你已经在NEO的私有域上成功的发行了NEP-5Token。
最后; Y: y. u" D b5 _0 _) T
希望对于Gophers来说,能很轻松地照着本教程学习。也希望GO开发人员能加入 NEO’s Discord,一起开发学习。你一定要试一试!$ x7 v/ g- V/ Q/ b
如果您真的需要我的帮助,请在Discord上联系我(LikKee.Richie#5647)
成为第一个吐槽的人