Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
介绍% q6 s: {9 E  Y! H8 s
开发语言3 q* r, O' k5 d5 G: d
在NEO智能合约开发平台进行开发的优势之一是平台支持各种开发语言。/ H9 Q! z: k# D  v& v5 q3 f
NEO推荐使用C#语言,不过它也支持使用Python, Java, Go, Ruby,之后还会进一步支持Kotlin, C/C++, JavaScript等开发语言。.
1 g8 g- s: `0 _) ~6 F7 v( H" X尽管支持多种语言,但我们仍可以发现现有的很多项目使用的是C#、Python、Java,使用GO语言的并不多。因此,参考City of Zion (CoZ)上的资料,我想尝试写一篇关于使用GO语言开发的简单教程,希望能吸引更多使用GO语言的开发人员参与开发。0 a8 Y* G; v4 o
给GO开发人员的建议
, Q6 s2 p/ y) h. x% U& R无论你是编程新手还是经验丰富的开发人员,刚开始时都建议你在私有域或测试网上进行开发。! F; p/ U# x9 g8 _. D% q
为什么?- r1 W2 P! u- `2 m/ y$ q
因为在主网上部署NEP-5 Token需要消耗490个GAS。" V) ]' X+ M0 L, \; e! ?& H: R
写这篇文章的时候(2018年9月15日),GAS的市场价格是5.8美元,那么该笔费用就高达2842美元。对于任何创业公司而言,这都是一笔不小的费用。2 |1 N6 `9 M9 c: n
按照GAS的历史最高价,每个Token的价格为95.87美元,那么仅仅部署一次智能合约,你的成本就要增加4,7000美元。
8 X" Z1 c  Z- d3 P6 W因此,刚开始开发的时候,建议你在私有域或者测试网上操作,当你准备好之后,再转到主网上部署合约。+ i! |8 r% _) M# Q1 c* `7 Q5 j
要求
* K2 D1 b# L  f; g7 w本教程中,开发环境的需求如下所示:
% u* \( y$ E1 K& i5 t0 K: J6 @操作系统 – 桌面版Ubuntu Desktop 18.04.1 LTS
; j+ \+ ?8 t- ^# d7 }* {+ p6 XGit 命令行接口 –Git  g& G  x& C5 k% L  ~
语言 – GO语言9 t: k0 B5 }6 v8 H& w
Go语言依赖管理工具 – Dep
0 D  S/ K  ]& |8 R5 qDocker –Docker CE 和 Docker Compose
% [+ Y" R) h8 `) ]编辑器 – Visual Studio Code, Extension: Go
4 T* [0 `) y- t使用到的NEO的资料
9 K3 U) l( }. ~GO语言智能合约框架 – neo-storm* A. v1 ~) f" z4 Q9 B- ?
预建好的使用Python语言编写的neo-privnet-with-gas以及nep-scan镜像 –  neo-scan-docker, I$ w* l8 i' u" W& o. S, Z
重要提示:结果可能因NEO编译器和节点版本不同而有差异。
0 T8 d7 u% W7 F  E% Z& S* I1 ]本质上来说,有几种方法可以运行私有域,例如使用 neo-go 或者 neo-privatenet-docker。 但是,在本教程中,我们会使用slipo编写的 neo-scan-docker。 neo-scan-docker是用neo-python构建的,所以它带有一些“Python”组件。 此外,它还带有neo-scan的UI,允许您分析智能合约的部署事务。
* O9 {1 _% d$ O* N*安装方法可能因操作系统而异。 相关的详细信息,请点击上面的链接查看。/ E. N  J* I$ E7 @' A6 ^) Z% j, |
配置你的环境  N6 V6 a. A8 s$ X! L
首先,我们先用 neo-scan-docker来配置一下NEO私有域。
6 p$ p/ o+ L% [% ~  Z1 检查一下Git, Docker and Docker Compose这些工具是否已经准备好。. T! M% F' P  d* |6 ]& ]1 H) ^
richie@Redbuntu:~/Desktop$ sudo git --version# [3 u9 ^- A! Y( c
git version 2.17.1$ S# }" h2 a. M) O; s4 R6 X
richie@Redbuntu:~/Desktop$ sudo docker -v; P6 [0 C& F8 J4 @
Docker version 18.06.1-ce, build e68fc7a
) L& B" X6 I7 ^  m# `( trichie@Redbuntu:~/Desktop$ sudo docker-compose -v, [/ D+ e0 b* n; s2 N4 f6 Y+ D+ J
docker-compose version 1.22.0, build f46880fe
1 N) u( k4 |$ t1 K+ F1 R9 C2克隆(Clone) slipo的 neo-scan-docker仓库代码,并使用 docker-compose来加载Docker镜像。 下载镜像可能需要点时间,请耐心等待done状态的出现。2 k* l8 x1 y2 n, |  [+ v
richie@Redbuntu:~/Desktop$ git clone https://github.com/slipo/neo-scan-docker.git
  D+ q1 {# s  b/ d! x4 }Cloning into 'neo-scan-docker'...
, C5 K: o# e% d! G7 x# H5 Fremote: Counting objects: 27, done.
3 K) W) X5 q# X, Iremote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27  h1 c! O4 \+ L
Unpacking objects: 100% (27/27), done.  f- q1 l/ [/ z3 [0 n
richie@Redbuntu:~/Desktop$ cd neo-scan-docker/( O0 r5 O; w* v% Y, L
richie@Redbuntu:~/Desktop/neo-scan-docker$ sudo docker-compose up
8 K# S/ N9 e5 p# O8 h1 J8 uStarting neo-scan-docker_postgresql_1 ... done# }8 Y0 e0 X6 V+ X# g
Starting neo-privnet                  ...7 C6 d1 O+ ~- y8 `
done' R" s& ?2 w  ]! Y# q
Starting neo-scan                     ...4 [8 F% j9 s6 l% ~" A# E
done7 w+ d0 Q. Y7 H. O0 Q
Attaching to neo-scan-docker_postgresql_1, neo-privnet, neo-scan`/ J6 [% N* ?* Q0 i/ ?  ^5 C
3在你的主机文件中,添加127.0.0.1 neo-privnet。注意:主机文件的位置可能因操作系统而异。# H. Y" O9 h1 C1 ]5 G( `9 [" o6 r
Unix/Linux/macOS - /etc/hosts2 F6 S0 u* d* U! O/ n# R" m$ R
Windows          - C:\Windows\System32\Drivers\etc\hosts`
8 x$ L2 d" g4 S) A6 E2 Q3 ?4在浏览器中输入http://127.0.0.1:4000/,可以看到City of Zion (CoZ)提供的neo-scan网页界面。: E1 c8 t. k; x  u2 [" T
8 W# l+ E1 ?4 m' f; V
5点击钱包地址(Wallet Addresses),你可以看到预存有NEO和GAS的钱包地址。部署智能合约的时候我们需要使用到这些Token。更多信息,可以查看 neo-privatenet 。/ D) q, K; n  Q0 L
导入WIF密钥可以获取预存有NEO和GAS的钱包的密钥。 私钥/WIF 密钥 KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr 地址: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y 脚本哈希值 (用于检查): b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'" W1 T- q9 f0 Z3 l# p
这样你的NEO私有域和neo-scan就已经配置好了。0 G; F7 I7 V) U2 E
下一步,配置neo-storm。( {& O2 T# P. ?! g, n: R. ~$ X! Y5 g
1在终端中输入下面这几条命令, go version、dep version以及echo $GOPATH,确认一下Go, Dep, GOPATH都已经准备好。
: w, w% w3 q0 Z2 e) nrichie@Redbuntu:~$ go version
2 l( T4 f7 ~  n$ }go version go1.10.1 linux/amd64
1 U, T" A  H. T4 c6 grichie@Redbuntu:~$ dep version$ n. l! |+ e: v( k9 h: ~& B: V
dep:8 u* @( U& f$ V5 _5 @% C
version     : devel
/ c) e* t% @. u3 e" v build date  :
) d+ r8 \3 X* I6 X& X git hash    : 6 H1 n& N7 z' ?- g) x/ e9 A" j
go version  : go1.8.3
. p* A7 t  B( W6 T! G  J4 ~* m go compiler : gc6 F4 m6 s  f% \. y# V6 N& r/ e
platform    : linux/amd64$ w3 _$ ^- w/ k+ Q/ ~# Y7 X
richie@Redbuntu:~$ echo $GOPATH
8 h2 L, ~: E, M* q* r/home/richie/go
  g0 Q# t9 V3 H3 _( [* P% M2输入 go get命令获取neo-storm,输入dep命令检查依赖包,使用make install命令进行安装。 *忽略警告信息
6 I/ F$ e1 i& {richie@Redbuntu:~$ go get -u* j) _' A  V  a6 n
github.com/CityOfZion/neo-storm
1 N2 L( o. @( T- Apackage github.com/CityOfZion/neo-storm: no Go files in2 s) N1 u; J9 x/ z0 x
/home/richie/go/src/github.com/CityOfZion/neo-storm1 r; r/ Z3 j5 u/ ]9 k
richie@Redbuntu:~$ cd $GOPATH/src/github.com/CityOfZion/neo-storm1 d0 N: O3 `/ M
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo dep ensure
6 j1 X7 `2 w4 _6 I-update/ l" W8 o% J( I* A' f+ H& D
dep: WARNING: Unknown field in manifest: prune
( f& E5 c0 |4 y4 p( F5 u" }richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo make install& C( V1 q9 x- N+ S5 i9 Q# V
installing project dependencies. C1 r' V6 K2 \* s/ e
dep: WARNING: Unknown field in manifest: prune
& a# w1 ~2 Q9 e, C, i" x1 ?# binstalling neo-storm framework( }% @+ m( l5 f6 f& w  w# s% L
done installing, happy coding!* \# H7 {- F6 m8 m( H. o- ]1 k
3现在neo-storm已经安装好了,你可以测试一下。& j3 s) r2 w! _% ]7 U' G; o
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$& G/ J/ b) l, e" I1 G" @2 ]
neo-storm
$ x0 O' x7 M- g# P2 {7 Z+ m% BNAME:7 r% J; i- f/ l
   neo-storm - Neo smart contract
8 Z2 |( i* ]. x( d: @( o6 Pframework for the Go programming language0 m2 ^# E- {* I+ V1 |$ c7 h' d) `6 m
USAGE:
9 U) k* |" L6 Y' ~! f5 s- z1 L6 z   neo-storm [global options] command[command options][arguments...]  \3 @" B+ p% [8 l6 N
VERSION:( {/ T; @+ i( |; K2 ]
   0.0.0
- }: i! I9 y1 @. E- w: [" qCOMMANDS:, G; N1 ]: W" f  w, I7 A0 a& \
     compile     compile a smart contract to an .avm file' \$ c# p( O7 C/ t  a* p; R7 x
     testinvoke  testinvoke a smart contract against a remote NEO RPC node& j) T1 y( m3 b" v
     init        initialize a new smart-contract in a directory with boiler plate code
* J: q* P0 F# g, @     help, h     Shows a list of commands or help for one command
0 }* N/ P: P& g/ M) f2 _# TGLOBAL OPTIONS:  f) Y& G4 g8 ?6 O# H  c
   --help, -h     show help2 U" S4 e# R/ i+ A- ^
   --version, -v  print the version
3 I  n; U0 ]! {  j5 K4 J. a4“安装完成,开心编码” ——接下来开始我们的第一个智能合约吧。
, s" b; T; M' Z* x8 z* g/ k  krichie@Redbuntu:~/Desktop$ cd ~/Desktop
* n9 ]. S" N- ]richie@Redbuntu:~/Desktop$ neo-storm init -n NeoStormTest
! m6 ]3 w6 J9 h* t& w, kSuccessfully initialized smart contract [NeoStormTest]
" J. E) @( P' R+ P/ u$ @richie@Redbuntu:~/Desktop$ cd NeoStormTest/" ~* V- L2 Z7 F1 Y* h$ I
richie@Redbuntu:~/Desktop/NeoStormTest$ ls
8 m5 [7 M6 p$ d6 m/ R4 Smain.go
0 L% V% p: `3 ^! f  _$ I6 h  drichie@Redbuntu:~/Desktop/NeoStormTest$ cat main.go4 `, z# P( d1 [% J4 D2 J
package NeoStormTest
. L5 X- C, p% E3 S& Zimport "github.com/CityOfZion/neo-storm/interop/runtime"& j5 X# I! C* E* r5 \
func Main(op string, args []interface{}) {) [* P# n  T9 B, B6 Q
    runtime.Notify("Hello world!")4 ]2 O1 a: _" D% @
发行NEP-5通证合约- @2 a' b! ^; q; G( p
1要在NEO上发行NEP-5通证,我们必须遵守它的通证标准。 *改进的NEP5可以在Github上查看,它允许Token上线NEX交易所。1 a" }9 r& D" {7 @
NEP-5 Token Standard
% ^4 N4 b6 d& [7 n) l& `# SMethods
' _: U1 G7 s$ P0 c6 R2 P-totalSupply()
% [$ r. J- s! J. @- H-name()
2 V& }. N5 W9 r7 a7 s-symbol()$ `' N7 C5 A' B
-decimals()1 |& S9 l4 U  q' q2 _
-balanceOf(account)
# f( E) T' l( @  n9 K-transfer(from, to, amount)
# f9 S* j8 M* J! O/ Q7 H8 PEvents
' k" d) v5 E5 V5 B8 l5 v% q2 L6 U-transfer(from, to, amount)
8 [! t$ b$ W1 e2 b' `0 O' ~! RNEP-5(.1) by NEX
: B( G# ^+ Z& X% C, VMethods* |5 W$ k' h, |( Y/ v
-totalSupply()7 Y4 K/ @0 Y9 U% ^+ T; y6 P) k9 ^
-name()
( G7 w2 C+ o& c+ k: N: v$ M& f+ w-symbol()
6 f5 C0 @' M; v  Q1 y( k9 u-decimals()) |* b+ {1 {) _9 n
-balanceOf(ctx, account)
7 q4 Y1 R0 Y* k$ j, ^# {-transfer(ctx, from, to, amount, callingScriptHash)
; W! E( u  i% G' D-transferFrom(ctx, from, to, amount)2 f* \) X+ x, i2 p! n( M
-approve(ctx, owner, spender, amount, callingScriptHash)
% ?2 L( R# S( Y-allowance(ctx, owner, spender)
/ W& [1 S" V( u8 L2不用重新编写一个Token合约,你可以fork/clone我的github仓库。7 g: o# M, ]6 l/ [
richie@Redbuntu:~/Desktop$ git clone https://github.com/maplerichie/neo-go-nep5 MyFirstNeoGoContract
" E0 y7 C' B) Q4 k7 ~9 ?; M3启动代码编辑器(我用的是Visual Studio Code),将~/Desktop/MyFirstNeoGoContract 添加到你的工作区(workspace)。Neo-storm的examples文件夹里也有例子,可以点击https://github.com/CityOfZion/neo-storm/tree/master/examples/token查看。2 c1 w; p1 |! a9 f& T

; x+ Y/ k4 S; n2 O$ N& ghttps://github.com/maplerichie/neo-go-nep5; d0 [+ w' m6 h8 b) S1 \7 G
4编辑package,修改NEP-5的属性值,例如decimals, multiplier, owner Address, Name, Symbol, TotalSupply。% L7 D$ L3 Q6 A! W$ Z
Package:应该将package修改为 package MyFirstNeoGoContract ,从而与文件夹名称保持一致。
$ q" b: m" l; \, G6 rDecimals:用来设置Token使用的小数位数或者Token可被分割的最小单位。
2 n! u& M8 l/ b+ @例如:NEO的小数点位数是0,意味着它是不可分的Token。因此不能转账或者接收小数个NEO,只能是整数个。小数只能在交易所使用,因为它们创建了自己的十进制系统来方便交易。! w7 U5 Y* d  L5 x
Multiplier:这给出了Decimals和TotalSupply相乘时的值。 输入格式为10 ^ Decimals。
: [9 b+ A% c8 {. O例如: decimals = 6时,multiplier的值应该是10^6,即multiplier = 1000000。
# k( ^* o1 x) K- V& POwner: Token发行者的地址。这里我们使用neo-privetenet的地址AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y。
) s8 w4 g$ i! q' z) s% ], m, ZName: 字符串格式的NEP-5Token的名称。  z+ J6 j- O# A5 k, H
Symbol: NEP-5Token符号,通常是3个字符的长度,但不是必须的。! T2 N; q( Q: v8 N0 z# w: `$ `
TotalSupply: 总发行量。设置一个总发行量可以防止通胀。) ?3 d& ?2 l' ?1 q

, V! F6 @3 S/ I/ I  s% B5修改参数同时确保符合NEP-5Token标准。然后使用neo-storm来编译GO智能合约。
3 G4 e- n3 N# x' }; s7 @% |richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ neo-storm compile -i main.go -o main.avm% \9 ~8 h/ s1 d2 }3 o# }6 c
6当前目录下你可以看到 main.avm文件。现在neo-storm不会运行检查NEP-5Token标准。我的经验是缺少owner Address信息时,会显示错误信息。
/ q+ _% d7 r0 b1 {7现在讲NEP-5合约部署到Privatenet Docker。这么做之前我们需要先获取Privatenet Docker ID值,然后在主机上复制main.avm文件并粘贴进Privatenet Docker镜像中,然后将它附加到运行的Docker中。* R/ d2 k) s7 K+ @& n$ c
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo
! S1 N" k1 Y2 @. j$ e- ?% Mdocker ps+ l6 X1 S! m& l- M- T
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                                                       
3 ?/ `3 ]0 D( xNAMES! F: r& I, [3 |0 x: N8 h
69c60667835b        slipoh/neo-scan             "/bin/sh -c 'sleep
) z+ {" v2 S; O, A! w  ?3…"   6 hours ago         Up About a minute   0.0.0.0:4000->4000/tcp                                                      3 O. ^1 Y! X6 u6 O4 ]( \
neo-scan) N) ]  l2 }* z  q
88b358cdd8ff       2 G" ~9 N" X1 H1 X% B
cityofzion/neo-privatenet  
, m. o8 [  ?" s9 k6 W! k$ W"/bin/bash /opt/run.…"  
& ?* v' u% s& K: W1 O6 hours ago         Up About a
5 z7 M! H( m6 W" }" S+ x8 o6 ~7 Cminute  
; @# I7 M3 S" m: M( `5 I6 d1 `+ z0.0.0.0:20333-20336->20333-20336/tcp,3 `9 n; L# _$ ~& I
0.0.0.0:30333-30336->30333-30336/tcp  4 r* l: R# x( Z) i
neo-privnet- \5 Q0 M5 p" D) T! E; U* q& v
ab96dc398c62        postgres:10.1              $ n+ F* y9 l1 j4 c, k" B2 a
"docker-entrypoint.s…"  ! A- t+ _6 H( @" a
6 hours ago         Up About a
' m) c; N- `) d/ ^minute   0.0.0.0:5432->5432/tcp                                                      - [7 ?. w6 v, x9 C7 Z6 R
neo-scan-docker_postgresql_17 ?  y. ^; S/ l: h, [
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm9 Q* |. @* ]! a, m1 \5 g. I
88b358cdd8ff:/neo-python
% |+ g# m. u% M. |. _richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it
1 L7 h( H* Q* |; k, x88b358cdd8ff /bin/bash/ }8 ]3 v; H* O* t2 U% e
*共识节点运行在在screen sessions,使用’screen -ls’命令查看
# v# |' _) |( Z*neo-python安装在/neo-python目录下,目录下带有a neo-privnet.wallet文件
: L5 z( @5 A( z; l$ e% ?  b4 z*有问题可报告给:https://github.com/CityOfZion/neo-privatenet-docker
( ]6 d; {% r  ?& q8在Docker上,打开neo-python-cli终端并使用密码coz解锁钱包。
' U, U5 T6 e7 jroot@88b358cdd8ff:/neo-python# neopy
% M& \- h8 f4 Z4 P; N2 L, VPrivatenet useragent '/NEO:2.7.6/', nonce: 513759764
6 B) A# r* g* ~! Z3 t7 N# ][I 180914 10:34:09 LevelDBBlockchain:114] Created Blockchain DB at /root/.neopython/Chains/privnet
/ I4 r7 [6 C" I2 b  z0 p[I 180914 10:34:09 NotificationDB:73] Created Notification DB At
- r; j' w5 e( _# m* Z/ O  v/root/.neopython/Chains/privnet_notif 0 {; _9 p- ~$ d5 `/ I
NEO cli. Type 'help' to get started
( c6 X% x& L7 u  Xneo> open wallet neo-privnet.wallet
  s2 w' X3 ?* f! C3 p+ o[password]> ***# n: b& S. h- }$ I& M2 }4 m5 q* l
Opened wallet at neo-privnet.wallet* ~5 R( }" x$ o0 z+ i" b; ?
9部署合约main.avm前,使用neo-scan看一看钱包余额。
1 u  c  |$ _0 n3 i1 `neo> wallet
% P# f& j9 e2 V4 u5 l[I 180914 11:01:22 UserWallet:538] Script hash) v/ t5 D5 Q7 H/ r9 O' O
b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9' 9 s  T9 ?9 ~$ t+ O4 `
Used 0.357 Gas ' x9 m8 Z: k5 o! t
Used 0.357 Gas 1 I% G- L: g6 K- t9 \+ L
Wallet {7 D1 E- I2 H/ r! a0 I% H/ I9 ~
    "path":
" }- M  ^. m, O: g. p"neo-privnet.wallet",$ y& H6 o0 C8 i) @- o7 u0 K4 H0 \; V
    "addresses": [: h8 Z: X# Z7 a) Y/ Z8 m! P% j3 O
        {
: L9 R* |; K, \0 l# [4 v            "version": 0,( S  c. p" T: `+ i, x* ]0 Q
            "script_hash":
5 N* F* Y4 b1 N: p, O& ^4 ~4 P% ?: n"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
# J' c5 q) ]+ ~5 K) z( J+ \            "frozen": false,
3 d# [2 H* E" b; U, f% \            "votes": [],
2 I5 ]0 }" n! F0 J1 n+ I# G            "balances": {
% x; s# L& }9 {         
  I  e& Y+ Y+ E( q7 W# t"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
* ^! S0 E; K  l# ~"100000000.0",/ a7 h! P# [0 D/ d! u5 M
              , Q8 _3 J1 x: g) \
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
& J; \) U- _7 j6 l8 y9 V) W"74589.9996"/ s: X$ N, H) Z& b& i8 w4 _; l
            },% ]! Z5 D* x1 O! @
            "is_watch_only":
; D  O0 X8 B0 \2 |+ [false,. v. }9 Q) W' f: G7 F2 y8 F" y
            "tokens": [
+ s& R. O+ O0 q, c                "[a3640dd3c560c75528e5f861da5da98958d0d713]" m2 R) R% l9 p. H
NXT2 : 2500000.00000000"
  b7 [+ c9 w; M! p8 B            ]' [8 O$ {; u  `- Z2 S7 y9 B* E, P
        }, ^/ R4 L2 w' E; w7 W1 n+ z% Z. g1 p
    ],
% G+ F2 M0 B- a6 V( T8 z    "height": 10294,/ `2 c9 m2 n, P
    "percent_synced": 100,
& Q& `- |5 H$ n0 R2 r    "synced_balances": [2 C) W0 D$ @9 ]
        "[NEO]: 100000000.0 ",3 |2 c9 n* C" W
        "[NEOGas]: 74589.9996
1 t: V% B! h; \* ^",% {2 i; n; M; J
        "[NXT2]: 2500000 "
8 }- {, h2 z  b: T  ^7 T4 [3 C0 [4 i    ],
- r. K5 n) Z9 Y2 M    "public_keys": [) j, y0 x3 d0 f9 d% a; c
        {
1 k9 s$ l5 g7 h5 ~1 u# a% d) u            "Address":7 |+ U- }' g. O
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",6 A+ z! J0 L9 h5 ]* e" B9 E
            "Public Key":
2 K3 l2 ~: r% K9 J3 X1 g"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"  o% H& v. D. F3 l7 F% g% O
        }
4 O$ U% W4 a- y( H    ],1 X7 q, F1 W9 b8 `
    "tokens": [
/ p' |4 `! G9 K6 }, W" Z8 A        {# W9 g% V+ Q$ g, ]0 u6 x
            "name": "NEX
2 e8 [; S$ N; ~Template V2",6 \! B% k: a. t& A
            "symbol":4 p( n0 o) |3 [5 K
"NXT2",
+ D# i& F5 A1 A5 y$ [& e$ B            "decimals": 8,
9 L* w, _- z- V" ?" P            "script_hash":
$ s" @$ t5 X5 D  J8 N"0xa3640dd3c560c75528e5f861da5da98958d0d713",
8 k/ j' H0 i) y4 ~6 X! U+ |            "contract_address":
/ T) X8 h9 X3 J) u6 @" [8 _: k/ @"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"; @) H1 p9 v; ^, S( I4 V8 Z
        }( _5 T; f5 ?) Q( y9 N1 S, P' {. r
    ],$ R% q, i( p+ [* V# X- L+ v' \
    "claims": {
; b( r$ u# X% ^! u1 q: E" H. z        "available":
1 o) f0 \* w$ A2 z+ ~* @"0.0",
/ O" |/ @/ r, S# V! q- H- ]        "unavailable":' V$ H& i; q3 q9 D) g
"7730.0"
3 h, y) t0 C$ h  k8 i" T2 ?    }
3 b" S8 {3 p2 P}
  I  C2 n4 f% T: W10看来可以开始部署了。再次提醒,钱包密码是coz。+ J) l3 v% X1 }* E# ^' F$ Z6 P/ i
neo> import contract main.avm 0710 05 True False ; c- f  i8 C7 e! L. h
contract properties: 1
& c/ n; r9 Q% v6 f' A! P. z! q- VPlease fill out the following contract details:4 r1 N1 o: o- b, P
[Contract Name] > MyFirstNEOToken- j- D1 K( y9 Y! k4 D* P
[Contract Version] > 1.0
8 d; T# N4 v0 Z. Z0 k" e2 r[Contract Author] > Richie
* a/ a: G5 g! i# Y/ U[Contract Email] > babierichie@hotmail.com
% Q7 M; L+ k+ Y2 I) {. [$ ^[Contract Description] > First NEO Token
8 X3 |+ V! o& R/ b8 u" ?) O; t- ECreating smart contract....8 f8 {8 Q, i. \
                 Name: MyFirstNEOToken
$ n  ^8 C6 o& k3 y: e8 q) M              Version: 1.0
, Z1 E! @! U" {! |3 g$ o1 @               Author: Richie   B6 j1 c  E/ j, r# F* r2 c& ?
                Email: babierichie@hotmail.com
1 I/ o# U0 V( Q+ ^# C( ^( K          Description: First NEO Token
- _+ u6 Y: j& P7 A  v        Needs Storage: True
& Q# J0 k7 l/ d8 W Needs Dynamic Invoke: False
0 F3 W" z) O7 l& a{
8 v8 G1 e9 ]. j8 M    "hash":
" m+ b. U& v( m8 u"0x4e9b87c96158a8e2cc4b74794f727b38947e9862",
! z+ ~7 B" g0 o) R9 S6 }    "script": "...",$ @2 x3 w/ H' V4 l
    "parameters":
2 @7 {& b8 c. V8 w( p9 U"0710",' Q- u0 ^/ J( Y' ?' `
    "returntype":, i% i, q: X) C
"05"
- L7 C3 W! Q' C' m! o! g) M}; c. _  G( q2 R. c: b/ P: w/ \
Used 500.0 Gas  i) n2 d) R1 A& Q' X
-------------------------------------------------------------------------------------------------------------------------------------
! Q5 p+ n; f5 E$ H6 q7 uTest deploy invoke successful# k" n* o# K: e
Total operations executed: 11 6 U/ c8 d4 A. o6 _" }# s7 G
Results:
/ Y7 \; t! _) y& r( q[]9 |, b: {$ l4 h9 w
Deploy Invoke TX GAS cost: 490.0
' D& f3 B" ?) I: S: J1 ADeploy Invoke TX Fee: 0.0
% ~; r* c4 Q1 \  }& b( I- O( p-------------------------------------------------------------------------------------------------------------------------------------9 k; C% P0 |0 V' T8 y
Enter your password to continue and deploy this contract9 j; T; l1 k7 G& n2 X7 V
[password]> ***( @/ l1 r, ?" i
[I 180914 11:03:33 Transaction:613] Verifying transaction: b'9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114'' @8 ]+ @1 U  Y1 w. k
Relayed Tx: 9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114
, |. i- p& l* @8 j: ^) V3 T4 P! |11使用给定的哈希值验证交易。 注意:不同机器的哈希值是不一样的。2 E+ f5 l8 U, g( r! R' E
neo> tx
5 ~& m" M5 _2 U# K& Q9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114
$ h1 x! T! U5 @; O9 _: F{4 ]( I  V8 o/ N! Q" d3 G
    "txid": "0x9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114",
1 e0 w7 v% b7 c2 ]. A    "type":2 f' o+ s1 y# B4 _, ]* j
"InvocationTransaction",
2 E5 b) s* X1 A1 J) Y" ?    "version": 1,
& P" o4 F$ @  _2 {0 `0 l$ ^    "attributes": [],
% M7 J2 R% a9 L) T! V7 k) @1 b7 g6 ?    "vout": [: h; Y* M" X9 K5 r: Z% I
        {3 c2 N; S$ c! l* W; G
            "n": 0,! w" n' T* p$ D; ^
            "asset":8 X: o& K0 n! A, Q! |
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",! x6 v2 z: N' m1 Y  r
            "value":
, R! k& i6 K% J8 {% t! O"25493.9997",* a, m* g8 Y2 o; r0 d+ n
            "address":
0 N+ g" ]2 z5 {$ e! ~+ z8 r3 O"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"9 S& T! u% T1 V6 k  t0 r
        }
5 c; F. V  D9 Z3 y, Z4 q2 H. r0 v    ],
# x- q9 g5 |% D- O    "vin": [9 C5 L- Y9 S) J. r* N. I5 i
        {( ?: l: Q& i# D, w: B# m
            "txid":8 V7 `! x: K* Z
"475a091ccaa6330320a29884f5f8796a260bdba91352dd409d16787b37d8be26",
% w) R2 w( t3 ~# O1 g; x            "vout": 0
2 o7 o/ ], x& m+ c7 C: h        }
: j( S+ k3 X0 F" T    ],. ?9 [. k4 T) y) ~+ m
    "sys_fee":
  |. L6 \, d! j! V0 F"4.9e-06",
. ~+ U* K  n; o4 u3 q    "net_fee":9 ^/ c2 g4 g+ x, x
"489.9999951",
& E9 B/ M5 ~/ R& F! K    "scripts": [
' P7 J9 D/ Z% K5 g        {
% l1 q) X: y3 `* k            "invocation":
6 h) k( v) l, c: A" G"40510fa6630ef581108057ebe967cd306522466a32eaf068cf3717da1e640b866246c013033e3c878ebf9247a5a3500178b21b126b3af63ed07a86b0d2c4f34c89",* c8 T* F3 ]; K! b. K) Q
            "verification":  e6 x4 h- J  I2 Z+ Y" ~3 e0 w
"21031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac"
. E4 I$ b* e! T, @        }8 `1 M- F$ t% T' c
    ],5 {1 S. m' t* t  b/ [2 F3 o. y% b- ^
    "script": "...",9 A4 Z. B6 k7 K# Q* s" c
    "gas": 49000000000,3 E& B/ G- [3 c, }( f  n
    "height": 10302,
3 ]/ y( n8 l3 K3 v0 H    "unspents": [- A* F# s1 N& A1 i
        {
& y2 ^( \& A- K! y; V            "n": 0,
$ }& o5 W4 c# h& U9 M0 F9 w( b3 J; x            "asset":$ C; p" r0 I* x0 l
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
& z* l: p; t$ ?, U- @" {: M: O            "value":
3 z7 s8 ?5 M: R( w"25493.9997",4 \" L& _2 Y- b; ]! @
            "address":, F( t  L1 L" q
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y", J9 I  d1 R4 k  y" q
        }7 [& _+ X8 |- E( v
    ]
( ~* o/ T( }3 A3 g6 U}
2 n6 U! E; C, x! m! y5 ~12交易显示后,再次查看钱包余额。 在步骤9,我们的GAS余额为74589.9996,现在,GAS余额变为74099.9996。 因为这减少的490个 GAS已用于合约部署!# C" M& n: [$ @2 F' t: M
neo> wallet
* T( r* I- A  K. G  x+ {[I 180914 11:18:38 UserWallet:538] Script hash
6 I: k& c1 m& x* A6 @b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
' Z6 D8 n0 Q- K, g- d. b0 R* dUsed 0.357 Gas 9 X/ T, O3 o: S7 o9 c
Used 0.357 Gas
' ?/ C% `$ D5 y' {1 m% kWallet {
# r( s) n! v+ Z* i1 r    "path":6 k2 h0 _) }! t5 |
"neo-privnet.wallet",
2 S, _" U0 |8 T& _0 v    "addresses": [
+ I# H5 o. ]4 W& x$ P        {( p; g$ v! `8 S0 ?1 }  v
            "version": 0,4 T& o1 b! p9 [
            "script_hash":
2 g0 m" [# ]: @% [! v; r) U"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",$ n* |$ z) Q5 w& a3 }" z9 q
            "frozen": false,
- z, r4 \) k# j            "votes": [],5 \# B! o  m% D; A- a  m2 H
            "balances": {
) l+ B* D* o4 p( i3 [               - B: c7 z1 W+ Q, |/ V; X6 t
"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
2 t# ^6 `7 v0 B1 P) e"100000000.0",' H$ f! p7 r9 y% \; \& L
               $ o! D+ C6 `! M1 G* }8 c
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
5 `- t9 t" _  c+ i. i2 B0 G; ~: a"74099.9995"
4 e8 D5 i8 J8 a4 w# [  S& Y            },
, l9 W. [$ K! o            "is_watch_only":$ a* y3 Y  w9 m  g
false,
9 B8 M: V" S% R; _            "tokens": [6 C! j) X( R, U3 O
               
0 W9 {* B. T/ t8 J"[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 :
9 f+ [# A6 O2 R/ W2500000.00000000"8 ]$ P+ l6 ~" y: }3 U
            ]
) X/ d2 z" g0 ]- |1 o1 Z        }9 D2 J/ X. r, U5 h9 s; j5 `! T' V
    ],
  \( ~) S- a, G$ X  Q! \4 a    "height": 10348,
* |) {/ [/ C- v! R6 R    "percent_synced": 100,
: X0 n+ k* a" Y. s0 @! O    "synced_balances": [
* ~8 b3 g4 G6 h, z" I( v        "[NEO]: 100000000.0 ",
4 O2 k3 a  ]9 a; f% }4 S9 y        "[NEOGas]: 48605.9999
# m7 Q( e" V/ }" f",) y! K, z4 o. `/ z1 a$ e9 X3 v
        "[NXT2]: 2500000 "7 B* k) Z+ {$ ]1 N
    ],
8 y6 i6 o3 M2 A' ^# }/ q  z    "public_keys": [
6 y) I6 H: d. Z. J; Z" ?/ U/ \/ L        {
5 U5 {# a) K/ n, R% _/ R7 k/ y4 S: a            "Address":
3 Q  E$ S( }- G: W"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",. R  \' I# t/ G
            "Public Key":0 x4 _( ~- R. W* F
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
- R! O- z$ h2 P9 V( p        }$ {4 ~& V" f9 p
    ],
5 H( n$ w5 s% v8 q5 \    "tokens": [/ L" R8 R' N) u5 b; H
        {# c3 E5 y/ k! J9 ]
            "name": "NEX& B! `2 V5 c- Q4 e1 B: D8 B
Template V2",
# t, E9 t0 |7 g* I( k            "symbol": "NXT2",
/ \% H6 t) o9 D# v$ c            "decimals": 8,
( d( y! s, J! ^/ @            "script_hash":+ O) U" ?, }9 e' b# D& F, d  F
"0xa3640dd3c560c75528e5f861da5da98958d0d713",2 P; S7 P: X% a" d1 _1 m
            "contract_address":; x, S  M0 U; w+ b9 d7 P& e
"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"
4 u; b& v: v1 w1 o4 v; Z        }$ d  z. m' l/ T( v2 a, [
    ],1 l3 |1 H0 C! ?- ?' i6 D3 l: C
    "claims": {) I1 A" |  `9 A2 `* T, E, c# H
        "available":3 ]) }; ?5 V" b7 \4 }
"0.0",
* b, [: l2 `$ c0 I& m/ G        "unavailable": "8652.0"! P8 A' V$ [1 J5 c" P0 N
    }! Y2 M0 _6 U5 `$ l' i- r7 ?' {
}( C1 V2 _) n* r; g  T. L  d' X' n
我们也可以看一看部署好的合约。
4 f3 @1 C# }( z, D. J% \9 I1 wneo> contract search My
' g! c: c% R0 O  z' y9 m0 ZFound 1 results for My$ A2 B- k4 ]' M
{8 H1 d; {) C: f6 A$ m# r4 M6 \
    "version": 0,
# z$ |% s' V7 b' `+ d    "code": {# }6 r7 |' A6 `! L4 P
        "hash": "0x4e9b87c96158a8e2cc4b74794f727b38947e9862",
$ z# _/ k* X, ]6 i9 a        "script": "...",# z: d, @+ p! a  R6 Y1 d! N% `
        "parameters": "0710",5 E9 e  b$ {5 H+ ?* A, j$ z
        "returntype": 5
  A6 `5 _5 ^" c* O3 k    },
$ f$ s. l! ~& Z( z$ {( Q    "name": "MyFirstNEOToken",: d. c/ n0 L7 z
    "code_version": "1.0",
& j1 d, s, k7 g' M9 E    "author": "Richie",
$ @! C/ M( z, A+ g, x    "email": "babierichie@hotmail.com",
" {* L/ Z% D  B    "description": "First NEO Token",# k' D4 R: P2 R1 f& a! X5 z5 L
    "properties": {
9 |$ }, R: [. Q" }1 A        "storage": true,
, N) S: [4 J3 c1 `* ?% y2 N        "dynamic_invoke": false
4 v) |" }. |6 k" Q* _9 N    }8 ~# T% d$ |& c* e
}! H. f. ]% }3 t' y3 Y
13最后,我们可以尝试使用钱包的密码coz,来调用这个带有合约哈希值的Token。
  G9 t1 B; H# Mneo> testinvoke
2 A" o) }/ T% c4 `- O0x4e9b87c96158a8e2cc4b74794f727b38947e9862 deploy []4 c! P+ A+ \7 o  D3 Z
好了,现在你已经在NEO的私有域上成功的发行了NEP-5Token。
# j; }* j7 K- T+ m最后& ?& ]6 L0 Q" I
希望对于Gophers来说,能很轻松地照着本教程学习。也希望GO开发人员能加入 NEO’s Discord,一起开发学习。你一定要试一试!
( \( t5 Y/ a' V/ M  B( ^# l5 Q如果您真的需要我的帮助,请在Discord上联系我(LikKee.Richie#5647)
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14