Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
介绍% ]$ q( r( O, x. G, {
开发语言
( c8 U0 V6 `# d3 D6 H在NEO智能合约开发平台进行开发的优势之一是平台支持各种开发语言。
) B5 |: M, U$ m& Q0 o% j& kNEO推荐使用C#语言,不过它也支持使用Python, Java, Go, Ruby,之后还会进一步支持Kotlin, C/C++, JavaScript等开发语言。.
, G. U' W( N# ]8 c% u; Z尽管支持多种语言,但我们仍可以发现现有的很多项目使用的是C#、Python、Java,使用GO语言的并不多。因此,参考City of Zion (CoZ)上的资料,我想尝试写一篇关于使用GO语言开发的简单教程,希望能吸引更多使用GO语言的开发人员参与开发。6 u; H" t$ J) i* r6 |$ ~
给GO开发人员的建议+ U" W5 `& v: ]  P* }* a, B, `, m4 y
无论你是编程新手还是经验丰富的开发人员,刚开始时都建议你在私有域或测试网上进行开发。2 r+ H  A4 ]  [8 O% K7 t- i. A3 N3 X
为什么?# u& t* A4 Z( w5 y; z- j  t
因为在主网上部署NEP-5 Token需要消耗490个GAS。- u" V) h: H9 a! u8 \
写这篇文章的时候(2018年9月15日),GAS的市场价格是5.8美元,那么该笔费用就高达2842美元。对于任何创业公司而言,这都是一笔不小的费用。8 `8 B; s8 q5 W% U: b" q& G
按照GAS的历史最高价,每个Token的价格为95.87美元,那么仅仅部署一次智能合约,你的成本就要增加4,7000美元。) S1 l( o8 ~; a) H
因此,刚开始开发的时候,建议你在私有域或者测试网上操作,当你准备好之后,再转到主网上部署合约。
# B3 s- l  i1 U/ N% O1 b要求% v$ Z" s# p0 I) X6 @" m' I3 C5 |
本教程中,开发环境的需求如下所示:
3 p+ Z5 g4 ~8 F" i+ S( m操作系统 – 桌面版Ubuntu Desktop 18.04.1 LTS4 \: I; z. d) {1 u5 M: ^+ \" \
Git 命令行接口 –Git( y* }/ A$ C) B$ T8 t( l
语言 – GO语言
: d: `' t: I! Y! _3 y! qGo语言依赖管理工具 – Dep+ k  `+ c; Q2 H# M
Docker –Docker CE 和 Docker Compose4 R# I3 n- Y) e% r
编辑器 – Visual Studio Code, Extension: Go
+ E& y1 u) O' z使用到的NEO的资料( e$ o0 @( `3 O. g+ @! A# i: O
GO语言智能合约框架 – neo-storm
7 O  e# _+ Z6 x7 G8 W预建好的使用Python语言编写的neo-privnet-with-gas以及nep-scan镜像 –  neo-scan-docker& L0 Y5 j6 L1 a! ~3 x
重要提示:结果可能因NEO编译器和节点版本不同而有差异。5 [) ^+ ^( O" p& K
本质上来说,有几种方法可以运行私有域,例如使用 neo-go 或者 neo-privatenet-docker。 但是,在本教程中,我们会使用slipo编写的 neo-scan-docker。 neo-scan-docker是用neo-python构建的,所以它带有一些“Python”组件。 此外,它还带有neo-scan的UI,允许您分析智能合约的部署事务。% r  l# ?4 |9 X, w# O) [
*安装方法可能因操作系统而异。 相关的详细信息,请点击上面的链接查看。
: E2 x0 i7 u) M* ~2 A5 v# A# h配置你的环境
! }' S- \/ u3 U# `+ Q' O- ~首先,我们先用 neo-scan-docker来配置一下NEO私有域。
( v2 {* R! K9 h* q* Q" `7 T! ~" p1 检查一下Git, Docker and Docker Compose这些工具是否已经准备好。' ?% _+ u2 u1 V( W; T7 B
richie@Redbuntu:~/Desktop$ sudo git --version, q0 Y; ~) e2 @4 u3 T6 P3 a- I9 u
git version 2.17.1( u. \$ R4 w1 z% T2 V* M
richie@Redbuntu:~/Desktop$ sudo docker -v1 s7 i5 v7 q1 J% r! }' M
Docker version 18.06.1-ce, build e68fc7a% t7 B; M3 C* L
richie@Redbuntu:~/Desktop$ sudo docker-compose -v6 w2 r: U; y$ ?- D" D- b
docker-compose version 1.22.0, build f46880fe0 A* P& @: f0 d6 y. N* j
2克隆(Clone) slipo的 neo-scan-docker仓库代码,并使用 docker-compose来加载Docker镜像。 下载镜像可能需要点时间,请耐心等待done状态的出现。, O" R& C. u3 w7 ^. `# e
richie@Redbuntu:~/Desktop$ git clone https://github.com/slipo/neo-scan-docker.git& t) ~9 j8 e: F- a  b) l* I
Cloning into 'neo-scan-docker'...
+ I& s3 l' a4 ]4 gremote: Counting objects: 27, done.
( {5 s1 v' }* A- @remote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27
, a$ p( c- L4 P: |8 ]* I# dUnpacking objects: 100% (27/27), done.
  w$ _! N2 m/ W% r3 D, y# l  K& V" s0 Drichie@Redbuntu:~/Desktop$ cd neo-scan-docker/
8 R2 @" \' {7 q7 j  E( Vrichie@Redbuntu:~/Desktop/neo-scan-docker$ sudo docker-compose up$ W1 w# F4 `5 l+ X6 {# F9 ^& ], d
Starting neo-scan-docker_postgresql_1 ... done
" h+ \9 E9 ?6 rStarting neo-privnet                  ...
. a  k+ c6 ?# N. r  J' }0 Vdone
% i: S/ _1 S: B5 A7 C7 bStarting neo-scan                     ...
3 j; x" k  _) y4 j. {1 z& a3 kdone& F) l/ O) v7 S/ F% ?$ w) [# ~/ s! t
Attaching to neo-scan-docker_postgresql_1, neo-privnet, neo-scan`
. T8 A- F0 m! T0 V7 |% l: ~/ s3在你的主机文件中,添加127.0.0.1 neo-privnet。注意:主机文件的位置可能因操作系统而异。
% E' C8 E( t- x. t+ BUnix/Linux/macOS - /etc/hosts
1 Y( n2 s; j& pWindows          - C:\Windows\System32\Drivers\etc\hosts`
( s8 Z+ ]' ~# Z3 k8 a7 |  m4在浏览器中输入http://127.0.0.1:4000/,可以看到City of Zion (CoZ)提供的neo-scan网页界面。/ ~1 a) ~9 @7 q& M, r5 Q, K
5 p( ]+ }" X3 S2 T7 _. S- w& ?
5点击钱包地址(Wallet Addresses),你可以看到预存有NEO和GAS的钱包地址。部署智能合约的时候我们需要使用到这些Token。更多信息,可以查看 neo-privatenet 。0 q+ h" S2 n5 q
导入WIF密钥可以获取预存有NEO和GAS的钱包的密钥。 私钥/WIF 密钥 KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr 地址: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y 脚本哈希值 (用于检查): b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
! G4 J, Q# f  t; E7 a( P! `这样你的NEO私有域和neo-scan就已经配置好了。
5 Q% ^& S: x  {- L$ l7 J) J+ R下一步,配置neo-storm。8 l$ ~" V$ X! |
1在终端中输入下面这几条命令, go version、dep version以及echo $GOPATH,确认一下Go, Dep, GOPATH都已经准备好。
) F, L/ N6 x/ p- ~5 s* i' i' ~richie@Redbuntu:~$ go version% O2 ]9 @) q, e+ B+ p& p
go version go1.10.1 linux/amd649 z" F: g4 k9 p) s, V. {* U+ P( L
richie@Redbuntu:~$ dep version- A8 I$ X! t9 p0 J- U
dep:$ |9 s, y+ ~- P% C  q: {# M: S! x& f
version     : devel1 X6 }. {' O0 p% @4 y: [; i
build date  :
" |: M8 e' i/ a3 F- p+ b git hash    : : ^% ^6 A+ |7 ?$ U
go version  : go1.8.3
3 [3 h! y* R% \  {; W: S go compiler : gc
0 \4 y+ u3 V/ E& J8 p platform    : linux/amd64
3 Z4 W5 X9 x3 j  Orichie@Redbuntu:~$ echo $GOPATH
4 v4 D9 A6 \& J2 [$ R1 E) ^. }/home/richie/go
4 \1 ]  D1 G0 B8 B) y9 x7 w2输入 go get命令获取neo-storm,输入dep命令检查依赖包,使用make install命令进行安装。 *忽略警告信息! [' P# o0 b0 T1 f7 l( ^
richie@Redbuntu:~$ go get -u
  G5 `3 D, d4 T  `4 ~% C! c2 ugithub.com/CityOfZion/neo-storm) n: N6 w  D) G0 G3 h8 @' g4 \! @
