Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
介绍6 I% v# x" W+ _% Z4 \' W# ]
开发语言5 ]1 y0 S( j0 i# `: [: Y
在NEO智能合约开发平台进行开发的优势之一是平台支持各种开发语言。
6 O, i6 R& s: ~4 {  I' cNEO推荐使用C#语言,不过它也支持使用Python, Java, Go, Ruby,之后还会进一步支持Kotlin, C/C++, JavaScript等开发语言。.$ y: n! R' p, j! O5 N% o+ ^
尽管支持多种语言,但我们仍可以发现现有的很多项目使用的是C#、Python、Java,使用GO语言的并不多。因此,参考City of Zion (CoZ)上的资料,我想尝试写一篇关于使用GO语言开发的简单教程,希望能吸引更多使用GO语言的开发人员参与开发。
$ G# b  O& r% l* s* |% B给GO开发人员的建议
) L1 w6 L7 t- ?3 s无论你是编程新手还是经验丰富的开发人员,刚开始时都建议你在私有域或测试网上进行开发。
1 Y2 o( q% {( u* H- j为什么?; S* m5 {4 A6 z0 f" ^7 z6 T
因为在主网上部署NEP-5 Token需要消耗490个GAS。0 |# Z0 z4 ?1 _+ ?3 {
写这篇文章的时候(2018年9月15日),GAS的市场价格是5.8美元,那么该笔费用就高达2842美元。对于任何创业公司而言,这都是一笔不小的费用。4 Z7 R0 U8 s1 y8 a
按照GAS的历史最高价,每个Token的价格为95.87美元,那么仅仅部署一次智能合约,你的成本就要增加4,7000美元。1 w# h& q( ^- ^" x
因此,刚开始开发的时候,建议你在私有域或者测试网上操作,当你准备好之后,再转到主网上部署合约。
/ W8 y  r2 I) }要求
& H9 W$ n- f' c, y2 b本教程中,开发环境的需求如下所示:* L9 j- Y# G+ K
操作系统 – 桌面版Ubuntu Desktop 18.04.1 LTS. e  y; i6 H- t1 E: d+ `, ?
Git 命令行接口 –Git
4 p4 ~+ S! M0 ]& w( x; B语言 – GO语言
, {% g/ A& |, U* }4 i" H2 sGo语言依赖管理工具 – Dep
' O& [; |( @; B9 VDocker –Docker CE 和 Docker Compose+ M/ \2 j% u5 O4 W
编辑器 – Visual Studio Code, Extension: Go
( D$ ?% f# C1 S$ q0 \使用到的NEO的资料/ `# P8 c$ S* |, h- ^. Y
GO语言智能合约框架 – neo-storm
+ u. p# b, k: ?! Q* X, W' ?" e# `预建好的使用Python语言编写的neo-privnet-with-gas以及nep-scan镜像 –  neo-scan-docker% L* S" C7 t' Y: ?* S" t/ ~9 g
重要提示:结果可能因NEO编译器和节点版本不同而有差异。
/ K; z' _8 E# y2 q+ s; d0 P0 i' J本质上来说,有几种方法可以运行私有域,例如使用 neo-go 或者 neo-privatenet-docker。 但是,在本教程中,我们会使用slipo编写的 neo-scan-docker。 neo-scan-docker是用neo-python构建的,所以它带有一些“Python”组件。 此外,它还带有neo-scan的UI,允许您分析智能合约的部署事务。% o" I; q& \$ b) e% ]3 _
*安装方法可能因操作系统而异。 相关的详细信息,请点击上面的链接查看。
7 J) \+ U( @% W, |* y配置你的环境
  E. k, Z/ d* k3 v% N首先,我们先用 neo-scan-docker来配置一下NEO私有域。. c3 ^# n/ I! R5 l4 `
1 检查一下Git, Docker and Docker Compose这些工具是否已经准备好。% ^& v) Q$ x3 z5 w4 d
richie@Redbuntu:~/Desktop$ sudo git --version
5 ~' x) `9 z" s0 `) @! Rgit version 2.17.1* `7 {2 U9 _  M" n
richie@Redbuntu:~/Desktop$ sudo docker -v" v* I9 ^+ z* E, }4 v; K
Docker version 18.06.1-ce, build e68fc7a! F, ~7 v, d. a4 h) f* [$ c
richie@Redbuntu:~/Desktop$ sudo docker-compose -v! {9 T- }5 P+ {! N+ p( j5 g
docker-compose version 1.22.0, build f46880fe
/ l( n3 a/ n5 C3 t; y1 ^2克隆(Clone) slipo的 neo-scan-docker仓库代码,并使用 docker-compose来加载Docker镜像。 下载镜像可能需要点时间,请耐心等待done状态的出现。# h/ e9 c0 L$ R) `
richie@Redbuntu:~/Desktop$ git clone https://github.com/slipo/neo-scan-docker.git0 ?$ B  y- a5 [; N2 A  C
Cloning into 'neo-scan-docker'...
! u3 b$ Z" A6 S- ^$ k; d; ?remote: Counting objects: 27, done.
% H% x1 ^& |' j7 W& u6 Yremote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27/ h3 D0 M) t- m, K, |  ]
Unpacking objects: 100% (27/27), done.
% ^( I4 U& o1 p. k6 J6 zrichie@Redbuntu:~/Desktop$ cd neo-scan-docker/
8 Z9 W( [( p5 H; Q" jrichie@Redbuntu:~/Desktop/neo-scan-docker$ sudo docker-compose up! h  g/ z8 f% g
Starting neo-scan-docker_postgresql_1 ... done' E: R# c$ _* f  m
Starting neo-privnet                  ...- W+ U/ ]$ f4 s8 p7 C1 U9 ]1 G
done* e5 J3 J4 k, o
Starting neo-scan                     ...
( K0 |8 Y9 n4 l* Y! O' w, qdone
! m. i) u3 V' w" j/ `" TAttaching to neo-scan-docker_postgresql_1, neo-privnet, neo-scan`$ a+ i# i# b" J
3在你的主机文件中,添加127.0.0.1 neo-privnet。注意:主机文件的位置可能因操作系统而异。
6 U0 `6 ?6 s3 T9 p% }& Q$ z! nUnix/Linux/macOS - /etc/hosts
1 H& |5 o: i  R3 e/ LWindows          - C:\Windows\System32\Drivers\etc\hosts`
/ c* U% U# U+ I8 r, Q$ T! ~; E4在浏览器中输入http://127.0.0.1:4000/,可以看到City of Zion (CoZ)提供的neo-scan网页界面。
! {$ t' t) q( b* J
! i5 k7 Z7 M% l0 [5点击钱包地址(Wallet Addresses),你可以看到预存有NEO和GAS的钱包地址。部署智能合约的时候我们需要使用到这些Token。更多信息,可以查看 neo-privatenet 。
% z+ n$ f- u7 ~9 |导入WIF密钥可以获取预存有NEO和GAS的钱包的密钥。 私钥/WIF 密钥 KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr 地址: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y 脚本哈希值 (用于检查): b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'$ I* ?- C  ?& T% v$ d
这样你的NEO私有域和neo-scan就已经配置好了。
, k" a) J/ T4 S3 A' X# u下一步,配置neo-storm。& D3 v! C) R+ k0 W
1在终端中输入下面这几条命令, go version、dep version以及echo $GOPATH,确认一下Go, Dep, GOPATH都已经准备好。6 x2 l7 f& \% F9 a9 w$ X
richie@Redbuntu:~$ go version* b+ P  J8 t% p! z
go version go1.10.1 linux/amd64
. F9 J; ~* i; _* ~) R( D. Mrichie@Redbuntu:~$ dep version
* |/ P8 j8 I7 \4 \8 g, M6 ], J' T. k0 \dep:
( d, f+ O" U6 O6 l% H version     : devel3 V* ~: l1 L6 K: B6 |
build date  : % v( ]9 P) ~4 @, z) k; ~- z
git hash    :
+ R. `2 b6 V) M" K, Y: N2 b. D go version  : go1.8.3
! U. w1 I6 Y* Y- B( o2 y2 l# A go compiler : gc$ x6 p, D1 s. @. \  I6 a
platform    : linux/amd64
6 [! |# x6 q5 Y' @+ A* [( a. {richie@Redbuntu:~$ echo $GOPATH
1 f2 t8 `( _& ]+ P# C$ a) P+ D( u/home/richie/go$ E" H3 r4 r9 a2 ?! Z3 F
2输入 go get命令获取neo-storm,输入dep命令检查依赖包,使用make install命令进行安装。 *忽略警告信息
" X( R3 l1 `+ q. erichie@Redbuntu:~$ go get -u" x  l5 W" h3 \: o
github.com/CityOfZion/neo-storm
$ T! h. W& N6 Qpackage github.com/CityOfZion/neo-storm: no Go files in! [' w: {1 i+ T3 f; r7 \
/home/richie/go/src/github.com/CityOfZion/neo-storm& {$ e0 S) Y5 A' Z5 O$ D* N
richie@Redbuntu:~$ cd $GOPATH/src/github.com/CityOfZion/neo-storm
: `1 P; _' N* @, q' N- jrichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo dep ensure2 w6 H& p  M8 D5 {! A
-update
/ Z! i, G9 r* k/ Z4 k7 Rdep: WARNING: Unknown field in manifest: prune7 k9 E. }/ j9 U: R
richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo make install& A1 T' P5 K8 _& f! q1 P' n4 X! T9 w: L
installing project dependencies& U, v  t: J* j6 `% d
dep: WARNING: Unknown field in manifest: prune" C; h( V2 P( |, t  u# Q9 v) E
installing neo-storm framework/ o' L2 D: G0 k& z6 [
done installing, happy coding!  C+ f) \1 X% i
3现在neo-storm已经安装好了,你可以测试一下。
/ q) X  F2 M* h' X3 ~, D* Mrichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$3 w8 Z4 y! D, a9 m2 H
neo-storm7 j1 T  H1 [' R( k
NAME:
5 ~4 H  B; Q7 W  L4 z; |/ B4 ?5 P   neo-storm - Neo smart contract- L, ~  ]7 C3 r" n. f% u, T1 \
framework for the Go programming language
2 L; V. ?+ a. R- B8 P$ P7 kUSAGE:  k! j4 Q: ^% Z  V" X
   neo-storm [global options] command[command options][arguments...]
; u1 Z9 R7 \! zVERSION:
: p5 W6 \  d& |   0.0.0
! ^+ B2 K* f# H: E  C3 n: MCOMMANDS:
$ `. o: F: O; K& `1 k     compile     compile a smart contract to an .avm file$ e5 T! B+ K# E/ u) n2 a
     testinvoke  testinvoke a smart contract against a remote NEO RPC node2 }! N3 \* H/ J6 B; v( H2 h& S
     init        initialize a new smart-contract in a directory with boiler plate code
( x& l' Y7 j8 K$ Y4 Y7 k; o8 E- i& r     help, h     Shows a list of commands or help for one command2 a0 P1 `; X, U
GLOBAL OPTIONS:
/ [6 s/ S# R/ Y6 }  ~! L; Z7 v   --help, -h     show help, G# W" p9 E4 p
   --version, -v  print the version+ c3 c( m  J1 D9 o1 r
4“安装完成,开心编码” ——接下来开始我们的第一个智能合约吧。. r' Z" i) y! ?3 C0 ~
richie@Redbuntu:~/Desktop$ cd ~/Desktop
) t/ R8 v, s8 m2 ^richie@Redbuntu:~/Desktop$ neo-storm init -n NeoStormTest( t" `' M5 s' g$ x0 |! Y
Successfully initialized smart contract [NeoStormTest], n  j9 `: o' T& M! B; q
richie@Redbuntu:~/Desktop$ cd NeoStormTest/
2 `: p- R' i; E: l8 J6 Nrichie@Redbuntu:~/Desktop/NeoStormTest$ ls+ |0 X6 k; ]7 u' N' y4 z
main.go
, R$ @& v. H- u" N5 Zrichie@Redbuntu:~/Desktop/NeoStormTest$ cat main.go- _, R3 L! }# W7 N; F0 q/ E
package NeoStormTest# b1 |5 a' _5 L% d" D& e& G
import "github.com/CityOfZion/neo-storm/interop/runtime"
" z% g! ~& M4 O- Gfunc Main(op string, args []interface{}) {0 q7 r2 R  @- {0 a% A
    runtime.Notify("Hello world!")
+ l; Q- I/ S9 V6 h- ~# f发行NEP-5通证合约. L/ C+ `. u  h
1要在NEO上发行NEP-5通证,我们必须遵守它的通证标准。 *改进的NEP5可以在Github上查看,它允许Token上线NEX交易所。
) E$ j+ Q* M  xNEP-5 Token Standard+ F& [! I+ m) x7 l3 j. ^) l
Methods
( i+ D) E! ~( H0 U* u( s3 L-totalSupply()
9 o, Y" D& _0 e" U-name()
& d2 J; H/ E2 n" r- O! ~) h. @2 h-symbol()
, G4 T$ J+ n8 g- H-decimals()+ e8 I  M  q( {) w/ }; k
-balanceOf(account)
. f; G+ X( b- L& k3 `6 @-transfer(from, to, amount)
" w+ l! Y# [, S& {9 `1 K+ ^8 gEvents  R* j' L4 z; x
-transfer(from, to, amount)
2 C) n, L) n) N# E3 Y% {NEP-5(.1) by NEX
% M0 h2 F5 c1 v5 C0 xMethods
# h" b7 ?+ a+ i$ q0 n/ K5 v-totalSupply()' ^, S$ e$ q/ Y5 l
-name()
" p0 S+ v8 E) A( O- Y-symbol()
8 r6 a& l7 `0 b) |/ ?1 Y6 R-decimals()% v4 P6 r8 c5 c3 }' B
-balanceOf(ctx, account)
0 B6 \% D  ?. t+ R-transfer(ctx, from, to, amount, callingScriptHash)
% l, E1 R6 m" X: H+ t* J-transferFrom(ctx, from, to, amount)
, x6 J! s" C* ?7 m, }: v4 W; C-approve(ctx, owner, spender, amount, callingScriptHash)
$ h5 |% j; m4 v" C9 @+ u-allowance(ctx, owner, spender)
. _! j# _. l; I- c$ W2不用重新编写一个Token合约,你可以fork/clone我的github仓库。5 A" w. \. V7 N5 |
richie@Redbuntu:~/Desktop$ git clone https://github.com/maplerichie/neo-go-nep5 MyFirstNeoGoContract
& c: `- }: J- k# }, J- ^( Q) Y3启动代码编辑器(我用的是Visual Studio Code),将~/Desktop/MyFirstNeoGoContract 添加到你的工作区(workspace)。Neo-storm的examples文件夹里也有例子,可以点击https://github.com/CityOfZion/neo-storm/tree/master/examples/token查看。# E! A5 V$ O0 x$ [. {6 W: C

" }) l7 ~. `  ^6 P. l8 X1 L2 Yhttps://github.com/maplerichie/neo-go-nep5
- H+ y" S$ o3 q  M) L8 r  V; B4编辑package,修改NEP-5的属性值,例如decimals, multiplier, owner Address, Name, Symbol, TotalSupply。
! y4 C0 j( V5 O0 yPackage:应该将package修改为 package MyFirstNeoGoContract ,从而与文件夹名称保持一致。* a, Q5 v4 S3 y) B6 q
Decimals:用来设置Token使用的小数位数或者Token可被分割的最小单位。  ~& U2 C$ d8 k! F# {, l6 w8 _# L2 s
例如:NEO的小数点位数是0,意味着它是不可分的Token。因此不能转账或者接收小数个NEO,只能是整数个。小数只能在交易所使用,因为它们创建了自己的十进制系统来方便交易。$ H8 h. k' c* b# V2 \
Multiplier:这给出了Decimals和TotalSupply相乘时的值。 输入格式为10 ^ Decimals。+ [1 {3 y& e% k8 d9 j) J
例如: decimals = 6时,multiplier的值应该是10^6,即multiplier = 1000000。
, M& U  r( a4 Z, w* NOwner: Token发行者的地址。这里我们使用neo-privetenet的地址AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y。. L7 g! ~) F' S! k3 H
Name: 字符串格式的NEP-5Token的名称。# O0 u2 {: M0 F# z. f) R) d
Symbol: NEP-5Token符号,通常是3个字符的长度,但不是必须的。/ p" k* z. C( i/ E( ^
TotalSupply: 总发行量。设置一个总发行量可以防止通胀。8 _2 v7 H4 b" ]8 n
8 d7 Z' f7 c: }
5修改参数同时确保符合NEP-5Token标准。然后使用neo-storm来编译GO智能合约。
2 s% y3 j" q7 {  k3 M; h2 t( Wrichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ neo-storm compile -i main.go -o main.avm/ a( w7 {9 b& C8 ?1 X! Z) w& A
6当前目录下你可以看到 main.avm文件。现在neo-storm不会运行检查NEP-5Token标准。我的经验是缺少owner Address信息时,会显示错误信息。
. [& J* I) B% ?: P0 j$ c7现在讲NEP-5合约部署到Privatenet Docker。这么做之前我们需要先获取Privatenet Docker ID值,然后在主机上复制main.avm文件并粘贴进Privatenet Docker镜像中,然后将它附加到运行的Docker中。3 o6 R5 x3 e. s9 a- o. a0 r1 o
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo
! {4 w" u8 ~2 a! P( Pdocker ps
6 V) ?( A  P7 t. uCONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                                                       
7 t# c2 X; s! CNAMES
$ ]5 t" M$ u" D- x2 E. k. y4 |9 U! C69c60667835b        slipoh/neo-scan             "/bin/sh -c 'sleep
; y2 D: s# y- o7 k% G3…"   6 hours ago         Up About a minute   0.0.0.0:4000->4000/tcp                                                      1 y2 c4 I9 |/ h) }  z# j/ R
neo-scan
8 M  S1 P0 C) i* n8 ?88b358cdd8ff       6 K/ q# \+ h6 x
cityofzion/neo-privatenet  
/ R5 K7 U& L3 t"/bin/bash /opt/run.…"  4 b( A. @) C6 t! r
6 hours ago         Up About a
0 X( ~4 J/ h. x1 H$ Q7 }0 ]; lminute  - J. z0 I2 T$ O3 X2 N2 `$ b6 D2 M- N! s) a
0.0.0.0:20333-20336->20333-20336/tcp,
: a( C% j: v( E. {0.0.0.0:30333-30336->30333-30336/tcp  
) A3 X& C+ q1 Y: A: [neo-privnet
$ H1 D6 @1 u8 h3 B& ^0 `* p2 Jab96dc398c62        postgres:10.1              8 |/ k0 u% g  Q$ E; z3 c
"docker-entrypoint.s…"  1 F# F7 u+ b' F7 L) M
6 hours ago         Up About a6 }9 @4 }7 I7 M* K5 P
minute   0.0.0.0:5432->5432/tcp                                                      + G, P8 v* Y9 k! N
neo-scan-docker_postgresql_1
2 e3 T: y5 ^; C, W' A* vrichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm
3 I  T* \! Y2 I: v! i, ~+ P88b358cdd8ff:/neo-python
7 Z! a" A6 y# arichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it5 M3 ?" Q) d: y8 I
88b358cdd8ff /bin/bash
. f8 M( s; S! H0 @% w*共识节点运行在在screen sessions,使用’screen -ls’命令查看
+ r$ J" l" T5 o' }; c+ O6 v*neo-python安装在/neo-python目录下,目录下带有a neo-privnet.wallet文件
1 L1 N9 [, ]+ k( X*有问题可报告给:https://github.com/CityOfZion/neo-privatenet-docker
1 L+ ^' l  e! v5 }8在Docker上,打开neo-python-cli终端并使用密码coz解锁钱包。
, U4 J; l, L7 B* b& o3 M) D( kroot@88b358cdd8ff:/neo-python# neopy; l1 N. z6 T: U* P" I) e
Privatenet useragent '/NEO:2.7.6/', nonce: 513759764
2 ^. C8 e( Z$ J/ f0 g[I 180914 10:34:09 LevelDBBlockchain:114] Created Blockchain DB at /root/.neopython/Chains/privnet) r4 u( l1 A( T/ H) _' V! q
[I 180914 10:34:09 NotificationDB:73] Created Notification DB At! k: u7 z, K7 k( m
/root/.neopython/Chains/privnet_notif , z% ]5 u# k; w) b5 R1 }9 n
NEO cli. Type 'help' to get started
1 ~: C  C& p; r+ T( Lneo> open wallet neo-privnet.wallet
0 ^, a# L9 M8 \7 X9 q[password]> ***
  l' o0 i6 B  c4 |  G1 KOpened wallet at neo-privnet.wallet3 ^, b5 y& w! f7 p) r
9部署合约main.avm前,使用neo-scan看一看钱包余额。
4 Z+ y. g: l4 n: }3 T5 Pneo> wallet, R5 L+ Y4 c! Q: _
[I 180914 11:01:22 UserWallet:538] Script hash) z# u( n+ y: S# S. F
b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9' 8 w' {8 w  r' d& M: X
Used 0.357 Gas ; N6 T4 Y9 ?3 H( A
Used 0.357 Gas
4 z# \' j  R: ~7 R; P, U% A" QWallet {  Q5 B* j4 Z5 ?
    "path":1 e8 W" r/ ~3 o! t) j% T
"neo-privnet.wallet"," x* }+ k. y; E- I. A
    "addresses": [
/ Y  d( R' A5 d+ E- E9 i        {
1 j" ?/ ~7 W2 V$ }+ j& q! n  }            "version": 0,2 s! B; p. P/ o6 k$ {8 I
            "script_hash":
$ ?5 Y. R/ [0 A/ x) |& {5 [+ h7 @7 y"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
  ~5 v' ?4 Y  ~: L* }* @( d            "frozen": false,* u: f7 s0 l0 D6 g+ {  r& H' u  V
            "votes": [],
! @8 ~5 ^7 I$ i& g5 f; T            "balances": {) B# O4 u0 C' y$ m# k- P
         
8 ]' \% l. w9 O& Z4 d$ u# b"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":3 ]) s& |+ ?, M" |+ l  m
"100000000.0",
7 {1 X* z0 q3 |$ x( T- H6 C0 `7 @              
" y) ?0 K& G. C9 A& P( g"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
7 }/ L0 _4 q! D"74589.9996"9 q/ F* v! K4 r4 g9 ~" J. t' @
            },
# \$ f& p. i/ [. w. }            "is_watch_only":
4 I3 M0 b+ J- c. _, {: S$ |' nfalse,
3 ^5 v8 ], w5 T7 g# O2 g            "tokens": [
' w' i( ^# z: s$ e5 e                "[a3640dd3c560c75528e5f861da5da98958d0d713]2 l: f8 K/ g+ f5 o
NXT2 : 2500000.00000000"9 q" T% A8 G0 H' X5 g
            ]
5 ?  q* Y7 e* }  E1 S3 P        }
1 N# R8 S/ `4 m# u& \6 S    ],
  k* S+ _0 T* W) W9 C# c    "height": 10294,
& X+ r# M* c4 `) g    "percent_synced": 100,9 H6 @4 a( z5 u- o
    "synced_balances": [" u/ u$ Q% w! x' n. B. Y
        "[NEO]: 100000000.0 ",
# s' {) |) Y  W1 M* I        "[NEOGas]: 74589.9996- \* |$ R5 |$ x( ]
",
, e' u( W0 I% l. ^        "[NXT2]: 2500000 "/ C. A0 b# J5 F% T: p
    ],
* E- S' b' N, z$ ]) h: l    "public_keys": [" |7 |. M  x/ U. \3 l
        {/ E& {' {2 D! _8 {3 F  x
            "Address":: X" t. Y9 \, i
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
7 y7 c9 ]+ B9 m4 v; Y3 l            "Public Key":) i6 q$ c& t4 t" s, I+ y, Y
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
1 t& x9 s6 v+ X( [  ~        }
) @! S0 w" q/ x4 N' f* T    ],  v$ M# W( [; f$ W1 \. n
    "tokens": [) S- v9 ]* P# a; d5 v, n4 S, j
        {8 c9 t3 G9 u( U5 ~- q; n
            "name": "NEX
  Q1 a7 m6 \9 d5 X; o, [9 sTemplate V2",) G) [7 n9 w7 E& ]+ l  y' l% b
            "symbol":- Z3 g* L0 F, q" F
"NXT2",: H. H) k1 I7 O% X0 O6 k: a% ?2 L
            "decimals": 8,
# P7 P/ y( U( h            "script_hash":+ S, X& v8 a3 n5 u5 a
"0xa3640dd3c560c75528e5f861da5da98958d0d713",0 k4 M$ J' \; F# r5 u+ `
            "contract_address":+ d5 w" t& U" u
"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"
  P9 ]3 D: \4 \% Z) \4 e! b" O        }# j$ {9 h/ ]. D) c. k
    ],
8 g0 h% m) n/ B    "claims": {4 ]+ z6 G  w8 C: }; Q$ f3 ?
        "available":
5 m" X# q+ w# n9 o% L9 q$ [" `"0.0",& S2 g; A  ^, [) b
        "unavailable":
- }: z( N8 K/ ]1 A# K"7730.0"0 a. R  S# q" C& k' u/ x
    }
- d4 \9 c  m- D% m5 p' W}
& l/ l/ m' m2 V9 g2 }, C& T10看来可以开始部署了。再次提醒,钱包密码是coz。
, B" p. H1 |/ Zneo> import contract main.avm 0710 05 True False * _/ \7 u! Z) W3 D2 l) j0 `
contract properties: 1* E0 T3 V, H" O; y  K
Please fill out the following contract details:
* a7 S9 w3 x* N[Contract Name] > MyFirstNEOToken
: G* u" M, W+ ~6 G[Contract Version] > 1.0
: n- {% E2 }7 e0 c5 x$ d[Contract Author] > Richie* g8 m; }8 @6 ]# _* O) R
[Contract Email] > babierichie@hotmail.com* K( M9 Q$ t2 j: [) a
[Contract Description] > First NEO Token
- h5 |3 ~9 y3 l* U6 YCreating smart contract....
% y# }# g7 X0 A" G                 Name: MyFirstNEOToken
- G$ R% S, T4 R# p) J0 `7 Y' r; j+ Q              Version: 1.0  I: F, v! h3 g: Q
               Author: Richie 5 F3 O0 n; j  B  [! m+ S1 s$ B3 ^
                Email: babierichie@hotmail.com 5 D* W0 z+ _( D# y! i; q4 K% i$ }
          Description: First NEO Token
( O9 y5 w2 p, r        Needs Storage: True * o; L) S- w: r1 c4 R. d
Needs Dynamic Invoke: False " C% b+ U9 W( @% [$ N' u
{
9 z9 i! P2 D, ^0 g5 s    "hash":
3 O8 `& Y6 S5 v7 O3 F"0x4e9b87c96158a8e2cc4b74794f727b38947e9862",2 F5 }( G% a9 d  H& k
    "script": "...",% z9 b7 Y3 I6 c# |4 S$ h
    "parameters":" P6 q7 L3 I# o2 E* f( `7 r
"0710",
. S5 {* M! x( M/ M& g8 ^    "returntype":& b5 Q! ~) L) H7 e, h% b" d
"05"
2 O+ h" L8 X- Q: l7 o}" l% z# h' p/ i0 O# d; b
Used 500.0 Gas. W, X2 L$ g9 N9 X. ?$ X! d$ d
-------------------------------------------------------------------------------------------------------------------------------------
6 s( N3 z7 H/ K2 }' E) ^2 y. V  T- BTest deploy invoke successful
5 B- h/ O- y3 Z$ d( P% q4 S) JTotal operations executed: 11
* p4 W/ O8 x2 c: p( _2 \6 jResults:
5 \. e$ w3 M: |/ Y) `/ N& G; O[]
: s6 ^4 x+ N) h) [Deploy Invoke TX GAS cost: 490.0 0 [. [. ]8 j/ g
Deploy Invoke TX Fee: 0.0 8 W; G9 [9 k- U4 g2 k# C$ [
-------------------------------------------------------------------------------------------------------------------------------------
% ^% J3 z3 ?3 n$ q0 fEnter your password to continue and deploy this contract" t! f- D0 A3 s6 F( U
[password]> ***
1 w1 `- I+ s* X- {[I 180914 11:03:33 Transaction:613] Verifying transaction: b'9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114'
/ e; Q7 \7 V3 t) k$ G# C* QRelayed Tx: 9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114
" Q- W5 ?$ B: `: G11使用给定的哈希值验证交易。 注意:不同机器的哈希值是不一样的。0 J, A* }# f# K6 o
neo> tx
2 A6 s, d: ^% o5 ^' O9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114
( x# s0 ?8 h  o{& D2 m. _4 e$ d# o( s+ ?3 n
    "txid": "0x9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114",) q) {# b0 c# ^) h! N
    "type":
" p7 E: Q0 X# |"InvocationTransaction",
% V4 c5 w; e% F" Q    "version": 1,& }. W0 X8 q! Y" ^- v
    "attributes": [],
/ a/ _) `! L$ o/ {' {5 x0 B1 K( n    "vout": [
6 f' p7 d5 ~8 y& \# l9 v        {
" W4 ]) z% V: s' n            "n": 0,5 z' _; `9 A, z: ~3 H
            "asset":
" v1 w1 f/ v( B% \3 j( W5 i! r, K"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
1 t8 m# ~. Q# f1 b; `            "value":* k3 Z9 l+ \. D: G( p$ x
"25493.9997",
) M2 }+ k/ L; I  D            "address":
1 s- g: Z* f' f1 l' ^  D"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"
: I; w4 z5 U+ f+ t9 P6 m7 m5 _        }
$ c% C5 g) R6 _  U* f3 Q    ],% F. n/ d/ y& ~6 z# v
    "vin": [* Q# j* C' X. q; d( H
        {
8 U' t8 ~% |& K; d/ O& M            "txid":
+ |; w4 N; A" K! _' W  Z"475a091ccaa6330320a29884f5f8796a260bdba91352dd409d16787b37d8be26",6 W8 ?- ?& i8 C& B
            "vout": 0
/ v3 D6 c7 C, P4 n8 k0 ?! [$ ^! m        }
2 }& W- v& S6 g" m    ],& J; {  K0 v7 X1 b
    "sys_fee":
7 R( |( Q, W) u; R  d& M"4.9e-06",, b0 c5 O; R: `# Z. r- Y) |
    "net_fee":  K) W/ X6 C0 N- X. t
"489.9999951",& a* x3 N; b/ f
    "scripts": [  j! ?1 u4 [, I1 v
        {
7 o9 X# Z4 C3 W' u$ ]- T            "invocation":8 M; f  D$ e3 ^
"40510fa6630ef581108057ebe967cd306522466a32eaf068cf3717da1e640b866246c013033e3c878ebf9247a5a3500178b21b126b3af63ed07a86b0d2c4f34c89",
8 D0 H3 z2 K. I( T  Y9 m            "verification":' z6 M+ X7 \" V& ^
"21031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac"
& d3 Z& \, m: F- ~7 K        }# }( y/ o& F2 Q* e
    ],
, m7 b: Z3 Y0 J    "script": "...",
8 D$ N' G; v3 I6 P    "gas": 49000000000,$ A5 |" \) G% s! L, C1 |( I: i+ l
    "height": 10302,
; Q. Y3 Q7 d5 }3 L9 ~8 |5 J    "unspents": [
1 V, J: ^+ h, F        {. [* z/ f1 U1 Q4 E
            "n": 0,; k0 J2 r8 W2 b4 a
            "asset":0 {  A5 U# z) d3 V; d
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
9 q' F: q+ c3 |2 g            "value":
  X6 U" O. s5 c# {  u# v8 p" W"25493.9997",
+ z# t& Y, z8 e            "address":6 K9 [, Z2 [- J4 Q# l
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"7 A8 g) w0 w5 G* w$ z4 Y
        }# f/ X' W/ z) J7 F
    ]3 Y( t! }: X) K$ `9 H" T, z5 U4 d
}
' Q' Z' @  r5 A12交易显示后,再次查看钱包余额。 在步骤9,我们的GAS余额为74589.9996,现在,GAS余额变为74099.9996。 因为这减少的490个 GAS已用于合约部署!" K. K" K9 P" }
neo> wallet$ J* `) U$ k! x
[I 180914 11:18:38 UserWallet:538] Script hash
+ |. s! v( {" `b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
0 ]  z3 S  `# D& TUsed 0.357 Gas 5 e" S  t  P; l5 K1 o
Used 0.357 Gas   {+ F+ ]8 c; A% {' A4 H$ p) f1 e
Wallet {1 ~- w0 {4 n) X1 n4 t. b
    "path":
; l3 W9 v( U0 \- J9 x5 i"neo-privnet.wallet"," D0 y9 a8 Y! w3 t8 m: }& i$ s
    "addresses": [4 {5 ]  \) X; A: R; B
        {
" w* N9 w2 `- D            "version": 0,. Y4 r: D7 R1 V6 ^, _. H2 g
            "script_hash":+ x/ H) u& M7 D6 T* ^/ u* X; ]/ w
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
5 z# z  Z$ s) j' \9 o            "frozen": false,
1 v6 [3 S: ?9 ^+ v  R            "votes": [],. j/ q1 N& F  w$ t! R. {5 {; E  f2 |, o
            "balances": {
6 F: e  R9 p$ e; W% S               
: }8 z& W; c$ ?$ R, v9 F"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
$ ^9 [. o, }, M. l6 y"100000000.0",
8 h! H) T- m+ ]$ T/ P* _               2 e: g& n* s+ E3 l- S
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
6 [3 W7 {# a; a"74099.9995"0 @) ]0 ^+ \6 w9 ~& \( ^( I+ K
            },2 |) a  ?# a) z/ i
            "is_watch_only":
( u$ v$ p, ?4 d# Nfalse,
1 H4 H( x/ X0 Q2 w8 A            "tokens": [
' H+ r, i9 f4 ^. ~8 X0 v" Y               5 N4 D9 k, W0 O1 W+ M: [; {$ c/ o
"[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 :+ f$ ]* ^8 ^6 K, Y0 f: J
2500000.00000000"
! H/ q6 R$ o9 t) w" U8 k: x            ]7 o( o' `$ d5 a% n, d
        }
/ x/ D, P) r0 d+ A    ],5 }; @7 g/ N0 V& J8 i9 E0 X
    "height": 10348,# I" h6 f( J/ p  \6 t
    "percent_synced": 100,- K$ N+ f  x7 F: y6 W+ O  e8 x
    "synced_balances": [3 s: e+ R2 V3 \3 n2 m
        "[NEO]: 100000000.0 ",
5 U1 |7 t1 S7 l" T) N; B5 z        "[NEOGas]: 48605.9999# }5 y/ N0 w& K: N, i6 Y. Z* w
",9 L! k+ W" t" L# f( b+ d3 h  C4 D
        "[NXT2]: 2500000 "
; i  G' `2 Z! @, ?8 ~* \5 n! g    ],+ t9 S" w$ J8 [* h6 T& s3 C
    "public_keys": [
3 {5 ]2 S6 V+ T( l4 I        {2 }+ e, u* R; k# o
            "Address":, _! j5 g1 s) c2 U6 y# g' [2 p0 b
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
7 L! y# X0 H7 l4 u. g; [            "Public Key":
9 {$ u# e2 Y! H"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"# F; m. O& o1 }# Y
        }0 C$ w, b2 u; O- v7 r9 U
    ],2 ~, e" [! K& @* @5 `: ^, l9 K
    "tokens": [, B1 _( e6 [* _; e, {
        {
+ P. s" A* Z% h3 q            "name": "NEX2 i1 r/ m3 h6 P+ y3 W
Template V2",
& p0 c# n% h2 N) ^* y2 n) i6 C  ^$ K            "symbol": "NXT2",
( e! x* Z6 F7 J8 j, S8 _            "decimals": 8,
5 P: |0 _# |) O  U/ j6 ~; e            "script_hash":5 i+ G* \; O" N3 e8 g8 O( G
"0xa3640dd3c560c75528e5f861da5da98958d0d713",
( N% Q- p  r+ q3 L            "contract_address":. ?: q% A& g; p* A' c9 q
"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"
1 y' t0 ?* W& l& K' h# R% i2 t7 t        }8 E; v1 r- W& K: `
    ],
( u, R3 x: p, }6 C+ X2 t& E7 Z, A    "claims": {
6 H% {9 f; a& l6 E6 g3 u        "available":1 E$ ~9 e2 `6 ^% u# `+ u
"0.0",' S8 R" k' _8 m2 U
        "unavailable": "8652.0": g1 d/ y' v% ~
    }4 [7 `4 L7 F3 _
}* G5 F3 G3 w. z
我们也可以看一看部署好的合约。& o- x  ]) Y0 k2 c9 B
neo> contract search My
( a8 m6 @8 N, h: k1 x$ OFound 1 results for My
- k  e/ U% v2 [" `5 M" x/ D' |8 p0 o{- n1 S# C) u1 A
    "version": 0,
) I  W- }8 P* D- s/ Q    "code": {
, T1 Q, T6 N& o; j. G  t; {        "hash": "0x4e9b87c96158a8e2cc4b74794f727b38947e9862"," Y8 |* p7 S- t3 \( [5 U1 b- k" X( i- {
        "script": "...",3 K& f2 t8 b# A8 {/ ~
        "parameters": "0710",
6 }$ B! u6 ^5 J2 M" V        "returntype": 5( x+ n" u8 _' D! L7 a. z: `: t
    },
0 I* o$ B% e# c6 ?    "name": "MyFirstNEOToken",
: U; ]; Q7 @( P) |& |    "code_version": "1.0",) Y5 T2 W" K' V) s! L; D0 S
    "author": "Richie",+ [( Z0 q/ F9 i. [1 d; M
    "email": "babierichie@hotmail.com",
/ x0 ~2 k3 @! Z3 P    "description": "First NEO Token",
# ^9 L! u6 E) m    "properties": {
( v9 u* r! D, ^- j, l" a& G        "storage": true,
( O! v% T2 R+ l/ p+ f" u" x1 X% m        "dynamic_invoke": false: c; M2 n: H7 [- A# {2 R1 I
    }" A9 }4 D9 j& G" {+ b: X
}
+ W& M) O, \0 y: {/ r13最后,我们可以尝试使用钱包的密码coz,来调用这个带有合约哈希值的Token。9 j/ z) V0 l; `% _' C$ s& F
neo> testinvoke; L, Y9 D1 {+ u, D
0x4e9b87c96158a8e2cc4b74794f727b38947e9862 deploy []
# N1 G) E4 D7 s( a好了,现在你已经在NEO的私有域上成功的发行了NEP-5Token。
; ]! o+ Z# _5 ?最后/ l) c. x' e3 t
希望对于Gophers来说,能很轻松地照着本教程学习。也希望GO开发人员能加入 NEO’s Discord,一起开发学习。你一定要试一试!
) W% `& h" A* T7 M2 F+ J% W如果您真的需要我的帮助,请在Discord上联系我(LikKee.Richie#5647)
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14