Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
介绍4 H6 h5 m' E, L
开发语言& B* w2 N' k% V& t6 U# j
在NEO智能合约开发平台进行开发的优势之一是平台支持各种开发语言。& t$ h0 M4 _# [& q$ v& c5 T  T
NEO推荐使用C#语言,不过它也支持使用Python, Java, Go, Ruby,之后还会进一步支持Kotlin, C/C++, JavaScript等开发语言。.# I. d! s/ W! y- t
尽管支持多种语言,但我们仍可以发现现有的很多项目使用的是C#、Python、Java,使用GO语言的并不多。因此,参考City of Zion (CoZ)上的资料,我想尝试写一篇关于使用GO语言开发的简单教程,希望能吸引更多使用GO语言的开发人员参与开发。. ]$ }" V- F7 f3 i
给GO开发人员的建议9 [  c0 k. y8 x# C+ D( z# T. s
无论你是编程新手还是经验丰富的开发人员,刚开始时都建议你在私有域或测试网上进行开发。
( ^3 s+ a/ u6 g) h4 J! t; A为什么?! s, @2 J  k1 ]* Y
因为在主网上部署NEP-5 Token需要消耗490个GAS。
, g2 V+ k( Y% z) ?写这篇文章的时候(2018年9月15日),GAS的市场价格是5.8美元,那么该笔费用就高达2842美元。对于任何创业公司而言,这都是一笔不小的费用。
4 `6 z- r. y3 d2 M2 T! A4 g按照GAS的历史最高价,每个Token的价格为95.87美元,那么仅仅部署一次智能合约,你的成本就要增加4,7000美元。( ]) a3 R3 K! K" ]
因此,刚开始开发的时候,建议你在私有域或者测试网上操作,当你准备好之后,再转到主网上部署合约。
3 d/ G- m2 i# f要求3 M: L( r/ b$ v0 G
本教程中,开发环境的需求如下所示:" B( o3 a2 ?+ Z/ J0 O4 [
操作系统 – 桌面版Ubuntu Desktop 18.04.1 LTS
6 t+ _7 B" n% f6 S& }! b+ X: DGit 命令行接口 –Git
/ O. @  k& \2 U) x, A( B语言 – GO语言
- Q. Z8 N7 e: Y- s5 Z. nGo语言依赖管理工具 – Dep
* w& t0 h& c* F: x: {5 T6 z1 W. S9 ADocker –Docker CE 和 Docker Compose$ V. K5 n; J% w% k7 M3 Y# V2 t6 U3 g- w) Y
编辑器 – Visual Studio Code, Extension: Go2 Q" p/ X2 z1 M- b/ m
使用到的NEO的资料6 y8 e* |: x+ }. o5 [' v
GO语言智能合约框架 – neo-storm
7 ~; j2 T6 Z8 O0 D' Z; J9 O7 j6 }) Z预建好的使用Python语言编写的neo-privnet-with-gas以及nep-scan镜像 –  neo-scan-docker
# p* I) K2 d% o* M& {0 d+ a重要提示:结果可能因NEO编译器和节点版本不同而有差异。8 H# m' _2 U* a; W; G4 B( k, U
本质上来说,有几种方法可以运行私有域,例如使用 neo-go 或者 neo-privatenet-docker。 但是,在本教程中,我们会使用slipo编写的 neo-scan-docker。 neo-scan-docker是用neo-python构建的,所以它带有一些“Python”组件。 此外,它还带有neo-scan的UI,允许您分析智能合约的部署事务。" k, r9 ~# A! L3 A1 ^1 E' r
*安装方法可能因操作系统而异。 相关的详细信息,请点击上面的链接查看。; b: j& N5 `, |; b: P; V; P
配置你的环境
3 M" I1 s' b7 m+ r! G: E( p! p* {# L首先,我们先用 neo-scan-docker来配置一下NEO私有域。# G+ l  ~0 B9 t* U0 }
1 检查一下Git, Docker and Docker Compose这些工具是否已经准备好。2 F2 `! ?8 S1 O1 f  b$ _
richie@Redbuntu:~/Desktop$ sudo git --version0 m4 v. F, ^5 H$ b1 ^0 z/ X
git version 2.17.1
8 {! ^- u1 l$ k" srichie@Redbuntu:~/Desktop$ sudo docker -v. |! v" M8 W' d  h. w! p3 V9 ?
Docker version 18.06.1-ce, build e68fc7a- Z$ `7 O. i) [% U3 O  H
richie@Redbuntu:~/Desktop$ sudo docker-compose -v
- {+ g# h6 Q8 F# kdocker-compose version 1.22.0, build f46880fe
3 ~" ?! d* G% A2克隆(Clone) slipo的 neo-scan-docker仓库代码,并使用 docker-compose来加载Docker镜像。 下载镜像可能需要点时间,请耐心等待done状态的出现。
3 f5 X3 y7 c% `* Wrichie@Redbuntu:~/Desktop$ git clone https://github.com/slipo/neo-scan-docker.git
; I$ D8 ^5 q- y0 D; O# j  f/ A  CCloning into 'neo-scan-docker'...0 G& Q; i' u  _6 g: ~) D& }) r
remote: Counting objects: 27, done.$ x( J: g1 Z1 h4 o7 ]7 @
remote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27
' w" w" b& ]* d8 \) E" Q8 s* w. M9 ZUnpacking objects: 100% (27/27), done.
! B2 `2 K: V  z% rrichie@Redbuntu:~/Desktop$ cd neo-scan-docker/
" E% ]" [. ^9 n- j7 v+ }richie@Redbuntu:~/Desktop/neo-scan-docker$ sudo docker-compose up; h0 y. U0 q) K
Starting neo-scan-docker_postgresql_1 ... done
  L! s0 x: @' e5 |  DStarting neo-privnet                  ...
, t2 v; k0 Q9 U$ Ydone
/ z  s0 e4 g# D" @5 U/ BStarting neo-scan                     ...
+ K. t7 b7 u; W$ `7 V" Cdone
$ X6 e4 }7 @. P3 KAttaching to neo-scan-docker_postgresql_1, neo-privnet, neo-scan`
6 }! _# l( B# m+ I3在你的主机文件中,添加127.0.0.1 neo-privnet。注意:主机文件的位置可能因操作系统而异。2 x0 ^3 ^; J4 ^1 d& `$ \* Z& b5 z
Unix/Linux/macOS - /etc/hosts4 W/ G$ @* t$ b! J. X
Windows          - C:\Windows\System32\Drivers\etc\hosts`8 m0 Y" N  C: Q& H4 `
4在浏览器中输入http://127.0.0.1:4000/,可以看到City of Zion (CoZ)提供的neo-scan网页界面。
+ o& i0 S7 L' K' ~1 O9 S
+ @/ [; V* v% s- |- I0 U4 O9 e; S5点击钱包地址(Wallet Addresses),你可以看到预存有NEO和GAS的钱包地址。部署智能合约的时候我们需要使用到这些Token。更多信息,可以查看 neo-privatenet 。
# w0 s, D$ d9 m导入WIF密钥可以获取预存有NEO和GAS的钱包的密钥。 私钥/WIF 密钥 KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr 地址: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y 脚本哈希值 (用于检查): b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'  u& D) n( a9 {4 P
这样你的NEO私有域和neo-scan就已经配置好了。
7 Y# |6 F" o7 o; J. J下一步,配置neo-storm。
, B* \. U) C# z# z1在终端中输入下面这几条命令, go version、dep version以及echo $GOPATH,确认一下Go, Dep, GOPATH都已经准备好。" b! ~' J5 l3 R% T' O
richie@Redbuntu:~$ go version! T7 Q2 ^+ U. b
go version go1.10.1 linux/amd64% B: n% O  X% ^6 ~% S. i
richie@Redbuntu:~$ dep version
' [( P: s* s, o2 X" k" V7 n* X5 j3 Ddep:
# @1 |9 `' D$ A1 @ version     : devel& C% e) d1 y8 u
build date  : 6 d  s: C+ J) \
git hash    : ( p7 o# t( _4 f/ Y
go version  : go1.8.3/ I8 K3 @# G( \
go compiler : gc
4 |5 A% B+ c4 L  A platform    : linux/amd64
) }4 N+ e. d9 J+ b& m" K5 d1 }richie@Redbuntu:~$ echo $GOPATH
+ _/ r5 Y1 k4 E3 J. }/home/richie/go  {% C3 @5 ^8 v, l$ E& [6 J
2输入 go get命令获取neo-storm,输入dep命令检查依赖包,使用make install命令进行安装。 *忽略警告信息. t2 S2 I5 R: _
richie@Redbuntu:~$ go get -u1 q; {2 l: _  j5 ~6 u+ U1 f
github.com/CityOfZion/neo-storm. _; a( ~9 t6 Y: V4 F
package github.com/CityOfZion/neo-storm: no Go files in
  z9 U" `9 |( ^/home/richie/go/src/github.com/CityOfZion/neo-storm, N# z7 r8 ?+ P+ r8 p, z
richie@Redbuntu:~$ cd $GOPATH/src/github.com/CityOfZion/neo-storm2 A, P! F" w( ^0 u# I- h
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo dep ensure
/ V% X  C' k3 x9 [1 R0 C-update4 |7 Q$ V2 @; m( z; k" O5 ]
dep: WARNING: Unknown field in manifest: prune
/ L2 ]& r1 P& \; ]8 Y+ grichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo make install! l4 c# e1 R9 V% L
installing project dependencies
3 W/ [; O$ }0 t) c- x- s5 R) D8 Hdep: WARNING: Unknown field in manifest: prune2 w* C' a1 P  x$ s$ _2 d
installing neo-storm framework  E. V7 S, ~0 F9 M
done installing, happy coding!6 C: f, j3 i4 A
3现在neo-storm已经安装好了,你可以测试一下。
/ Q1 ~' L, _' c1 Nrichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$
% ]+ K3 ^; \1 _, c/ Tneo-storm5 B* @8 l2 n: ]: S; z
NAME:
# p. q. m, G, J& Y1 P; l0 E   neo-storm - Neo smart contract- u7 s4 {& Z, J0 e( ^( t
framework for the Go programming language$ P0 v$ j; C3 i; R
USAGE:
* V/ h/ H+ h' m, z. ?( i   neo-storm [global options] command[command options][arguments...]) ]$ T: V6 L! s0 l% O- ^" `
VERSION:/ C, P8 g9 E, P; z# z2 @3 o. a
   0.0.0" t2 ]- V: X( G
