Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
介绍. {3 v. R# S* v; }! C. i
开发语言8 M: j: {3 F. O, X. T6 z
在NEO智能合约开发平台进行开发的优势之一是平台支持各种开发语言。' O; y' E3 K9 m; K' T0 v( o$ W
NEO推荐使用C#语言,不过它也支持使用Python, Java, Go, Ruby,之后还会进一步支持Kotlin, C/C++, JavaScript等开发语言。.5 x4 F0 Q5 |& J5 n- y% G
尽管支持多种语言,但我们仍可以发现现有的很多项目使用的是C#、Python、Java,使用GO语言的并不多。因此,参考City of Zion (CoZ)上的资料,我想尝试写一篇关于使用GO语言开发的简单教程,希望能吸引更多使用GO语言的开发人员参与开发。
% t& x7 M7 b9 Y0 c+ v给GO开发人员的建议
8 A! n1 C( t" q2 ^. _: F# D无论你是编程新手还是经验丰富的开发人员,刚开始时都建议你在私有域或测试网上进行开发。
& y+ s* O- X4 ~/ T4 O- ~为什么?
7 L8 v0 v+ h2 p4 f/ `7 c, m因为在主网上部署NEP-5 Token需要消耗490个GAS。6 I8 E) A& K/ T6 _; e
写这篇文章的时候(2018年9月15日),GAS的市场价格是5.8美元,那么该笔费用就高达2842美元。对于任何创业公司而言,这都是一笔不小的费用。
7 q5 u; H' P1 O5 K按照GAS的历史最高价,每个Token的价格为95.87美元,那么仅仅部署一次智能合约,你的成本就要增加4,7000美元。
8 ]/ S; \! n4 y, p$ {1 ?因此,刚开始开发的时候,建议你在私有域或者测试网上操作,当你准备好之后,再转到主网上部署合约。
% k# E8 X+ G- u" G8 q* C- N' C要求" W# z% ]# Q  K  d9 m. C
本教程中,开发环境的需求如下所示:
: }6 J" s% w" a9 S; `8 E操作系统 – 桌面版Ubuntu Desktop 18.04.1 LTS
- \$ I/ d' Z9 l: yGit 命令行接口 –Git
, a6 b* d8 _9 F8 d0 g语言 – GO语言
8 e6 V, d: k- F" G0 nGo语言依赖管理工具 – Dep) B8 a! i  p5 d! f; ~" N- c8 B
Docker –Docker CE 和 Docker Compose% @8 W' `; _% {1 y1 W$ Q" R
编辑器 – Visual Studio Code, Extension: Go
: h4 b% v0 Z/ e) Q6 }6 h7 |使用到的NEO的资料, `+ V1 ?3 R+ G! f
GO语言智能合约框架 – neo-storm
$ o8 J5 Z' k7 l8 G- C; R' {9 r. k预建好的使用Python语言编写的neo-privnet-with-gas以及nep-scan镜像 –  neo-scan-docker( k' S  \. I" a- M' g: d: [" @
重要提示:结果可能因NEO编译器和节点版本不同而有差异。
, B# z8 P0 s7 s: }本质上来说,有几种方法可以运行私有域,例如使用 neo-go 或者 neo-privatenet-docker。 但是,在本教程中,我们会使用slipo编写的 neo-scan-docker。 neo-scan-docker是用neo-python构建的,所以它带有一些“Python”组件。 此外,它还带有neo-scan的UI,允许您分析智能合约的部署事务。
% S5 b# I, l% u: B% ?1 }*安装方法可能因操作系统而异。 相关的详细信息,请点击上面的链接查看。
+ d+ e& E6 I) s" U% V配置你的环境
7 F3 Z/ p9 G6 h首先,我们先用 neo-scan-docker来配置一下NEO私有域。
9 D3 D( t6 D. T7 C! C8 j- c6 }/ j5 D1 检查一下Git, Docker and Docker Compose这些工具是否已经准备好。
6 l/ _3 ^, P  J) Q6 N+ drichie@Redbuntu:~/Desktop$ sudo git --version
- D) ?& U/ J) Z; v" V5 s0 o$ s# q' tgit version 2.17.1$ y4 u- p  e9 V$ o
richie@Redbuntu:~/Desktop$ sudo docker -v3 }6 E. K. U$ M, e7 d
Docker version 18.06.1-ce, build e68fc7a
# h  w! t9 H' l# W2 drichie@Redbuntu:~/Desktop$ sudo docker-compose -v
+ X6 Y5 K0 I* H8 [docker-compose version 1.22.0, build f46880fe
7 {8 h' g9 F' j) e2克隆(Clone) slipo的 neo-scan-docker仓库代码,并使用 docker-compose来加载Docker镜像。 下载镜像可能需要点时间,请耐心等待done状态的出现。
$ K* l  J0 v5 W7 F  S* w+ H8 T  arichie@Redbuntu:~/Desktop$ git clone https://github.com/slipo/neo-scan-docker.git
  E: I) ^2 k- }" @2 ZCloning into 'neo-scan-docker'.... x/ L* ]: K8 m2 n5 U! I
remote: Counting objects: 27, done.
' O" X+ t' ?' @1 `. lremote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27
) h" T- m, I: \! [0 g' V7 VUnpacking objects: 100% (27/27), done.
9 l% C" \& K3 ]% `( yrichie@Redbuntu:~/Desktop$ cd neo-scan-docker/) ?5 j: D0 Q. _1 N& }( F
richie@Redbuntu:~/Desktop/neo-scan-docker$ sudo docker-compose up* ]; c3 b$ v6 \
Starting neo-scan-docker_postgresql_1 ... done, z9 U6 c% K, y6 Z* L6 s, U
Starting neo-privnet                  ...+ c& ?' n* Z% v% ?$ ]5 F; [# _, X
done
3 [0 o# N" f' K! O: f! mStarting neo-scan                     ...# _* I6 f- r: u0 M( j2 m9 L; _
done
6 \0 {5 r5 C; S; PAttaching to neo-scan-docker_postgresql_1, neo-privnet, neo-scan`
) p! e" F! E$ {, a3在你的主机文件中,添加127.0.0.1 neo-privnet。注意:主机文件的位置可能因操作系统而异。0 J( y5 W* E# V6 _1 h4 u
Unix/Linux/macOS - /etc/hosts, m! q7 {- f0 p1 P/ j
Windows          - C:\Windows\System32\Drivers\etc\hosts`
: ~* z" Y( Y4 B4在浏览器中输入http://127.0.0.1:4000/,可以看到City of Zion (CoZ)提供的neo-scan网页界面。
" P! t/ w+ Z' i& v+ i5 s8 y4 J
$ E6 i' B( x" s" X8 `, c5 h( s5点击钱包地址(Wallet Addresses),你可以看到预存有NEO和GAS的钱包地址。部署智能合约的时候我们需要使用到这些Token。更多信息,可以查看 neo-privatenet 。
4 x; S( `# ]: x& P导入WIF密钥可以获取预存有NEO和GAS的钱包的密钥。 私钥/WIF 密钥 KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr 地址: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y 脚本哈希值 (用于检查): b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'! A/ w. Z& i. W0 K( c+ A% D. P. s# B
这样你的NEO私有域和neo-scan就已经配置好了。1 ]/ j# t/ c$ j; @
下一步,配置neo-storm。
* u* T" G7 ]' x5 s/ u1在终端中输入下面这几条命令, go version、dep version以及echo $GOPATH,确认一下Go, Dep, GOPATH都已经准备好。9 k) j5 O0 W* U; ~5 P6 G: i
richie@Redbuntu:~$ go version1 k  p& P+ l& ~  z" b
go version go1.10.1 linux/amd64
; @2 l" L' Q* Z' ]$ i% u2 j  grichie@Redbuntu:~$ dep version, W/ X6 t: r* X/ l
dep:! h# ]! L1 N% E" l+ A" R
version     : devel
8 N  X) s. ]7 H+ G4 Y; B: D build date  :
( d4 e* s9 T4 k7 s0 w7 R. b git hash    : , x" Y, c0 C: {# U" j+ u- _
go version  : go1.8.3
1 k0 J3 L. U) D+ f' s8 z1 H4 F go compiler : gc
8 o8 q- ?2 s5 g' e platform    : linux/amd64; F- G( J  E9 g! ]; T
richie@Redbuntu:~$ echo $GOPATH
6 U8 u% H3 W; Y" D; E4 X. n/home/richie/go
: t' b* |3 n6 [$ h/ f  r0 f  }& B1 U2输入 go get命令获取neo-storm,输入dep命令检查依赖包,使用make install命令进行安装。 *忽略警告信息( F* d% S4 I! Z* j' m
richie@Redbuntu:~$ go get -u) i$ H' i8 y5 o' ~; c, c
github.com/CityOfZion/neo-storm
1 A0 i/ o/ d) ]  x, @' G% ~package github.com/CityOfZion/neo-storm: no Go files in3 B1 e  B  Z9 e4 h1 |; @
/home/richie/go/src/github.com/CityOfZion/neo-storm
  F3 a6 _: t; I  Srichie@Redbuntu:~$ cd $GOPATH/src/github.com/CityOfZion/neo-storm7 b# s& q4 X8 u* w. }4 W
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo dep ensure
) m/ k( o9 r( j-update
+ N; ?# s) u# h+ e- Fdep: WARNING: Unknown field in manifest: prune( S' A' Y* M2 [3 g
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo make install. }5 `2 [( v& r: z( w# M
installing project dependencies2 Z8 q4 y8 i: _. z+ R8 ^
dep: WARNING: Unknown field in manifest: prune- P) `) @2 g/ K6 F; Q
installing neo-storm framework
1 F) P+ J) v) ^* Q  ]/ H0 Zdone installing, happy coding!
2 r. q' d/ |$ m' a3现在neo-storm已经安装好了,你可以测试一下。
) _/ N# y2 n; Y+ o( p/ F. \" Wrichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$
/ [2 W; [. E) M; k5 n( r# p$ Yneo-storm( Y( z% E/ H% d
NAME:/ \. l) U  c. h/ W
   neo-storm - Neo smart contract7 r/ W6 s0 I9 l7 k
framework for the Go programming language
6 A9 ]8 k) @# a  q1 `) ]$ a% IUSAGE:2 _  h- ~, v6 F- R
   neo-storm [global options] command[command options][arguments...]$ H' a/ h/ L" H* F
VERSION:& H8 _  D( `, H9 R& A2 W
   0.0.0
! Q8 y7 b# j" @* `- ^  uCOMMANDS:
1 F$ z6 p# i+ b; Y     compile     compile a smart contract to an .avm file( y7 b  j) {; U6 o
     testinvoke  testinvoke a smart contract against a remote NEO RPC node
' _4 O. A$ Y' ]- d3 w$ _& y     init        initialize a new smart-contract in a directory with boiler plate code( b9 e9 f! c7 x* D* g
     help, h     Shows a list of commands or help for one command
% u+ s: v, @/ K/ x7 X  }. A. v( aGLOBAL OPTIONS:$ R. O3 C: U3 P6 h' u# u
   --help, -h     show help
% f; c: x' K" z9 T6 E# t   --version, -v  print the version% b& O8 Q) n+ \6 @3 }
4“安装完成,开心编码” ——接下来开始我们的第一个智能合约吧。
6 S6 t  K9 ^  ^0 Erichie@Redbuntu:~/Desktop$ cd ~/Desktop  O5 v0 b# |/ W* S* q8 M
richie@Redbuntu:~/Desktop$ neo-storm init -n NeoStormTest; {7 S: E- F/ ~' D, B
Successfully initialized smart contract [NeoStormTest]& b5 b, F/ ^; K* D
richie@Redbuntu:~/Desktop$ cd NeoStormTest/
% N3 C! u/ Y  i% @2 I& r3 ~, Nrichie@Redbuntu:~/Desktop/NeoStormTest$ ls6 ]1 o- A+ P3 R3 r
main.go5 k0 ^) M5 |& A* ]4 r  r# u7 D
richie@Redbuntu:~/Desktop/NeoStormTest$ cat main.go
+ l, ~* i3 a+ v: E1 t; |# Qpackage NeoStormTest$ n, i/ Y# U, [1 `
import "github.com/CityOfZion/neo-storm/interop/runtime"
5 \1 m/ t& Y9 l9 e& a8 zfunc Main(op string, args []interface{}) {
0 ?! C2 E3 m, ~3 Q# s0 p    runtime.Notify("Hello world!")
! Z( C1 e6 w4 k: t3 p. m6 c9 u发行NEP-5通证合约/ S; A9 h3 j5 t" A8 T; `2 ?
1要在NEO上发行NEP-5通证,我们必须遵守它的通证标准。 *改进的NEP5可以在Github上查看,它允许Token上线NEX交易所。2 x1 \# n/ x! s  D
NEP-5 Token Standard
+ B/ a7 j8 ]8 AMethods
+ h. Q: N* I( R( X-totalSupply()0 ~  ?3 I4 O) o" l' U0 d, W4 z) N
-name(). `% p/ O6 c: K: r1 c" k8 E5 L
-symbol()( n( X9 J4 j; U8 c; m' P
-decimals()
. `  y. V+ r6 Q( p- E; y/ c3 U& t8 a-balanceOf(account)3 u; n/ ]. ?( l. M; i- P5 P( G
-transfer(from, to, amount)- i6 i) z6 E6 K8 ?
Events
4 y- b4 U9 M! I6 Y- ^2 l* N% h9 B-transfer(from, to, amount)! a1 z# x* t" U* a! i8 f
NEP-5(.1) by NEX
4 l. y) m# f* R5 nMethods6 A$ q6 x8 h3 h- h3 u
-totalSupply()
% |( C% X1 ?: X2 ~3 c5 m8 U, K, Z-name()
5 ]( S) l1 {7 p. y1 i- m-symbol(): z. O2 Y5 k1 Z
-decimals()
: {% y3 u* [8 w3 ], Z-balanceOf(ctx, account)
" G0 k+ g8 c& D. ~-transfer(ctx, from, to, amount, callingScriptHash)
  y+ T+ ?6 \/ i$ I: w! z, |-transferFrom(ctx, from, to, amount)
) ]6 n0 X8 O5 a) v& e-approve(ctx, owner, spender, amount, callingScriptHash)
) k7 F6 v5 D1 _/ i2 L9 ^-allowance(ctx, owner, spender)  G5 H' A* k* q* M
2不用重新编写一个Token合约,你可以fork/clone我的github仓库。
1 a9 G# f' L$ O) F5 e# Erichie@Redbuntu:~/Desktop$ git clone https://github.com/maplerichie/neo-go-nep5 MyFirstNeoGoContract
; l0 h( o' G+ `$ V3启动代码编辑器(我用的是Visual Studio Code),将~/Desktop/MyFirstNeoGoContract 添加到你的工作区(workspace)。Neo-storm的examples文件夹里也有例子,可以点击https://github.com/CityOfZion/neo-storm/tree/master/examples/token查看。. H; a& V3 [6 x1 O$ C5 r

0 O0 }2 n$ @) _" O- }9 F. ~: j- Q1 ahttps://github.com/maplerichie/neo-go-nep5! M+ `( n6 k. ~5 @
4编辑package,修改NEP-5的属性值,例如decimals, multiplier, owner Address, Name, Symbol, TotalSupply。1 [' g  S2 L/ T' n8 g* x, W# V% a
Package:应该将package修改为 package MyFirstNeoGoContract ,从而与文件夹名称保持一致。! b  S9 I8 m" ^) C
Decimals:用来设置Token使用的小数位数或者Token可被分割的最小单位。  A; M7 F7 R) D- n
例如:NEO的小数点位数是0,意味着它是不可分的Token。因此不能转账或者接收小数个NEO,只能是整数个。小数只能在交易所使用,因为它们创建了自己的十进制系统来方便交易。
, f2 V) l4 D# m7 i. o5 i' x4 F+ dMultiplier:这给出了Decimals和TotalSupply相乘时的值。 输入格式为10 ^ Decimals。
/ G* ~, V' ]6 t% e例如: decimals = 6时,multiplier的值应该是10^6,即multiplier = 1000000。
: \) y. c1 y/ J, `# ]- n' a6 hOwner: Token发行者的地址。这里我们使用neo-privetenet的地址AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y。
4 ]4 V; A7 S# m* L: }6 O( F% nName: 字符串格式的NEP-5Token的名称。
: R7 t; P4 W" N0 LSymbol: NEP-5Token符号,通常是3个字符的长度,但不是必须的。0 Q" W6 Q( E; L$ |6 R
TotalSupply: 总发行量。设置一个总发行量可以防止通胀。
  R6 e6 M' {3 F+ N9 w& D: o  E- a. E5 I7 o" |5 E( D6 _
5修改参数同时确保符合NEP-5Token标准。然后使用neo-storm来编译GO智能合约。% {8 I9 q: _" k9 a2 b* h+ n3 l
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ neo-storm compile -i main.go -o main.avm
5 U4 \: u$ `7 E# m1 |6当前目录下你可以看到 main.avm文件。现在neo-storm不会运行检查NEP-5Token标准。我的经验是缺少owner Address信息时,会显示错误信息。$ N' A+ b$ A6 {
7现在讲NEP-5合约部署到Privatenet Docker。这么做之前我们需要先获取Privatenet Docker ID值,然后在主机上复制main.avm文件并粘贴进Privatenet Docker镜像中,然后将它附加到运行的Docker中。
( N+ w1 r9 S5 q4 B7 Srichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo! O+ s; @  r  C
docker ps
/ h1 ^% B; x, L1 I$ S8 m- M' P  BCONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                                                       
  k) B2 o! l! C- n" yNAMES4 n5 j/ Z- ?% X5 B! f& u  @