package github.com/CityOfZion/neo-storm: no Go files in" ?% K& n4 N& k  X, B! u
/home/richie/go/src/github.com/CityOfZion/neo-storm
+ i- b( {5 D$ [! C; l& E0 J; Trichie@Redbuntu:~$ cd $GOPATH/src/github.com/CityOfZion/neo-storm1 P- N2 H9 O2 k$ a
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo dep ensure
! X8 i/ p8 R; t6 b6 ~! A* l-update9 j" }/ t) I$ J8 a, z
dep: WARNING: Unknown field in manifest: prune
) j2 c2 [- H7 _  d* Zrichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo make install0 m% X; ?" h" k" B" }7 g  h# H) P$ C
installing project dependencies
& m2 a3 q. h# ]1 Xdep: WARNING: Unknown field in manifest: prune8 C& I- P& x: u( N8 f, m+ p& i$ z
installing neo-storm framework
6 u1 b( y4 a$ u0 }- t, k& Idone installing, happy coding!
2 K) M- C) n# B0 R$ z( ]3现在neo-storm已经安装好了,你可以测试一下。  @4 e6 h( R: C0 G3 [6 C% j2 z+ i
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$) c; Z9 E5 z8 E$ u: a1 w
neo-storm& M/ S% k/ t! Z0 S2 [  C
NAME:
; p  A1 R$ k: f2 _- b5 x2 U/ Z5 g- ~   neo-storm - Neo smart contract
0 h8 `! ?- q# m& ~6 V% K4 kframework for the Go programming language
' @, l, V$ c! @: ~& D8 j) LUSAGE:. Q( ]. C% h+ ~; u
   neo-storm [global options] command[command options][arguments...]  i0 \" M: `5 q; u. \+ a
VERSION:8 U, o$ ~/ Q1 i
   0.0.0
- Z1 S: @7 P& W( ~+ S' YCOMMANDS:; A) [+ P6 h: Y' |2 y) c. d* O1 N
     compile     compile a smart contract to an .avm file9 ^# u) E8 V+ ^% d( O
     testinvoke  testinvoke a smart contract against a remote NEO RPC node& c6 g. `; I& }6 l: e
     init        initialize a new smart-contract in a directory with boiler plate code8 B- h, q% E5 F. b) e0 R' {
     help, h     Shows a list of commands or help for one command
) a6 y4 Y( y% Q' u' GGLOBAL OPTIONS:# H# ]) ?9 n% c; f3 \, L1 {! [
   --help, -h     show help
0 y( e/ s# `; E) x6 W- s   --version, -v  print the version
: W/ b# |/ p! ]# W2 @/ Q+ U4“安装完成,开心编码” ——接下来开始我们的第一个智能合约吧。
$ D3 E7 U0 p/ x( erichie@Redbuntu:~/Desktop$ cd ~/Desktop
" ~2 n' W8 E& `% ?2 [! mrichie@Redbuntu:~/Desktop$ neo-storm init -n NeoStormTest' y9 l- b6 Z/ G! J
Successfully initialized smart contract [NeoStormTest]' m- M2 l; N& z7 {
richie@Redbuntu:~/Desktop$ cd NeoStormTest/  {3 r: I) N; w! Y
richie@Redbuntu:~/Desktop/NeoStormTest$ ls
* ~( A! b- o) b( _3 a! i' X/ Ymain.go2 g$ B0 Z3 z% i! b
richie@Redbuntu:~/Desktop/NeoStormTest$ cat main.go( G: O) i$ s- v6 h; J
package NeoStormTest
! _  O2 o3 @+ q5 c' F+ zimport "github.com/CityOfZion/neo-storm/interop/runtime"
# b! V; d8 ]- k: G# A) Kfunc Main(op string, args []interface{}) {/ g* w# P0 I0 D& D' D0 L! e
    runtime.Notify("Hello world!")
* \2 t$ k9 g6 G$ E7 A2 U8 O发行NEP-5通证合约+ U1 f/ g5 F) v6 h* {( N$ M1 h4 ~
1要在NEO上发行NEP-5通证,我们必须遵守它的通证标准。 *改进的NEP5可以在Github上查看,它允许Token上线NEX交易所。
  C2 s8 N; _$ v/ NNEP-5 Token Standard
6 B; t( Q7 F- QMethods9 d+ O6 T  l/ Q2 l5 O9 e; c
-totalSupply()  n' X) Q! M4 i/ l6 j- G& S- d
-name()
9 Y* Z& f# k2 u5 o+ s-symbol(), C# E* Z$ G6 H5 [3 W
-decimals()/ `2 x6 t% k; M/ r9 _( }* `5 L
-balanceOf(account)
3 M/ @6 L0 {$ h5 |6 m-transfer(from, to, amount)
! W, ^1 Q% h# ?0 f  U4 eEvents8 D8 n$ ?+ [# d2 ~
-transfer(from, to, amount)
: n5 e5 `& x0 dNEP-5(.1) by NEX
$ a. `1 B1 _" E7 YMethods
9 r; c. f: k7 j5 |-totalSupply()
. B: ~$ t8 V" H& |-name()
: N' T* {. a' v. R6 |-symbol()/ q+ r- _& f" C+ y# U6 x. _
-decimals()
9 z( \4 ]+ f' t-balanceOf(ctx, account)
! A; |# G' j, L1 X-transfer(ctx, from, to, amount, callingScriptHash)
5 K8 e8 p1 E+ }3 T9 H$ D; O-transferFrom(ctx, from, to, amount)
+ @% ^) d/ K' m' e; X-approve(ctx, owner, spender, amount, callingScriptHash)
7 _1 [, b- c: s! I" d-allowance(ctx, owner, spender)
( T# C* w2 s! M2不用重新编写一个Token合约,你可以fork/clone我的github仓库。
' o) w- h, v: _richie@Redbuntu:~/Desktop$ git clone https://github.com/maplerichie/neo-go-nep5 MyFirstNeoGoContract
. c9 E2 L( X; g3启动代码编辑器(我用的是Visual Studio Code),将~/Desktop/MyFirstNeoGoContract 添加到你的工作区(workspace)。Neo-storm的examples文件夹里也有例子,可以点击https://github.com/CityOfZion/neo-storm/tree/master/examples/token查看。- D& x  E1 d! N9 _0 T1 h

! ]# M" @& N% shttps://github.com/maplerichie/neo-go-nep5/ x$ [; ]1 E5 p% i3 F, x2 S  D6 `* J! g0 |- `
4编辑package,修改NEP-5的属性值,例如decimals, multiplier, owner Address, Name, Symbol, TotalSupply。4 i7 z) \4 p3 y8 c
Package:应该将package修改为 package MyFirstNeoGoContract ,从而与文件夹名称保持一致。* _* w4 x7 z0 c; u% \3 s$ m0 Y
Decimals:用来设置Token使用的小数位数或者Token可被分割的最小单位。) |! [  n+ G( A. `& t2 Y; C$ _
例如:NEO的小数点位数是0,意味着它是不可分的Token。因此不能转账或者接收小数个NEO,只能是整数个。小数只能在交易所使用,因为它们创建了自己的十进制系统来方便交易。. `- P; d# D; {4 w# ?% b
Multiplier:这给出了Decimals和TotalSupply相乘时的值。 输入格式为10 ^ Decimals。
( r7 n" S5 E$ J+ K: a例如: decimals = 6时,multiplier的值应该是10^6,即multiplier = 1000000。3 X; \* n9 u  v! N) k5 Y
Owner: Token发行者的地址。这里我们使用neo-privetenet的地址AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y。, h3 X1 V4 S+ h. B2 V6 t' k; g
Name: 字符串格式的NEP-5Token的名称。
" \" D4 m  j" k/ D7 KSymbol: NEP-5Token符号,通常是3个字符的长度,但不是必须的。8 |$ [7 m# @* ]9 {/ q5 p+ q8 [4 ^) ?' D
TotalSupply: 总发行量。设置一个总发行量可以防止通胀。! e3 W1 F6 d; J+ B8 k; r. i
, L& _- [# v% l2 s9 ]% K8 \
5修改参数同时确保符合NEP-5Token标准。然后使用neo-storm来编译GO智能合约。
  {: F, p, q6 lrichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ neo-storm compile -i main.go -o main.avm
3 B% A: C* H) M& r) N6当前目录下你可以看到 main.avm文件。现在neo-storm不会运行检查NEP-5Token标准。我的经验是缺少owner Address信息时,会显示错误信息。. p2 l+ f% w- x; Y8 c2 S
7现在讲NEP-5合约部署到Privatenet Docker。这么做之前我们需要先获取Privatenet Docker ID值,然后在主机上复制main.avm文件并粘贴进Privatenet Docker镜像中,然后将它附加到运行的Docker中。% t+ @* C& u7 b! ?
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo
# }. |% p* t# P6 P' Qdocker ps
- _' b0 r) P1 O5 ?+ X: l( L4 U) NCONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                                                       ' ~. X4 j" r# l& M
NAMES
. P$ L( v: [7 J0 e, @4 a69c60667835b        slipoh/neo-scan             "/bin/sh -c 'sleep$ `$ y6 ?! ?8 q7 I# U) L. T' [
3…"   6 hours ago         Up About a minute   0.0.0.0:4000->4000/tcp                                                      - S: k3 X0 s! u; W0 j) H. M+ `
neo-scan- \$ B; t7 q$ r% R& J
88b358cdd8ff      
, N5 Z4 F5 C) T% Hcityofzion/neo-privatenet  ; m# i$ k6 M8 \, d* T' F2 A& t( L) a0 ?
"/bin/bash /opt/run.…"  3 u7 b5 @1 A  Y  U; m- k
6 hours ago         Up About a- Q" ]( V7 J2 Y& \/ i' n4 S
minute  # v. c6 a! O6 G0 ]
0.0.0.0:20333-20336->20333-20336/tcp,
8 E6 J: L) J9 c' x8 v2 j9 M0.0.0.0:30333-30336->30333-30336/tcp  4 M2 g/ A2 |; \+ R6 n$ h
neo-privnet
1 K0 R: V! t" t' i0 fab96dc398c62        postgres:10.1              
5 _: n4 {3 w" B  i1 @2 w"docker-entrypoint.s…"  
& [- V5 O2 @; M" O# Q6 hours ago         Up About a9 [2 Z! ^7 ]; c7 r9 K; e7 e
minute   0.0.0.0:5432->5432/tcp                                                      
9 Q) Y+ s3 E5 T1 T3 Y7 aneo-scan-docker_postgresql_1
" l8 Q8 ^+ k& hrichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm8 c  e( F# B# E) I4 O7 _+ k; T
88b358cdd8ff:/neo-python+ X5 p) D: P8 L, q  R) I
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it7 P" \2 {/ ^- x
88b358cdd8ff /bin/bash
1 F/ h5 w0 X9 O1 M' v*共识节点运行在在screen sessions,使用’screen -ls’命令查看
" d# p/ X: W2 Z% `/ p*neo-python安装在/neo-python目录下,目录下带有a neo-privnet.wallet文件
' D1 b. ?% ]- y! H' u/ P5 t*有问题可报告给:https://github.com/CityOfZion/neo-privatenet-docker$ B9 R5 ^1 c' W* }# e+ \# ^% O! j
8在Docker上,打开neo-python-cli终端并使用密码coz解锁钱包。
& N% R. W' j: V2 N3 M9 k: @root@88b358cdd8ff:/neo-python# neopy3 T8 a" c: }' A  ]% c/ m3 {- @5 [' E
Privatenet useragent '/NEO:2.7.6/', nonce: 513759764
7 j% N( g: r4 U+ k/ z[I 180914 10:34:09 LevelDBBlockchain:114] Created Blockchain DB at /root/.neopython/Chains/privnet# M: Z9 u! l" G2 B- s
[I 180914 10:34:09 NotificationDB:73] Created Notification DB At1 y2 Q6 i/ S, w/ O" P  I
/root/.neopython/Chains/privnet_notif
9 G  S9 `* W# CNEO cli. Type 'help' to get started) t+ H' B/ {! S8 {( [3 m6 ?  t
neo> open wallet neo-privnet.wallet
- W1 @7 t$ d+ O[password]> ***0 @7 x: s2 P2 ]0 t3 G
Opened wallet at neo-privnet.wallet
' l. E% y4 ^& a5 S" ~$ U9部署合约main.avm前,使用neo-scan看一看钱包余额。
9 Q! Z0 [/ A* J0 J* ineo> wallet. A3 z" i7 v- W9 {
[I 180914 11:01:22 UserWallet:538] Script hash) Y6 A, n8 s* M$ v
b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
8 o, l# C6 j4 P  S" D0 `Used 0.357 Gas ' E! D! t0 j& ]$ y, w1 b
Used 0.357 Gas
. q9 c1 a8 ]: B+ }+ qWallet {7 r3 B: R8 N4 f$ s
    "path":) R) C# V( v6 ^% r6 J' J
"neo-privnet.wallet",$ R& ^1 L# n+ c& m& E
    "addresses": [; j" v4 N  [; J1 n9 G' E1 J
        {
* W- z5 ?, V/ v' N4 D7 t" B            "version": 0,  d6 }7 a) P; G
            "script_hash":
6 _  ?8 D3 D, }% S"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",  t$ Z8 D$ u  g9 @# ?4 L
            "frozen": false,$ u& f/ k# u1 K* C& g5 l( F  ~
            "votes": [],* Y; C6 w( }% s; ?
            "balances": {* y! z4 Z6 {' ~; F# }9 {9 q
         ; t/ X. ?, z& |$ Z, q) |- M
"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
! A+ x% V& D+ U$ _6 k"100000000.0",7 a9 R) X$ m$ o3 W3 i4 O/ Z
              * [3 [; p1 I* g+ y. k$ F% z, l
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
! K9 ?1 o8 a) ["74589.9996"
! U& \0 W/ E& u& `# {. r" k            },
8 g) {7 U% q- P' @% h8 Z, R            "is_watch_only":2 O, m1 P2 Z8 _1 `* s: t
false,; l( b$ L! A/ u9 Z8 \
            "tokens": [
3 ?8 [" L9 E7 G8 Y7 X5 R% K4 h$ O! U1 l                "[a3640dd3c560c75528e5f861da5da98958d0d713]
: u- ?# f- z( V6 e" VNXT2 : 2500000.00000000"
9 ~2 @: v+ t, Z/ b" [3 c6 P. j            ]
; `% E- g6 \3 x7 o9 q) e9 ^        }
. E1 v2 {2 E9 F# ?- ~    ],6 U  v  ~  d5 y/ d  C
    "height": 10294,
2 w& _; K) [8 A) ]# e    "percent_synced": 100,
9 ^( Y! |- Q8 X% U    "synced_balances": [  N+ Q9 k( \  G" X( F2 o1 h
        "[NEO]: 100000000.0 "," j# e2 E& n8 [% U8 h; ]
        "[NEOGas]: 74589.9996$ B4 s& K2 b, _
",
  h; P, [! o% O+ }$ v. ]2 h        "[NXT2]: 2500000 "; r% _" w% V* V3 C( R; u
    ],$ u1 `0 n5 [. {  a, d
    "public_keys": [" c& k/ ?$ |4 V: I( j/ l
        {2 B+ V$ @  d2 V- ~' v( }/ H  x
            "Address":
$ }9 i& ~3 W& g"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",5 h0 p8 z5 k! @; T5 a
            "Public Key":1 |! x3 G; V& H% v- P- y
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a". s$ y* E6 M* n. v$ w9 \
        }+ d) H& [5 ]" L9 X7 s& i# S0 I4 d
    ],
0 c8 x. X$ y' e% r4 F3 v6 k7 n( g- E    "tokens": [
- s( v" P3 Q6 ~        {
* f# j* F4 f$ Z0 h9 R            "name": "NEX) ~( ~7 s- k/ c; ?5 k, b
Template V2",
2 e' X' {1 K2 L% Y$ @4 q2 d            "symbol":
( [" f$ R5 u% ]: ^. b8 W"NXT2",5 A. Q$ L' c, E
            "decimals": 8,
8 C, a; m/ }4 U# z: F            "script_hash":
  A+ b2 }4 i3 x. Y$ Y, w, F"0xa3640dd3c560c75528e5f861da5da98958d0d713",% M( g; ^8 C, _8 a2 k( |. K( ^8 {* Q
            "contract_address":1 k- u- z4 l3 e, s7 c
"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"9 v$ Z% F. P! R  Z/ ?- H/ B+ z
        }
6 a; W6 X9 K8 ^- o) _    ],3 A4 ]+ w7 e5 [2 C  A7 m' K
    "claims": {
5 M, ^+ b  L4 `8 w        "available":
0 W( H: {! L1 P) B"0.0",
- W/ q+ w  L+ z        "unavailable":
! G* w& W" Z4 a& S! M9 K1 h: L' Q"7730.0"
$ N# M7 m- \  L    }
' n0 e* ?+ P! w8 H6 Y- d; C; d}- {+ I6 e7 |1 [7 c& T' n
10看来可以开始部署了。再次提醒,钱包密码是coz。
2 O. r, A( y. v/ Wneo> import contract main.avm 0710 05 True False / _! I0 e6 G+ O# n3 ?- E$ ]
contract properties: 1
$ o  g8 U  K' W, R) _Please fill out the following contract details:
8 _2 Q) q9 |& r+ n% m2 r6 @4 @3 }. k[Contract Name] > MyFirstNEOToken, `; a* g; I' h3 f( X/ P4 P
[Contract Version] > 1.00 k1 g* x+ I& O; w& I4 O
[Contract Author] > Richie% t0 V7 |* ~! o( R/ T: u% ^
[Contract Email] > babierichie@hotmail.com
9 ?  z. G2 `9 Z' A- Y- P0 o  }8 `$ L[Contract Description] > First NEO Token
2 b. v0 U/ l% K2 X( m- jCreating smart contract....
  u9 w+ T' j) S) L' i- j                 Name: MyFirstNEOToken : m5 e, e+ u, q2 W- T6 t4 C
              Version: 1.0
5 z5 e+ P+ N/ w               Author: Richie
, ?6 S% V1 w; A2 ^  k                Email: babierichie@hotmail.com " j* [% B  b) b
          Description: First NEO Token
' T" f. }' q% l! h3 i  q        Needs Storage: True
6 \* q3 d. @, t7 g( a' q  ` Needs Dynamic Invoke: False
4 I2 B5 u$ v5 p! k{
" G, u$ Z4 z% @    "hash":
* L$ ]7 e+ _/ R"0x4e9b87c96158a8e2cc4b74794f727b38947e9862",: u* E  K- q" Z2 W& @
    "script": "...",
$ a+ Z1 H$ U. T8 B. ~2 v    "parameters":
' M1 `+ ]: `# v+ ^" N% J  G9 `"0710",
; y5 O; p7 @7 J% b* ^+ Y4 ]/ A    "returntype":' G8 Q! L3 Y9 v3 t  r
"05"
, m3 [$ n- C! D0 }8 N}
7 g" ^" P' e/ n6 K3 N$ sUsed 500.0 Gas
8 s+ |% C$ e9 {-------------------------------------------------------------------------------------------------------------------------------------$ u. ~. {4 l/ x- Y/ {% y7 l
Test deploy invoke successful
8 O- C6 u! [* m3 P0 oTotal operations executed: 11 / }# N* g9 u* q1 C9 [
Results:
0 `+ t! l- O* c& [, T[]
& v  F4 r( a6 t) oDeploy Invoke TX GAS cost: 490.0
% F2 e( C7 {+ UDeploy Invoke TX Fee: 0.0
7 b  W  J$ H; m8 F-------------------------------------------------------------------------------------------------------------------------------------
! `9 y0 v( e( ?Enter your password to continue and deploy this contract
* d, c* B$ t7 |  Q3 y[password]> ***
4 q/ h9 y: _$ V[I 180914 11:03:33 Transaction:613] Verifying transaction: b'9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114'1 _$ W  W9 k* X7 ]  _
Relayed Tx: 9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd65691140 b, y# i' t# {6 b& e
11使用给定的哈希值验证交易。 注意:不同机器的哈希值是不一样的。
% h4 y4 J7 X0 A* ^$ `$ Gneo> tx
: A  }) G: B( ?5 }* Z0 w6 \, f6 g- W9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114
' }) n, f% ?7 X) {{
5 g) H1 }' B9 c. A" W    "txid": "0x9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114",
; f! k5 \* C  S" w    "type":
1 u: a* ]( }: e9 h"InvocationTransaction",5 L/ c! z, d" F; U
    "version": 1,
0 ]8 P# k- c; l6 R    "attributes": [],; W5 T8 n% S8 Y+ w6 T4 H8 o. M
    "vout": [
$ L* q% k; T3 b& O, r        {: H( A0 c; Q( [7 q3 P
            "n": 0,
( n! X4 _( Y  t/ ~4 F! w- [            "asset":" O/ A7 R/ j# x2 N% }% k  {
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",! I& \! V1 e  |5 i
            "value":
) A0 |% |# v; I& u/ p  T( E6 l"25493.9997",) L) z! U1 u0 y: X8 W
            "address":
# _$ X% g( l4 l1 E"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"
4 Y6 |6 F. |) R$ C        }
. {  [1 V; V* t' w$ l    ],
. [4 |8 \9 |; S+ M    "vin": [, @: F- s$ m  G3 F' a; t
        {4 }" [. o, u  U* i" n) j. j, Q
            "txid":
5 Q0 q% ^$ E% C"475a091ccaa6330320a29884f5f8796a260bdba91352dd409d16787b37d8be26",: p/ H5 d! O: F% a
            "vout": 0! ]. X. A6 `% F0 Q9 Q1 _
        }
0 ~) R; a6 H5 Q  y# D; ]    ],6 \: r  B) [( d/ Q; \* W
    "sys_fee":
) a1 p+ e. f7 P7 G. S  H( H4 E"4.9e-06",
+ M; Y+ j0 c) S7 G6 G; E7 O+ v( p; i    "net_fee":
9 v& n! H9 a9 G7 V+ o6 X"489.9999951",
3 J4 e5 `! b- K. h% m1 T2 E    "scripts": [
. S' _6 x9 H- M& c" d0 k5 Z* t6 i        {
, a0 O% x3 p1 v. ?            "invocation":
. `& m' i, ~( c: V9 K8 y2 p( M"40510fa6630ef581108057ebe967cd306522466a32eaf068cf3717da1e640b866246c013033e3c878ebf9247a5a3500178b21b126b3af63ed07a86b0d2c4f34c89",3 g7 e, V' P1 s
            "verification":$ ]9 p( ?/ @0 P& b! P1 s8 t0 ~
"21031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac"
6 l; r5 Q. s/ A6 B7 O- S        }. W3 I6 t! {9 {/ z: p
    ],
4 K# R9 R! O% Q* A# d% m    "script": "...",
2 R! Q: q- |2 [0 k    "gas": 49000000000,
! f) q# v' O% O+ U3 l& U" n- t    "height": 10302,, K: E) D$ O2 t9 o* z/ A1 e
    "unspents": [
0 W9 f( Q3 O4 F2 j* F: W: U. d        {: d) d9 z) p6 e3 k! F: P: @
            "n": 0,
5 E  u2 T: s6 `) P4 S; ]+ ~1 M% g/ n            "asset":5 z* W3 N- t+ T# g
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",) r4 S2 [' x1 U  o) z
            "value":
0 j: K6 F" C8 s  \  y, _"25493.9997",
8 z, C" Y$ h' d  E6 o            "address":2 T. Q* H- E" [) L9 }
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"+ `9 O  A! E" S' X5 a
        }
% u9 o9 ]% z. {9 r    ]
+ u/ z: r; B- h; ^/ [+ b( \) n}6 y: V: s/ y9 U6 X
12交易显示后,再次查看钱包余额。 在步骤9,我们的GAS余额为74589.9996,现在,GAS余额变为74099.9996。 因为这减少的490个 GAS已用于合约部署!. `! B. ?. D" D( A0 N
neo> wallet
9 B) a7 G; _5 ^[I 180914 11:18:38 UserWallet:538] Script hash
6 \& ~0 n' K& p  Q$ s6 y1 b3 v4 Vb'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9' ' m3 N/ B/ g6 a; I6 y; u0 s2 A: _
Used 0.357 Gas - w6 ^3 ~  r+ @4 z: {
Used 0.357 Gas 3 f+ D" }( V+ Q7 L) r$ H
Wallet {& [% q8 g) R( a3 ]: v. V
    "path":2 @7 E- S1 j2 y8 x
"neo-privnet.wallet",% [, U7 Q/ P7 y$ X: e
    "addresses": [, C: u, `. }  t8 u& R6 S+ M% o
        {$ Y0 e1 i6 J$ P6 Q% i9 N
            "version": 0,
8 s7 {+ k* D7 L8 D8 b( ?0 M            "script_hash":
# L. @0 ]! ]  B1 s( J* [( d2 R"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
5 O  k$ x1 J( @' p. K- ]9 v            "frozen": false,  W" M! @( X; i! X) [
            "votes": [],2 J( G2 F# c6 ^& v- O: Y& H4 t8 F: i
            "balances": {
2 U' N2 c0 }7 u+ ?* Q4 ^; x- K               
3 V% d2 ]3 x& g, y( W$ A3 I"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
  C! f) e! R; |- F) v3 `  h, f"100000000.0",# A( S+ ^5 D6 m7 g$ B& Q' @4 q# z
               & j% G3 |, l& o& X6 {
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":# z0 f3 o5 U. ]% j2 C- u% b
"74099.9995"
. I4 y: E* D* w3 v            },
  ~* L9 V; W0 C: c& j            "is_watch_only":! x3 a, O* h, R( H$ M
false,
/ j9 X$ C1 d' b/ ?8 H" z7 N            "tokens": [* N: u. u3 i2 n3 V
               
$ Z/ l  d1 X1 l; G% B4 c"[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 :% {* p8 \. r* [5 ~
2500000.00000000"
% b  t3 A! C2 W' ?' r$ h3 A            ]
% a2 @( a# a, T! n6 c& D9 U        }& W" H( h, C+ f1 j2 s* H
    ],
" V& r9 a5 t; v8 e2 p; Z; r    "height": 10348,
+ s% f1 T3 A" ^# W  r0 N    "percent_synced": 100,  j, t9 ^2 `0 T" Q( ^
    "synced_balances": [* D( b- U3 ~$ o3 s- \
        "[NEO]: 100000000.0 ",
" k9 D0 m0 ]2 q) N2 j        "[NEOGas]: 48605.9999
" ]# S4 Y5 ]' {) v6 Y",
/ e. q; q% p: r0 C& d6 l4 L        "[NXT2]: 2500000 "
5 s. x8 `+ j5 G9 f    ],
% z5 W* r1 K) A9 ?- w    "public_keys": [% Q# Z6 G! I. u* e( n1 J- t! h" X
        {: p  r5 W# b( M. a2 d
            "Address":
7 n( |/ a- Z+ x* Q2 T"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
; r) F. E* W6 z, O  v8 M# D            "Public Key":
4 {; h( a( r; P  U- g( _"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"0 M% x: ^3 G& N2 l" T* T, L
        }, ]- \3 c/ [& d; K- N0 M
    ],
7 A( n# P" W5 Y" H; ]" f8 w    "tokens": [! l9 Z/ \$ K0 t
        {! a9 V$ @( M/ [3 T! r/ d' h2 B# X1 _
            "name": "NEX
5 f1 j9 P/ k4 P) tTemplate V2",
1 O" [: O: [. H( T            "symbol": "NXT2",* l3 t9 e9 K( j, ~
            "decimals": 8,
% l3 F, X! K& V5 Y* t            "script_hash":
* |. `+ n, u/ ^6 M"0xa3640dd3c560c75528e5f861da5da98958d0d713",
# @; e% u% k3 B+ K* }7 a            "contract_address":
1 _( X. ~1 F" p"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"
) O& Q7 S1 L1 ^: q, Z        }
4 K) j2 R/ B4 y    ],
6 J. R6 W* k& ~# e3 J    "claims": {
( V$ \& M* V) U* ]        "available":
! L$ @6 a( B4 j2 S  N"0.0",+ O# u7 y! g( y* C  `" X
        "unavailable": "8652.0"" n) @: e5 h. r$ W4 T- V  A
    }) t# G' ]) T* ^) ]6 a
}
( e. g( i% Q( d8 I- |我们也可以看一看部署好的合约。$ Q8 |# L( Z$ Y  B! l  X
neo> contract search My
, i* `7 h2 ~: K$ bFound 1 results for My) y4 L& e; ?/ O9 e& J# {7 |( R  N
{
) l" t. ~+ I% \0 `( K    "version": 0,
% q3 L! e# ?5 i/ v4 f, _: l* R    "code": {
) S; Q+ k" z: [2 v- v; p        "hash": "0x4e9b87c96158a8e2cc4b74794f727b38947e9862",
2 F! U/ f( E( p        "script": "...",
! ?8 t: Z1 `( [5 {        "parameters": "0710",
3 b* ]& H* h, P" F4 H% @        "returntype": 5, Y- z7 Z7 @% I/ @5 y1 V
    },
8 o+ e6 D' B) b7 r# X8 K" ~    "name": "MyFirstNEOToken",* P3 q7 E# z. e/ }' y, }; X
    "code_version": "1.0",
6 n0 P, X' Z) C& I' m+ p    "author": "Richie",; J2 s% h& W( I4 L
    "email": "babierichie@hotmail.com",/ s' M7 `- W6 ?0 c
    "description": "First NEO Token",
( x# ]2 V$ M/ ]% w0 A    "properties": {
6 x" [  u9 D! t( M8 B4 R        "storage": true,3 P# {2 o% _$ p) G' p, q1 d
        "dynamic_invoke": false
6 w% ]% M0 Z3 N0 _! W1 y$ m  |    }6 g" h! M; Z5 `+ ?0 B
}! c1 W- z+ I4 `6 R! N! Q1 C  `
13最后,我们可以尝试使用钱包的密码coz,来调用这个带有合约哈希值的Token。
& V& R5 O2 b3 T& j0 P9 p- }+ a! fneo> testinvoke8 l$ Y6 U# F: P2 N1 R3 l" P
0x4e9b87c96158a8e2cc4b74794f727b38947e9862 deploy []1 i9 C; ~: d! `/ z* V
好了,现在你已经在NEO的私有域上成功的发行了NEP-5Token。" v8 P$ V. @+ c# A2 S& c
最后) s1 t% V' r0 g% x+ J- u
希望对于Gophers来说,能很轻松地照着本教程学习。也希望GO开发人员能加入 NEO’s Discord,一起开发学习。你一定要试一试!+ y4 [) c* W6 e. S4 B6 _) J# R2 ?) C
如果您真的需要我的帮助,请在Discord上联系我(LikKee.Richie#5647)
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14