COMMANDS:$ w- Y- F7 k  R! \( V3 L: r
     compile     compile a smart contract to an .avm file
  n/ {8 \3 n/ r% c     testinvoke  testinvoke a smart contract against a remote NEO RPC node
. b3 a5 |# U, z( D     init        initialize a new smart-contract in a directory with boiler plate code) z: f" s& Z- h8 y$ g: Z# j
     help, h     Shows a list of commands or help for one command
3 ~: r' ^% X# ]# SGLOBAL OPTIONS:+ E6 @* R' P; W- t! k, N- U3 e+ [2 z
   --help, -h     show help& [" o+ Q* C# ~( n' Q. ?$ @( t& ~
   --version, -v  print the version
2 c0 g* ], Y0 P( P" b# n4“安装完成,开心编码” ——接下来开始我们的第一个智能合约吧。
6 E' U) e" q. n3 r- B1 n% E3 nrichie@Redbuntu:~/Desktop$ cd ~/Desktop
. M' {4 V; w% Y2 t  F$ Lrichie@Redbuntu:~/Desktop$ neo-storm init -n NeoStormTest; O! Y( t& l" w# V4 y* v( k7 z& K- i
Successfully initialized smart contract [NeoStormTest]
# _. A) L% @+ l" |# |  Y: C5 ~richie@Redbuntu:~/Desktop$ cd NeoStormTest/7 E2 r5 [. {* M" W9 B( K
richie@Redbuntu:~/Desktop/NeoStormTest$ ls
5 Z) R5 E) L$ P( ]& T% a( {main.go  z; Q$ f) m; ~, f3 |7 D
richie@Redbuntu:~/Desktop/NeoStormTest$ cat main.go
  ^- s' k4 b! l4 G: r* ]: I( ^package NeoStormTest
/ M6 b3 ], @1 a, iimport "github.com/CityOfZion/neo-storm/interop/runtime"* Z- _$ z! @" ~# B# X
func Main(op string, args []interface{}) {# w% Y' G* w- q! {/ k4 V. t9 H5 m
    runtime.Notify("Hello world!")
2 A$ q. B, D- T发行NEP-5通证合约
% E$ P2 b5 H1 ]0 b8 p1要在NEO上发行NEP-5通证,我们必须遵守它的通证标准。 *改进的NEP5可以在Github上查看,它允许Token上线NEX交易所。5 U7 c! V5 _! v8 d: L5 i
NEP-5 Token Standard
: T5 e1 F) D+ B3 }7 v- E9 d+ n- r" lMethods
3 H2 C1 @  C9 o+ X* W( G/ k1 U-totalSupply()
& t  E: l' G/ p) Q" ?. r-name()+ f9 g, v8 U- T, f' F; A
-symbol()
3 c7 k  {) B7 t% C-decimals()0 F! p: P0 w( h: |( X
-balanceOf(account)
7 q0 c4 S2 j0 B' o( E5 s7 E* N; e8 b-transfer(from, to, amount)
6 l/ V+ a5 w& }( u* MEvents- E  T" A" v' _2 B
-transfer(from, to, amount)# ^, \3 }$ u% x2 T
NEP-5(.1) by NEX3 T) j! {* p5 @! Y/ S. o
Methods
8 k4 v( D! K% \( g8 u; z-totalSupply()
7 T" d- j. s( a9 O-name()$ s) O+ w* v! a+ v* R$ G# S
-symbol()& ]1 p5 s6 g- L
-decimals()
' I# \+ s9 k' m; }; N/ g6 s-balanceOf(ctx, account)+ A% \; j. M. G1 y- B
-transfer(ctx, from, to, amount, callingScriptHash); _8 [; B9 V' M5 b8 ]2 V
-transferFrom(ctx, from, to, amount)
. g  P) v( k/ `8 v% t-approve(ctx, owner, spender, amount, callingScriptHash)/ S8 N6 w: v3 N
-allowance(ctx, owner, spender)
5 {, `% ~  H: `% f9 Y( W  w2不用重新编写一个Token合约,你可以fork/clone我的github仓库。' p% @0 N" Y  T  q
richie@Redbuntu:~/Desktop$ git clone https://github.com/maplerichie/neo-go-nep5 MyFirstNeoGoContract$ P; ]8 m5 l8 w, J
3启动代码编辑器(我用的是Visual Studio Code),将~/Desktop/MyFirstNeoGoContract 添加到你的工作区(workspace)。Neo-storm的examples文件夹里也有例子,可以点击https://github.com/CityOfZion/neo-storm/tree/master/examples/token查看。
+ k9 l! S: w. X$ V0 \, X
: [" n. m: t" C! n' whttps://github.com/maplerichie/neo-go-nep5  d  g" F/ |) v2 ?7 c. W
4编辑package,修改NEP-5的属性值,例如decimals, multiplier, owner Address, Name, Symbol, TotalSupply。
6 C* L; }% }9 o0 @+ B1 pPackage:应该将package修改为 package MyFirstNeoGoContract ,从而与文件夹名称保持一致。
- A/ w  }  K; ?& TDecimals:用来设置Token使用的小数位数或者Token可被分割的最小单位。
% m6 M. e0 A' q例如:NEO的小数点位数是0,意味着它是不可分的Token。因此不能转账或者接收小数个NEO,只能是整数个。小数只能在交易所使用,因为它们创建了自己的十进制系统来方便交易。
3 q; R( J( j: r9 s" G4 p3 b4 y5 uMultiplier:这给出了Decimals和TotalSupply相乘时的值。 输入格式为10 ^ Decimals。
' H  l* t  Z3 B4 @例如: decimals = 6时,multiplier的值应该是10^6,即multiplier = 1000000。
+ T% {- q+ w1 GOwner: Token发行者的地址。这里我们使用neo-privetenet的地址AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y。1 }, q7 x) J; q6 j" B$ ~
Name: 字符串格式的NEP-5Token的名称。4 p/ u; s/ A$ Z7 u
Symbol: NEP-5Token符号,通常是3个字符的长度,但不是必须的。  F4 e$ D0 a! c9 ]* \2 i. Y' G) K
TotalSupply: 总发行量。设置一个总发行量可以防止通胀。9 y, @! P- m9 t! ?1 z& `
4 U" o+ u& e5 L5 U, o* H- M
5修改参数同时确保符合NEP-5Token标准。然后使用neo-storm来编译GO智能合约。/ y8 }  L/ d/ B( B: p1 o
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ neo-storm compile -i main.go -o main.avm
$ C' N1 L+ _3 g9 ?! L6当前目录下你可以看到 main.avm文件。现在neo-storm不会运行检查NEP-5Token标准。我的经验是缺少owner Address信息时,会显示错误信息。
" V, f" Z1 E, S9 Q& s1 v# B7现在讲NEP-5合约部署到Privatenet Docker。这么做之前我们需要先获取Privatenet Docker ID值,然后在主机上复制main.avm文件并粘贴进Privatenet Docker镜像中,然后将它附加到运行的Docker中。
6 C0 V$ s% p& h1 prichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo
3 K! j& E( \* J8 idocker ps
; N0 Q. x/ f8 NCONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                                                       
: o  }$ p3 t, B" P' DNAMES  f6 N8 ^! V, S" C7 j" |
69c60667835b        slipoh/neo-scan             "/bin/sh -c 'sleep! a1 C3 [, X" X+ m5 C
3…"   6 hours ago         Up About a minute   0.0.0.0:4000->4000/tcp                                                      . _1 W* m; z% O
neo-scan
3 y2 V3 |# g9 w& M9 s4 m2 M88b358cdd8ff      
$ o& y# K6 V8 B7 {( m4 {/ Y  h+ rcityofzion/neo-privatenet  
* j% U2 [: t, m6 }# o8 O"/bin/bash /opt/run.…"  
7 A, J* D% x) [: N# S6 hours ago         Up About a! q. [2 c# w/ ?) L
minute  ; p! j/ C, R5 N: j: i' g4 f' \
0.0.0.0:20333-20336->20333-20336/tcp,
2 G8 ]' \+ q* H; G1 i6 _0.0.0.0:30333-30336->30333-30336/tcp  
- @% w' g. u4 t' ]neo-privnet
( P- D& A# F1 E+ E: l3 oab96dc398c62        postgres:10.1              & ~% y) C; Q2 ]7 ?- t
"docker-entrypoint.s…"  
9 U) b  L" R1 _8 n" S8 u8 e6 hours ago         Up About a  [; R' l8 @! R9 g: l+ Y% x
minute   0.0.0.0:5432->5432/tcp                                                      1 D- L# l  d1 w( Z
neo-scan-docker_postgresql_14 P" _' u5 V# S+ m+ J0 o
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm/ P* |, _4 ]0 C  `
88b358cdd8ff:/neo-python" Y! ^; _# Q% [
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it! O2 W8 X+ v: f
88b358cdd8ff /bin/bash
5 ]: n3 _- A) E; v+ M* h*共识节点运行在在screen sessions,使用’screen -ls’命令查看; p" ^( m* D; z5 a5 p- \
*neo-python安装在/neo-python目录下,目录下带有a neo-privnet.wallet文件5 u, R: v/ `  h7 c# b; m' Z
*有问题可报告给:https://github.com/CityOfZion/neo-privatenet-docker/ I* @& H/ U( F+ I7 {2 c# c
8在Docker上,打开neo-python-cli终端并使用密码coz解锁钱包。
' Q! z$ Z( [0 P+ h) V- Aroot@88b358cdd8ff:/neo-python# neopy& Z! y8 R" o) l
Privatenet useragent '/NEO:2.7.6/', nonce: 513759764" u0 X. q* S% p; j9 D
[I 180914 10:34:09 LevelDBBlockchain:114] Created Blockchain DB at /root/.neopython/Chains/privnet; j8 \5 i/ z% N
[I 180914 10:34:09 NotificationDB:73] Created Notification DB At; T! ~! J8 p+ o9 x/ F, o( C% w  B
/root/.neopython/Chains/privnet_notif
2 x1 R8 z! v& z$ s7 iNEO cli. Type 'help' to get started
3 y, j6 L  n/ Y, P! j$ Tneo> open wallet neo-privnet.wallet6 Q; ?  l; b7 C  E
[password]> ***
- q7 l* G3 M3 t+ }# }% T: L- qOpened wallet at neo-privnet.wallet/ Y' h, h: Z6 s5 _8 j9 L
9部署合约main.avm前,使用neo-scan看一看钱包余额。8 r0 U1 {+ g1 ?4 U
neo> wallet
# a7 Y- B  x. l8 v6 t& |[I 180914 11:01:22 UserWallet:538] Script hash8 p' g0 J, [1 y0 I2 A2 N
b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
/ j1 D& N$ q4 Y* h6 F7 J8 u, @) \( B% SUsed 0.357 Gas % b+ Z  P3 f4 b- }. W- N
Used 0.357 Gas
8 n# z* x: p% YWallet {
4 K# C) O4 ?3 j" @6 O: p4 e+ _    "path":- E2 ?3 F7 d5 h5 J
"neo-privnet.wallet",
+ ~  j3 y; z! O" e' F    "addresses": [" G5 L0 f! j! X# B) M
        {1 h( V7 S: V/ w/ O  E& L: W
            "version": 0,
: X; K* Z. @# {  z            "script_hash":% L- j7 `$ J$ t$ W8 r. A1 ~2 P
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",- X4 F9 a2 V8 R1 ~# U
            "frozen": false,
! n4 H! Q" j/ G# N4 g3 y' W            "votes": [],
! I0 N& Y3 o# E  n: H7 B7 P/ j            "balances": {
7 j2 \% E4 x% ^5 s+ F4 }' W         
, |1 T# B9 P  ]0 V0 H2 S"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
: d: n1 T, `3 |"100000000.0",  m2 d8 N& P# {' J3 l1 v' B: A
              * e$ m" r; f6 }" V
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":; b5 c7 v) s# [' f4 v
"74589.9996", j3 {' c, W& V3 s8 e
            },
6 |$ s  x9 i( e4 P            "is_watch_only":
" q$ i0 i2 A. a/ h: [6 r3 Y/ @3 kfalse,
/ w1 Z! e! @0 i            "tokens": [9 C) n% p' w( ^' H# v
                "[a3640dd3c560c75528e5f861da5da98958d0d713]. O, x0 ]/ c# J1 |
NXT2 : 2500000.00000000"  K+ v8 a7 c. W3 U, {
            ]6 T* T: x* p0 a. {. f& u1 D! w
        }4 l5 l1 ~, \" u% {& A
    ],
; `7 \# O; u1 K* Z! H    "height": 10294,5 N: x  T% R. `2 A% h
    "percent_synced": 100,
- @# u$ g0 U* x& H9 b$ d! s6 Q; w7 w( H    "synced_balances": [/ k& M% b3 ^0 c( ?8 C; Y5 g- g  F
        "[NEO]: 100000000.0 ",
, e# g/ T+ r) Q        "[NEOGas]: 74589.9996
0 T  Q" j2 b$ ?0 y0 B",
( h- J& y: ?* v! F4 s- j6 L6 W        "[NXT2]: 2500000 "5 f9 F9 q, N' x: ^! W+ I
    ],1 p( j3 q* X0 [1 x/ |- T& S
    "public_keys": [+ o* v" I, u( Q1 q  D3 Y3 P
        {' {; |0 U# d8 c3 N
            "Address":
! f  [# t, x' \2 D1 K"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
7 u: O) X. Z5 }            "Public Key":
' R4 ?3 x% ?- J# r# W1 e7 i6 Q' c"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
1 y7 @! f4 f4 L9 q6 u        }% L, ]$ J7 x% r, b6 E
    ],5 ~( R" A! M7 n- W% ^
    "tokens": [0 x, U+ f5 {, g8 u$ C9 W
        {
; `/ ~3 |. r: G, U3 _0 F- N% H            "name": "NEX
9 [4 v; A$ g0 x0 i4 g; S% L: wTemplate V2",
; {) ~% R* d5 l' w% M            "symbol":
0 {' i0 D# a! {"NXT2",
9 K8 F: q- z# C8 y9 A            "decimals": 8,
; x, J0 ^( M* O4 s, J1 @% N            "script_hash":
, u5 E( ]+ d+ ~+ k3 z& t5 E4 E"0xa3640dd3c560c75528e5f861da5da98958d0d713",
7 v4 O7 o1 N" g6 L            "contract_address":7 A8 I) e% @7 ^- |
"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"
. L! }- i9 I! H. w6 }& T+ D        }7 w$ A8 x7 k/ Q  C
    ],& E. C! @- j3 f$ D, P
    "claims": {
4 ~" s# D/ l# ]) M) K/ O        "available":. E- N4 Q& [7 o
"0.0",
1 R( u: M$ e- c; n; }/ @        "unavailable":
4 ]$ `7 q6 G) _; n2 e) w# j& R"7730.0"
8 V% t( D3 _' Y0 ^8 v6 n% s    }( y' W8 K4 @2 h/ V5 m( Q
}
8 }* M  a4 q6 s' r10看来可以开始部署了。再次提醒,钱包密码是coz。$ n9 Y" k" b4 f; B2 L* T; A
neo> import contract main.avm 0710 05 True False / a# g3 G4 B+ I1 r8 v; N
contract properties: 16 k) X, ]9 h# k  r( D
Please fill out the following contract details:; @2 d1 h5 _; J
[Contract Name] > MyFirstNEOToken+ T/ X. a+ m; B! D2 q
[Contract Version] > 1.0: G# S4 K! Z/ I
[Contract Author] > Richie5 q8 U" v3 G/ O8 Y
[Contract Email] > babierichie@hotmail.com5 `  U4 K* l3 Z) B4 m3 i2 O0 X4 E9 o
[Contract Description] > First NEO Token: z6 T2 h8 E- T+ b% n
Creating smart contract....
" H2 |- Y# f/ h                 Name: MyFirstNEOToken
% m6 ?" Q  L/ y0 `5 @              Version: 1.0. K+ l7 x- O+ l  n; a
               Author: Richie 8 q4 G) C  H' R
                Email: babierichie@hotmail.com
+ {) g' x& C  e8 N! Y% D% j/ r  b          Description: First NEO Token
" h" l+ T9 ~& |. ^0 Z        Needs Storage: True ! I5 {4 f( b# x: ]4 B  m
Needs Dynamic Invoke: False ) }5 s2 v6 H1 i4 X
{2 P. X6 l- C- Z4 P2 E8 C  v
    "hash":/ D+ \$ W2 R9 \' u. v8 P2 B7 Q
"0x4e9b87c96158a8e2cc4b74794f727b38947e9862",
5 Y# R0 [: l' u/ S9 c" D    "script": "...",* b% N+ {. E" b! ]% W9 Y
    "parameters":$ D7 i0 n+ o- e" D
"0710",
9 t: S/ I  X" {; q9 j    "returntype":3 z- p9 @. R1 ]
"05"+ C; \5 {. {( U: }
}
( p8 [6 H1 Y$ h; A4 [% T+ A8 T! SUsed 500.0 Gas
/ y5 f# }- s& W9 h6 l-------------------------------------------------------------------------------------------------------------------------------------
7 q8 I5 a5 o0 n. N& LTest deploy invoke successful, i8 z. x9 v* n( B3 Y5 `& f' ^
Total operations executed: 11 8 D  K& n- k" K' I* \9 {- U
Results:
1 J9 N$ t4 b$ ]/ `5 \( \[]9 |* i! V& e: M
Deploy Invoke TX GAS cost: 490.0   G% Y: Q; p! G
Deploy Invoke TX Fee: 0.0
. u" Q8 I* k! h( q-------------------------------------------------------------------------------------------------------------------------------------. u+ l& W2 C1 k$ V( F$ R$ ?
Enter your password to continue and deploy this contract$ a3 x! U$ B: e3 H5 {" s. D
[password]> ***3 ]5 B$ |1 |+ n7 H1 O
[I 180914 11:03:33 Transaction:613] Verifying transaction: b'9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114'
+ s* W, m" h0 U* w+ mRelayed Tx: 9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114
* q- o) G4 ?+ C+ |! J; S11使用给定的哈希值验证交易。 注意:不同机器的哈希值是不一样的。& t( X, V7 j) X: r6 ~" H
neo> tx
- Y2 l: _1 U9 K: x/ J. c# b9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114
. q3 g/ ^$ y1 `; y{
  M2 R7 R+ t2 S: p    "txid": "0x9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114",- |; V& K( C/ C* v& Z5 Z
    "type":% z8 y; @6 U: P, b4 \' C
"InvocationTransaction",
. [8 _! A: R2 N0 s* ?    "version": 1,: a8 b$ ]9 ^0 N0 b1 g; s7 q+ B
    "attributes": [],  c: a5 d6 C0 H1 P+ E
    "vout": [
' H* x& z6 c& K" G5 r. i) O' z        {( Z$ D1 [+ r' {) F9 V
            "n": 0,+ a8 c) T( T2 ]# ]: r, }# q3 k
            "asset":# T) K7 s; I, n: `; T
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
4 }5 y- y& a4 q1 w8 [& u            "value":8 i: h/ m, B8 G' g( N! a
"25493.9997",
+ i) t' [( o5 [            "address":9 E; _; `2 x$ s- d" D, g* [
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"$ t- |. [% `1 Y# R5 E, Y# O
        }9 H( `; T) e/ q9 _8 y/ s
    ],7 _' \' S; C! C; [% J' H# I
    "vin": [1 t" @& Q9 v$ P. u6 V
        {: z, p0 Y0 q7 Z& `
            "txid":' ^& F8 ^* ^- Y; F
"475a091ccaa6330320a29884f5f8796a260bdba91352dd409d16787b37d8be26",; P! C- j* a8 b  ~! U! m% ?1 V
            "vout": 0/ Q$ i0 v: z, a- y( V) G0 U6 Q' r
        }
" i. R# x! v* a    ],5 J5 T2 U% {; p' J! c! ?7 h7 n# t
    "sys_fee":
2 k% A; [+ t- L" [7 a; D1 t"4.9e-06",
2 p' p- U6 r1 T8 P, O    "net_fee":% Q2 I( x) e$ `, u' v
"489.9999951",
2 f  ^/ i  Q+ n6 L; D2 |0 G! t, z  A+ f4 [    "scripts": [
0 R8 |8 d/ w# k        {7 l8 C# Z1 w; v# @5 H1 F! Z
            "invocation":
0 F' _7 d* d4 E  k"40510fa6630ef581108057ebe967cd306522466a32eaf068cf3717da1e640b866246c013033e3c878ebf9247a5a3500178b21b126b3af63ed07a86b0d2c4f34c89",( a$ s0 q$ E  \+ j
            "verification":
( z% J  y( L# L. `" X"21031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac"; Q9 |$ f) }9 f9 E, ]( {: m
        }
7 S* y2 H$ {8 g2 _0 n    ],
( p4 i' J  N8 }. D$ c: @    "script": "...",
$ B, I9 z7 F7 K3 p3 P7 k    "gas": 49000000000,% `2 W( N8 e) t2 {9 I9 e# u
    "height": 10302," i2 x6 A) L3 N+ }
    "unspents": [$ d* ?$ q6 `7 O8 Y' c- o
        {
2 a2 \/ H) a! O8 K3 y            "n": 0,
0 W9 p- i4 m6 h+ u3 {" a            "asset":2 E- Z- j0 w9 a
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
' s3 ?9 i" T: y) W3 s            "value":4 q' _2 a# ]( d! Y: L5 K: ]
"25493.9997",7 I2 W% D* c5 z1 W7 P$ n2 _9 W
            "address":
  R  e1 |' i* c+ S+ S' ?"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"# t' J8 C% C, X
        }
6 `7 Q: R; E# l5 [9 c5 \) y3 |    ]' ]  Y# o! ]. M, |  k6 K3 _2 s
}
0 E- [+ c. x9 ^$ ^! L* D' E! A12交易显示后,再次查看钱包余额。 在步骤9,我们的GAS余额为74589.9996,现在,GAS余额变为74099.9996。 因为这减少的490个 GAS已用于合约部署!
; H) h; T9 ^3 j4 o) F  Yneo> wallet
) q& K/ C, s5 Q[I 180914 11:18:38 UserWallet:538] Script hash
8 L" M! v7 N0 t( y& C8 cb'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
; H: @0 O1 F8 U* _6 L3 r6 @Used 0.357 Gas 8 o+ s# X( o- {# [
Used 0.357 Gas
6 n5 l- @/ H' O6 O, SWallet {
; i4 ~5 A! P" A8 ~8 U% }1 Y" P    "path":
( w1 N2 I. i( p; M6 S* K"neo-privnet.wallet",
' V+ l$ v# t% v5 O. f    "addresses": [0 U/ I7 Y) E0 X+ U. Q
        {
5 i/ k( E& Y& J& F& T( G            "version": 0,
4 q8 v( c5 {6 h            "script_hash":
$ Y4 Q! N  i4 R2 X"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",- f* L$ A0 n$ O- q- d( n' _; i: c7 x
            "frozen": false,
4 D9 A" Z+ H) N8 s& a# v            "votes": [],% y- B) m# q8 z. y0 ]( y1 n3 e
            "balances": {" z$ l7 ?1 z4 N9 L' L0 @
               ! G6 |" T" |; b6 w, e7 h
"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":( }. s- Y+ x, S
"100000000.0",/ r2 e2 u( M4 ~- ~6 L
               
- e+ \1 d4 c7 ~% X! ?5 {8 z"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
8 K& s& j- ]) M# N1 W"74099.9995"
9 a' i+ W% @0 ~' ?            },' w  R) U3 ]' S% [
            "is_watch_only":, S$ n' V5 g0 j4 P$ R
false,6 d  i* u5 F$ M. l- B" _
            "tokens": [, L5 |- o' j( ^$ p1 e. p% N
               ) u$ ^! n( c, N7 i& W6 W& r1 Q
"[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 :
; F. g. f7 B5 g( O" X1 K0 p2500000.00000000"
) e/ n9 b8 `' u6 c4 s            ]
9 v+ l$ O; [- J! e1 ?+ }        }
' j" K  _/ \$ z" z    ],
: R% T1 y# s7 T6 t% z; |  Q# v    "height": 10348,; }! f2 {7 e) R' b2 C
    "percent_synced": 100,
8 `- S* X' {/ D2 c, A8 Y    "synced_balances": [
& K$ [1 y6 S% z        "[NEO]: 100000000.0 ",
6 p: K% G4 L* z& Z        "[NEOGas]: 48605.9999  `) _" q, o5 K6 l7 b/ `$ h
",
4 d& x' p, m$ f        "[NXT2]: 2500000 "
9 f0 h) [$ L" M" d) r" O5 g    ],
: s, u/ m( N' O. J, \6 Z    "public_keys": [* D0 L, }' }3 J% ]8 H
        {; W4 Q* h( p) I8 ]3 _
            "Address":
1 i4 O( F" \1 a: k# S2 A"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",( M  C2 f. M3 v+ a! d
            "Public Key":- \5 P, ]6 U- j5 a, I4 H
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
% H% ~: }! a$ g+ Q: c$ @! O  {        }
$ e! b/ P+ l/ f    ],# k0 M1 u' S9 j; |0 s/ v
    "tokens": [8 V) {( X, H  @" A
        {
- i1 s; n) N' K9 ?: l            "name": "NEX
- c) W9 X5 Y/ R4 `4 lTemplate V2",
3 U6 @( Q9 A4 A6 E  O            "symbol": "NXT2",
' |0 O3 q" t$ M            "decimals": 8,
. I" V* u' x. e% C            "script_hash":" [3 f5 T* H4 a5 ]1 b. M, r
"0xa3640dd3c560c75528e5f861da5da98958d0d713",* _( }- t- T* }, K* j9 y- n
            "contract_address":- k- V- p' F6 T& |: T" j
"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"2 n  s7 |- B& e: D* I% U' h; A
        }" h4 @# ^7 H3 a+ A
    ],
: J# {5 ]' K+ ?$ q0 h    "claims": {
6 `; |( o4 j! `        "available":0 {+ h& j( @/ ]# u; P
"0.0",
9 W, ?& @& k8 G& M        "unavailable": "8652.0"; L8 O0 x9 V; |  }
    }$ u& z& M$ s: f$ _& h5 v$ s4 {, a
}( ?+ X5 [/ [7 a( d& ?; @6 j
我们也可以看一看部署好的合约。* a/ r0 B3 p* ~4 I% ~
neo> contract search My0 B3 `, Q+ B! i& g  P
Found 1 results for My
5 |! e) G* |* n{
8 i. N! ^6 _# L( T2 L- ]" p: N    "version": 0,+ [& ^9 e  E9 i" X' X
    "code": {
7 {- z$ {' M" A, c1 t" {" L5 t4 ^        "hash": "0x4e9b87c96158a8e2cc4b74794f727b38947e9862",2 H& \+ x6 _% u. t  H( Z
        "script": "...",6 }, g0 T8 [% r8 q/ x
        "parameters": "0710",/ B! W& w( S; H  s/ W
        "returntype": 5
7 m! _4 i0 Z/ |9 _0 g( D6 l    },
. v& L3 d. ]! l# `' \  ]    "name": "MyFirstNEOToken",7 N8 I' P. A4 S, B/ W% B6 u
    "code_version": "1.0",9 S) L6 I% b9 M7 x  j
    "author": "Richie",$ ?2 {% z& h5 O4 F8 b4 o$ G
    "email": "babierichie@hotmail.com",
, L7 L9 z3 }: O& |. l8 ^    "description": "First NEO Token",/ s" d. O. Z" v7 \( y/ n
    "properties": {
+ a$ U3 V; I: ^: ?        "storage": true,4 P' i7 \0 i% Y
        "dynamic_invoke": false
3 \, G) ]% P5 Y$ X4 o0 Y    }' o3 M; W; c- ?
}+ E9 U3 }2 V0 e9 E0 t7 {. S
13最后,我们可以尝试使用钱包的密码coz,来调用这个带有合约哈希值的Token。! b; R' n; Z- _3 k
neo> testinvoke
  r$ I0 z; A: w3 e0x4e9b87c96158a8e2cc4b74794f727b38947e9862 deploy []" B2 P, b- [8 J0 S  B7 ?
好了,现在你已经在NEO的私有域上成功的发行了NEP-5Token。7 v, i3 K% e) y, k0 N
最后/ x' A8 c8 z2 I* X0 w# l$ ?
希望对于Gophers来说,能很轻松地照着本教程学习。也希望GO开发人员能加入 NEO’s Discord,一起开发学习。你一定要试一试!5 C: j/ {, D) y, R6 O
如果您真的需要我的帮助,请在Discord上联系我(LikKee.Richie#5647)
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14