69c60667835b        slipoh/neo-scan             "/bin/sh -c 'sleep" o. |& T3 z- u* {+ V3 v- B
3…"   6 hours ago         Up About a minute   0.0.0.0:4000->4000/tcp                                                      7 P: I$ Z5 s5 m3 P- U7 `# E
neo-scan
& Y/ G7 T! w1 ~, S* B: C) s8 m88b358cdd8ff       - i5 d6 \! q) ^5 `- q' ~+ o
cityofzion/neo-privatenet  
) a6 H2 D  m! f+ G' e! d! e: h"/bin/bash /opt/run.…"  ( b6 B$ q. I' I% f8 V  ^
6 hours ago         Up About a/ W% j9 n$ L; N, v6 c
minute  
5 u' ?  w% y3 _- {7 B5 x0 {/ Q0.0.0.0:20333-20336->20333-20336/tcp,
1 H, c: C% D. C4 Y# l0.0.0.0:30333-30336->30333-30336/tcp  $ x3 q% B2 N5 J/ t
neo-privnet
" ~; U3 z: A$ t5 v: d1 A* rab96dc398c62        postgres:10.1              
6 z# v8 u7 c* V( W"docker-entrypoint.s…"    D9 H" h) k6 H) X  x+ {! U: \3 f
6 hours ago         Up About a
" Y: X( j  l+ V# S% h. x% Wminute   0.0.0.0:5432->5432/tcp                                                      
  k  V; `9 ^$ r% Q9 }. Hneo-scan-docker_postgresql_1
, s( O' R; V: Q+ F) Jrichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm" `& V( y* Y* @" a
88b358cdd8ff:/neo-python
; g0 G" f! b: K5 Arichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it
' Q$ T5 {4 C% |88b358cdd8ff /bin/bash
6 N* ~4 ~# l2 Q6 B: Z*共识节点运行在在screen sessions,使用’screen -ls’命令查看
4 U; k/ t: S) g9 y, t) q*neo-python安装在/neo-python目录下,目录下带有a neo-privnet.wallet文件
3 u; \; t+ [' `- N7 m6 d. `, z' H  R*有问题可报告给:https://github.com/CityOfZion/neo-privatenet-docker# v1 e& A3 k: S' Y; ]. u1 W
8在Docker上,打开neo-python-cli终端并使用密码coz解锁钱包。
+ o8 N0 c0 R8 P+ w6 Aroot@88b358cdd8ff:/neo-python# neopy+ o9 c+ l+ e- m, s. j2 l
Privatenet useragent '/NEO:2.7.6/', nonce: 5137597647 `0 O& r% B" D0 ~2 `1 S! M  ^0 L
[I 180914 10:34:09 LevelDBBlockchain:114] Created Blockchain DB at /root/.neopython/Chains/privnet5 k- R8 U# p  W, h
[I 180914 10:34:09 NotificationDB:73] Created Notification DB At
6 Y5 U- F2 a* v9 W/root/.neopython/Chains/privnet_notif
6 i  W" |" Q& @# ?NEO cli. Type 'help' to get started, p* w6 b8 T# q
neo> open wallet neo-privnet.wallet1 c6 O* Y0 A0 P7 i3 o
[password]> ***% O5 P  K- J! J/ Y! m) ~. P$ E6 G
Opened wallet at neo-privnet.wallet
3 }9 N+ X1 |; o, Y2 U0 m9部署合约main.avm前,使用neo-scan看一看钱包余额。
; X: G$ y# C% X+ v7 {: ~4 `neo> wallet' Q- N- l2 a. k  o& |4 k7 R% y
[I 180914 11:01:22 UserWallet:538] Script hash
5 q' M6 s* @5 m% W& Tb'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
+ f/ r, P; Z; IUsed 0.357 Gas # v' T% X2 U, @' W
Used 0.357 Gas - i1 G) T5 _* n: b3 F4 I" |: @
Wallet {& \; k$ p2 c! p# J) S9 C. {
    "path":
( _$ }% z/ @9 n9 @0 \"neo-privnet.wallet",# G' U- M. X6 R' h4 N; p
    "addresses": [
& h' N, @& \  l3 D. Q, Q; T3 E1 ?        {4 M! v; x5 F6 s! u+ c! B& j( b2 E
            "version": 0,$ T% O% z, [& o% k/ \
            "script_hash":
9 |( T+ |: q+ c; A  S( A& {"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",9 U" V/ e0 k# N+ ?8 ~- N4 y
            "frozen": false,
1 Z( [" g# I1 a& y6 V: F            "votes": [],
4 F2 w/ r& h. E# t            "balances": {
( b1 D1 u, z$ ]% g$ B         
4 J2 x3 I& ?$ E) h  n"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
9 Q* o8 [! Z' i2 L* f( W3 h# \5 ~"100000000.0",' a( o  j, Z: H, E' ]2 u. J
              9 M: W7 F7 r+ V1 \& {9 t+ [' j
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
$ @  ?( ^; S7 U, k8 y- r"74589.9996"
- e! c9 G8 _( J# o, k* u            },
  x. v- g) J5 N, g. g4 }# a            "is_watch_only":) r: j2 v* R0 @* l  Z
false,# H- I% z, I4 x/ U
            "tokens": [
! G) n' C$ {: b: x3 \6 K- r                "[a3640dd3c560c75528e5f861da5da98958d0d713]
$ S, L3 Q+ x. c3 RNXT2 : 2500000.00000000"
* u. `2 d6 B4 O: j" S  D            ]" c5 u! i0 D% C0 W! W! U0 v. s5 g
        }
# N! k! i1 N3 |) x: S$ J8 ?    ],4 ~3 ^2 q/ Q7 d. k! s& S2 ^" t
    "height": 10294,& h1 Z; V; I/ R
    "percent_synced": 100,
, K* w% s4 H3 J0 w" A+ J4 i0 g- J    "synced_balances": [0 b8 j5 e5 @6 T8 p' q
        "[NEO]: 100000000.0 ",/ l( j" T# D" c. ~# x+ n* K% h
        "[NEOGas]: 74589.9996; w! l1 ]- [0 }" O$ [; e) G
",/ K) k) M8 Y0 v9 d8 q) G, N
        "[NXT2]: 2500000 "
' i5 R  G; r0 V* V% _    ],) X0 t2 y- [  |+ ]
    "public_keys": [; }5 u0 a& P+ m9 X$ q
        {
4 w* J" n0 Z. r. U            "Address":
5 x, Q3 `: n+ b0 B0 ]2 p. n"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",: j% p1 [" X6 A! o* f
            "Public Key":' \8 A1 J. T% ?8 V9 u0 k# X  H
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a", ?* C" {" ?  {" s2 s% _; Z
        }
& _" [- }$ A" G9 w; S0 Y5 W    ],
( b; k0 R6 g- l( u    "tokens": [" M3 |0 ~+ c4 H1 K# y2 C6 q% ?
        {
: ^  C7 A* }! S, Y# p; e0 R% X            "name": "NEX
" p: ]* P0 n% W2 @5 W# F" BTemplate V2",& L; y+ j6 }  I  a1 y9 E1 l/ f0 z- w
            "symbol":
8 |5 B$ p2 j% I"NXT2",$ N' E5 P) {* V6 C' F
            "decimals": 8,! p  ]$ j1 {# f) O
            "script_hash":) N  e0 J% p/ h) v7 k0 v. v- H
"0xa3640dd3c560c75528e5f861da5da98958d0d713",
' Y8 s% J1 Q( f$ Z) E            "contract_address":( K( Z2 E& P9 v
"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"
% D3 T2 U& n9 {9 |0 ?; W        }! E$ i2 h) _& z# d6 y' `0 e3 S
    ],5 U+ ~' _0 H0 A2 s- i3 a
    "claims": {* x" x: X% p* o0 r. E- B' n( H
        "available":/ L. W6 y5 E2 Y' E* g& I4 j
"0.0",& d9 q8 x7 X* g5 _* e
        "unavailable":2 W$ X- M% w$ I6 a
"7730.0"
* |" d; K9 D" K1 o9 _: m    }% k# ?. |+ b2 G* C' k! D
}
: E3 W9 V) J$ h: K10看来可以开始部署了。再次提醒,钱包密码是coz。# U* P! E5 |0 T
neo> import contract main.avm 0710 05 True False . Z% e# u8 k* S) y- B- B. Z
contract properties: 1( \2 B- h  m8 J( z! h1 z. j
Please fill out the following contract details:
: d7 J" {% E3 c1 S) A: C[Contract Name] > MyFirstNEOToken
7 o# H0 L# a! n2 r$ E# R[Contract Version] > 1.0: m" _- f; B$ p3 Y
[Contract Author] > Richie
) D) J$ [( e% s/ z& ?  D[Contract Email] > babierichie@hotmail.com
6 G0 D$ a: `3 D# s  R3 ~/ ~[Contract Description] > First NEO Token
3 P7 |7 t" y: W+ I0 e% s, vCreating smart contract....4 a* K# q2 @9 P- |  q9 ^' n
                 Name: MyFirstNEOToken
( k8 k9 _4 ]  I  c5 J: v5 ?              Version: 1.0
  v0 m  A& A4 O               Author: Richie $ ~8 x4 h  x4 V
                Email: babierichie@hotmail.com 0 Z" h, I) X5 z/ [5 L
          Description: First NEO Token 6 ]# K, F$ o% R- b7 ]: T
        Needs Storage: True
6 ]; F3 o- P" z  K( }! p+ M. x6 D Needs Dynamic Invoke: False
! k+ J9 R" J) q& |; U) q2 O{
* ]. |3 Q& J- g5 v1 d    "hash":
/ v( n3 t6 j8 U: A- l"0x4e9b87c96158a8e2cc4b74794f727b38947e9862",
  h  ^  _- D8 s% u1 L# q    "script": "...",
) h  u7 A, w( N# Q" z    "parameters":" D; g- T! p; g/ m
"0710",; M$ M6 S9 Q# h9 B; k5 N, z
    "returntype":
8 R  U& T6 f0 j. s# V/ M"05"  m1 [4 S' h: a. l6 W% |
}& X* s' {4 \6 e7 Q
Used 500.0 Gas. L" u0 O7 H: ]; W, i% e  p+ I
-------------------------------------------------------------------------------------------------------------------------------------
9 s6 H+ u: @1 T: i- Z* M- ATest deploy invoke successful5 }6 B8 `# z2 C7 s1 G6 [
Total operations executed: 11
; K( U& E. Q: M" v8 `' yResults:' n9 c& i$ ]" d
[]( E% A2 s$ r5 ?7 O! C: w
Deploy Invoke TX GAS cost: 490.0
: y5 Y3 ^4 c0 ~, M1 r5 gDeploy Invoke TX Fee: 0.0
% L/ a5 t$ B3 {2 m( _0 v-------------------------------------------------------------------------------------------------------------------------------------
# R; w& ?5 r/ }: i* w1 n0 ]Enter your password to continue and deploy this contract) _7 T9 F( I' Y" m
[password]> **** }) X3 @( O) D( x6 {. J- m: v
[I 180914 11:03:33 Transaction:613] Verifying transaction: b'9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114'
2 E. X. [4 B& O: P& h0 U# CRelayed Tx: 9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd65691145 `# d6 M6 [  U* z
11使用给定的哈希值验证交易。 注意:不同机器的哈希值是不一样的。
9 V, t5 ?6 Y3 |: M0 c2 Vneo> tx& R/ V' P9 w8 U" _( J
9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114
. E( L; n* q, d' `+ v{
, E8 s, P# y% [    "txid": "0x9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114",( a6 x3 K' F: A3 m
    "type":
3 j' o+ ?0 }- }/ Y" F"InvocationTransaction",
& \, P2 N* U+ j2 |: G    "version": 1,
$ r7 ]* C( d# o( W( n2 z+ w% K    "attributes": [],
1 _6 b! k! ]7 P. k" v    "vout": [
; U. ?$ A' N' ~/ P1 E; y! ?8 A        {; T2 K4 J& j  U# K( T  `  E( T4 l
            "n": 0,
$ Y' Q* k) Z5 }8 n! z+ W' H- J            "asset":
4 n4 o$ M) ?. P2 _"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
8 X7 v! c6 f/ x5 x) Z- @* f) E            "value":
% I2 |. D0 ^7 W8 a5 h0 h# M6 U"25493.9997",
* f% u$ n: i0 U2 i            "address":
. U8 G+ Y4 n& j: w+ Y"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"
/ q3 q! ]6 H/ J# W" M9 B        }9 p, ]1 \7 q8 n" l* n
    ],& D" F- c/ r7 b; t
    "vin": [0 h6 h% P" W1 l9 |( @
        {
5 e* X' l! J" m) a: F% z# B& `( h            "txid":+ @& J9 e$ ?' R* e' O- ^
"475a091ccaa6330320a29884f5f8796a260bdba91352dd409d16787b37d8be26",4 k6 Y3 G8 P  Z1 a, T, c! c
            "vout": 0
: \; ~6 [! J( z! R        }
3 k* ^0 H# u; a+ I" C0 {6 ?    ],
8 p" v8 {( D7 d: W2 d; ^( e    "sys_fee":4 l) `! q4 R$ J2 \3 E
"4.9e-06",' x$ t& U( Z: v4 k
    "net_fee":
8 T4 ~* E2 Y) {; w$ x& q* R. {# j; Y% f"489.9999951",) E( X- z% G: O3 ]
    "scripts": [7 s$ v2 B" y- ?& D+ N4 p
        {
, \: H" g2 I+ N+ s% K            "invocation":' C) H5 F1 ^! d& }0 E$ E
"40510fa6630ef581108057ebe967cd306522466a32eaf068cf3717da1e640b866246c013033e3c878ebf9247a5a3500178b21b126b3af63ed07a86b0d2c4f34c89",5 F( H% z  |$ g/ R3 K8 r8 o
            "verification":# g7 ]& O! Y" L4 g
"21031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac"9 @6 o3 Z- ?/ \7 s( O- l
        }
2 T$ K7 L8 a; \" |    ],- i& P8 U6 Y1 \+ K
    "script": "...",- ]- t) d- V, o4 u2 z4 ~
    "gas": 49000000000,
9 S5 g8 M6 r1 E. ~0 f    "height": 10302,4 T; b( ~+ ~# X# ?" \
    "unspents": [! y8 m9 w2 F; I" Q+ D" V2 i- Z
        {& S- Q' b) O( z; G/ `; T7 @4 p! \. b
            "n": 0,. V# [1 L. \" r4 c! P+ c4 z, i+ a
            "asset":
) b0 }8 {# g( x1 f3 G"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
$ {2 }$ ]  Y- D6 G& a            "value":/ [9 g9 m7 |  i) ^
"25493.9997",
5 Z& `, m9 b: K            "address":/ l6 l$ v* S- R* h
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"0 ^7 `$ O1 ?; d# f$ q. t! K
        }
9 A7 |6 O7 k2 b! A6 u& T    ]( r- s% U" X6 s3 b& [! P
}! }( Q+ O, w- d- p: T, D: T
12交易显示后,再次查看钱包余额。 在步骤9,我们的GAS余额为74589.9996,现在,GAS余额变为74099.9996。 因为这减少的490个 GAS已用于合约部署!
# F2 h2 ?! N$ F2 O/ @8 xneo> wallet+ x! \1 i( N( _- T3 k0 L6 \. ~/ P) O( ^
[I 180914 11:18:38 UserWallet:538] Script hash
$ P- P( S: L; M9 Qb'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
8 N1 d& H3 Z% ]- h2 \( O' wUsed 0.357 Gas
3 k* h! r+ _" u. E4 K& vUsed 0.357 Gas ; s! H) R" F3 z% ]* i
Wallet {9 Y- X4 }# [" I" ]0 j3 Q( c# u. Y
    "path":
, z6 P0 g% D  T9 c4 B"neo-privnet.wallet",9 K8 \  Y6 J3 s- i/ x
    "addresses": [" d1 ]2 `$ ?1 l- w$ \
        {1 v4 m# G1 x: N. Q5 t4 I4 f. G6 e4 {
            "version": 0,
, B, j+ l, A7 T            "script_hash":
0 [. P: E3 f% U"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",( P. p" u" C1 x0 c9 P3 P  N$ S- T
            "frozen": false,3 o- ~3 ]$ f" S) J3 j! z7 d
            "votes": [],) E2 W* z7 a- m/ Z9 x: W
            "balances": {: }# u3 k- U  X- o3 ?
               , m3 o; \/ P5 ^0 T. S8 s
"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":# P& T5 P( E- R- N
"100000000.0",$ c  V9 N1 M$ m$ e, f: ~- h
               
$ b- b7 X8 D8 w4 H+ _) ~( F9 ["0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
3 D' w  A6 [7 g( c1 P3 d"74099.9995"
+ r( Y$ ^) @. M# p* j' J1 E            },
6 h4 s4 B' ^, O; c            "is_watch_only":5 H% g2 ^) t1 \6 L+ ?. s  ?
false,
! U* r2 |/ A) ~5 {, F0 J9 L$ v            "tokens": [
# a; t6 s2 O. R$ P; m) k               
2 b6 R! x0 i- K9 ]+ h( H9 [  {"[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 :7 Y) [: m- J7 G6 G& T
2500000.00000000"2 Q3 r4 I6 h5 m  t- J: q3 A5 Z( _  |
            ]% L! e4 F: _( w5 \
        }
2 Z6 @8 O- ?6 c: O+ X    ],
3 b- K" G0 l) X" ?3 L. ^; a! q    "height": 10348,
& @& ]7 k8 k* I6 O8 [3 @    "percent_synced": 100,
) K, [6 W$ i5 y% U6 a    "synced_balances": [
6 |( P0 @; n4 Q" M        "[NEO]: 100000000.0 ",' H7 @- l+ f1 y
        "[NEOGas]: 48605.99996 T3 T% _, F4 |7 P! \, {' C
",. e; U& C/ E0 F, c/ q6 \
        "[NXT2]: 2500000 "
# W6 D; Q' C) l  [* R0 V" J) v9 }( _    ],7 \6 W  _' P' P# W0 S0 }
    "public_keys": [0 P. i/ g3 n' ]- @
        {
; w$ [0 L) n; }( L( W9 L' l            "Address":
* o; ^" k* E" W7 b. m"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",1 k0 G' p  ^3 Y: |
            "Public Key":, I9 g0 r4 V$ D& p5 w
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
1 @' U' H: i% m/ R+ R( O: t6 l( ]        }  d+ e1 n( O& f
    ],
* i; e9 M# P6 M! p( b- p; ^6 I8 ^    "tokens": [, r, B, C* g' E$ ?
        {! O" c0 n! }, x0 u& y& J1 X/ }
            "name": "NEX
8 D4 r; }$ q% o9 _$ ETemplate V2"," S/ l; d# ^6 s2 H- p, l
            "symbol": "NXT2",7 z* g& K& N5 Y- A: ?1 F
            "decimals": 8,
4 V8 W% G" T5 N! N            "script_hash":
$ ^9 a6 W1 O) {4 [" v0 R4 O5 a"0xa3640dd3c560c75528e5f861da5da98958d0d713",
$ w1 M' g1 M/ O( v& |; w            "contract_address":
4 e" s) r- j- P: E6 m"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"( `5 p% t: E8 C% K) E1 }8 Y) u
        }2 N& B! c* K2 C, I
    ],- Q! G' c% V) m% e, ~
    "claims": {+ C; D! k6 T3 T  ^: X
        "available":
/ k- O7 _/ T! `6 T; c( n"0.0",
$ c- s* B. k! V1 H        "unavailable": "8652.0"
  l% B0 x1 C1 F. ^    }
; m: p* X* x% @/ W+ l}
4 \8 G2 S: `9 [- j- L3 Z" G2 K我们也可以看一看部署好的合约。- v4 i) T. z9 O
neo> contract search My
2 i0 U3 B$ }( c3 C" K5 aFound 1 results for My
4 F" r& n5 N& {1 @4 k! B6 a{' [% S, E" n3 L/ E
    "version": 0,
1 b- \7 ~2 s  I8 E5 b: `    "code": {
7 t8 x5 x8 Q6 ?' f        "hash": "0x4e9b87c96158a8e2cc4b74794f727b38947e9862",6 L: B# [+ y9 p! v
        "script": "..."," o5 e& b0 O; [2 B
        "parameters": "0710",7 N+ t. |7 Z8 d' }  P9 f8 U, b3 ^! |* {
        "returntype": 5+ G9 s# e# D/ w% I4 M7 d% q; l
    },
* Q: X4 X" ]% W) s; e4 z    "name": "MyFirstNEOToken",+ h" `6 R4 G( a6 ?# X
    "code_version": "1.0",
9 N# e& S$ v8 F    "author": "Richie",: t, Q0 g: ~/ W, ^4 S
    "email": "babierichie@hotmail.com",
/ \. o5 C) ^/ ~    "description": "First NEO Token",
2 M' _) U4 X3 N5 ~    "properties": {
, g, q3 n& N  H8 ]9 q( G+ l) Y        "storage": true,
2 N  m4 o; R  W$ Y        "dynamic_invoke": false
5 J6 O( w5 A" ]) e) P' J    }  C0 a$ Z/ ^* I5 i, P! m. F4 a  N
}
( m1 i$ _5 D! {* |% a  u13最后,我们可以尝试使用钱包的密码coz,来调用这个带有合约哈希值的Token。- a& g1 S- F- r
neo> testinvoke+ m) h- n: u7 c  d: C
0x4e9b87c96158a8e2cc4b74794f727b38947e9862 deploy []
; J4 P0 t4 F! Z1 |- k* t: o6 q) A好了,现在你已经在NEO的私有域上成功的发行了NEP-5Token。, S$ D6 S0 Q/ t- y
最后) o) @  n$ p% i( G8 z( L
希望对于Gophers来说,能很轻松地照着本教程学习。也希望GO开发人员能加入 NEO’s Discord,一起开发学习。你一定要试一试!" [$ L1 F; u" l  f3 y
如果您真的需要我的帮助,请在Discord上联系我(LikKee.Richie#5647)
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14