Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
介绍, \+ m8 `# k- [5 I: b9 O* g: ~
开发语言
5 r( o' b  ~: F$ L8 `, d$ D. F在NEO智能合约开发平台进行开发的优势之一是平台支持各种开发语言。( O, C$ D, O8 u
NEO推荐使用C#语言,不过它也支持使用Python, Java, Go, Ruby,之后还会进一步支持Kotlin, C/C++, JavaScript等开发语言。.
4 Y% g( |- h7 K6 Z* ~9 ?尽管支持多种语言,但我们仍可以发现现有的很多项目使用的是C#、Python、Java,使用GO语言的并不多。因此,参考City of Zion (CoZ)上的资料,我想尝试写一篇关于使用GO语言开发的简单教程,希望能吸引更多使用GO语言的开发人员参与开发。
* O* I5 e; y: a6 M给GO开发人员的建议5 ~  X7 S, c1 x+ w
无论你是编程新手还是经验丰富的开发人员,刚开始时都建议你在私有域或测试网上进行开发。  ~& @" a& I, w3 D5 x/ r$ a
为什么?
5 w' M. ?2 N+ \/ a/ ]因为在主网上部署NEP-5 Token需要消耗490个GAS。
5 O7 D1 o! V; _$ S4 }5 y写这篇文章的时候(2018年9月15日),GAS的市场价格是5.8美元,那么该笔费用就高达2842美元。对于任何创业公司而言,这都是一笔不小的费用。
5 r* c2 i3 I( s/ }, e# n' e5 b按照GAS的历史最高价,每个Token的价格为95.87美元,那么仅仅部署一次智能合约,你的成本就要增加4,7000美元。
9 G4 F3 Q# f0 |因此,刚开始开发的时候,建议你在私有域或者测试网上操作,当你准备好之后,再转到主网上部署合约。; e  O/ A! {4 _* v% D8 D
要求8 R: n/ R- A9 W$ e, Q
本教程中,开发环境的需求如下所示:' T8 n" {& z3 z$ K/ I3 }
操作系统 – 桌面版Ubuntu Desktop 18.04.1 LTS! ]. H. T; g! S3 c& q5 Z7 y
Git 命令行接口 –Git& k  |" R, ?- Y* t& Z. L2 T
语言 – GO语言
+ M# [5 W" u* |4 MGo语言依赖管理工具 – Dep9 \! H- P; E1 Y8 X
Docker –Docker CE 和 Docker Compose0 m/ f/ G" J" o( \' a7 @
编辑器 – Visual Studio Code, Extension: Go
5 o3 U5 B3 |% W. \8 L# e使用到的NEO的资料& @  d5 U  M) P
GO语言智能合约框架 – neo-storm
" ]3 z" W, _2 w+ s预建好的使用Python语言编写的neo-privnet-with-gas以及nep-scan镜像 –  neo-scan-docker$ v2 y  b' L) I5 ^! _1 p
重要提示:结果可能因NEO编译器和节点版本不同而有差异。
' X5 h% ^7 L1 Y) y. J, B* x本质上来说,有几种方法可以运行私有域,例如使用 neo-go 或者 neo-privatenet-docker。 但是,在本教程中,我们会使用slipo编写的 neo-scan-docker。 neo-scan-docker是用neo-python构建的,所以它带有一些“Python”组件。 此外,它还带有neo-scan的UI,允许您分析智能合约的部署事务。
5 {9 Z5 |. p3 j, y5 S*安装方法可能因操作系统而异。 相关的详细信息,请点击上面的链接查看。
! N  ^* W; D! P# i5 c配置你的环境6 D, @. P2 B  k7 @7 l, D0 r. a; x
首先,我们先用 neo-scan-docker来配置一下NEO私有域。
. q& e3 L2 b6 }$ g1 检查一下Git, Docker and Docker Compose这些工具是否已经准备好。4 _' i! [: G1 s2 C; H/ ]! ^
richie@Redbuntu:~/Desktop$ sudo git --version
0 u4 F% [% _# ^git version 2.17.16 |: ~; o5 ?/ }: D. O
richie@Redbuntu:~/Desktop$ sudo docker -v& T1 z( c3 j( X  E% s
Docker version 18.06.1-ce, build e68fc7a1 `1 p9 A" G( f$ B: e( O5 ]
richie@Redbuntu:~/Desktop$ sudo docker-compose -v% h: q0 n4 ^3 M- c1 l1 ~' }
docker-compose version 1.22.0, build f46880fe" x2 G* n8 n3 O& e5 ~/ e; w' t% |/ y
2克隆(Clone) slipo的 neo-scan-docker仓库代码,并使用 docker-compose来加载Docker镜像。 下载镜像可能需要点时间,请耐心等待done状态的出现。
- p. Y5 p3 m5 l' s( z0 @1 O! `) {richie@Redbuntu:~/Desktop$ git clone https://github.com/slipo/neo-scan-docker.git
; H$ N0 S% u0 M- T4 KCloning into 'neo-scan-docker'...
6 s8 }6 @7 d) h' T  H7 Tremote: Counting objects: 27, done.$ g+ S! s3 z) V, b
remote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27
( w- J8 p7 ~( m8 Z6 OUnpacking objects: 100% (27/27), done.
' j  J( `1 D) Prichie@Redbuntu:~/Desktop$ cd neo-scan-docker/
* B# Z% K/ O, ^richie@Redbuntu:~/Desktop/neo-scan-docker$ sudo docker-compose up. b3 ~3 D+ z' _5 ^
Starting neo-scan-docker_postgresql_1 ... done! o9 w6 o& w1 C
Starting neo-privnet                  ...) J, {1 x! v9 r! I3 L- `+ h
done
; V  c2 j, ]2 p$ \3 D1 z. ?- IStarting neo-scan                     ...
5 K4 h1 f2 x, j( U7 n3 m$ Xdone( Y- M: v' I2 n  |7 u! j# I
Attaching to neo-scan-docker_postgresql_1, neo-privnet, neo-scan`
# J, Z% _5 k$ P: h9 o3在你的主机文件中,添加127.0.0.1 neo-privnet。注意:主机文件的位置可能因操作系统而异。
) E* ]- {; S& jUnix/Linux/macOS - /etc/hosts/ ^( w4 f% M' B, q4 f
Windows          - C:\Windows\System32\Drivers\etc\hosts`
6 g* V5 X% D7 |) f. o. ~, j5 S4在浏览器中输入http://127.0.0.1:4000/,可以看到City of Zion (CoZ)提供的neo-scan网页界面。& U; h7 G- D& e: ]* C  z

' J; O% w- E( I, @$ F2 T5点击钱包地址(Wallet Addresses),你可以看到预存有NEO和GAS的钱包地址。部署智能合约的时候我们需要使用到这些Token。更多信息,可以查看 neo-privatenet 。' ^7 A  G% V2 I
导入WIF密钥可以获取预存有NEO和GAS的钱包的密钥。 私钥/WIF 密钥 KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr 地址: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y 脚本哈希值 (用于检查): b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
, V+ P, [6 {2 ]7 \1 W2 u5 ^4 x这样你的NEO私有域和neo-scan就已经配置好了。
" \% G6 o9 X7 P. U0 r: O下一步,配置neo-storm。
, K* H2 \7 M% q, g2 t& B1在终端中输入下面这几条命令, go version、dep version以及echo $GOPATH,确认一下Go, Dep, GOPATH都已经准备好。
0 [# e4 b: k! \8 U1 q' urichie@Redbuntu:~$ go version  N3 C, }: n! O  v
go version go1.10.1 linux/amd645 Y$ W- k; @. f* ~  O7 i+ w
richie@Redbuntu:~$ dep version# O, [0 ?- Z7 T6 d4 w9 Z9 x
dep:
/ N* e. q& D" d$ P version     : devel
) i6 M2 o$ B2 p. {+ m build date  : + I1 V( h3 `0 |
git hash    :
/ R9 _$ z) L$ R% L( ]' _2 l& W go version  : go1.8.3
" _+ R" m$ r. F7 @) G% g5 w7 V go compiler : gc
8 S1 x! G/ V, _! m0 S  e platform    : linux/amd645 V7 R# ?$ Q: E/ k$ B
richie@Redbuntu:~$ echo $GOPATH
  P5 ~% g/ {+ q  h6 U/home/richie/go! l" f- J# m6 j
2输入 go get命令获取neo-storm,输入dep命令检查依赖包,使用make install命令进行安装。 *忽略警告信息& h2 z/ @, \1 [, I- U3 w
richie@Redbuntu:~$ go get -u% f+ h, ^: y  v/ G3 {9 Z
github.com/CityOfZion/neo-storm
' f: y; I( b) d% J2 ypackage github.com/CityOfZion/neo-storm: no Go files in
! o. _0 w3 i: \/home/richie/go/src/github.com/CityOfZion/neo-storm
0 m3 }% s1 p& y- Q) ^, K5 C! Q7 brichie@Redbuntu:~$ cd $GOPATH/src/github.com/CityOfZion/neo-storm
7 y" k1 B9 k! Qrichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo dep ensure
+ R3 j' A) `% R- ~1 Q8 [7 }-update* y- R- N5 G& c
dep: WARNING: Unknown field in manifest: prune
8 r6 t4 T4 m) F% O: X- Z1 drichie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo make install
/ d/ R6 I/ v* q! o# [' R0 g7 ~9 Jinstalling project dependencies1 P& n' |$ D# D5 A" x3 _- M
dep: WARNING: Unknown field in manifest: prune3 L( ^# w/ k  \" Q
installing neo-storm framework
% l, I# {& {5 N' _  f  udone installing, happy coding!. Q* n( D) k  |) W+ P9 w
3现在neo-storm已经安装好了,你可以测试一下。
% k. j$ d# k, D* j1 _; Y: b2 q8 ^8 ^richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$# x) \+ m- y8 y# b1 K+ V
neo-storm
$ G. F& O  u9 a6 j) XNAME:
7 Z+ H0 d+ a! C' B' n4 @   neo-storm - Neo smart contract. I) D5 a; G  _9 z+ \
framework for the Go programming language
6 x% G" n: Z& S% C: o. P2 gUSAGE:
% `& L8 y( v: i/ Q; q4 ~   neo-storm [global options] command[command options][arguments...]
& L$ z4 z5 B7 v# IVERSION:
9 Y" R9 b$ o9 `/ G) b! K& J6 y% j& u   0.0.01 G, z/ M0 ]' j6 {& d2 V& W* F7 \
COMMANDS:
/ y% A1 W% V3 K; d# H     compile     compile a smart contract to an .avm file
. u: L/ L( j- F     testinvoke  testinvoke a smart contract against a remote NEO RPC node) r4 S0 M: p' I2 y# X' ~8 b4 v4 j
     init        initialize a new smart-contract in a directory with boiler plate code
& s: o& @4 u1 j1 X* A! k     help, h     Shows a list of commands or help for one command" {! ~; `3 x+ E$ K! G& K) e+ n
GLOBAL OPTIONS:3 Z- N# m0 A4 ?7 {' n
   --help, -h     show help' {" j. C" }( p) ]
   --version, -v  print the version! u% b0 u: ^: u7 K* K
4“安装完成,开心编码” ——接下来开始我们的第一个智能合约吧。$ b3 X* [2 ?* j
richie@Redbuntu:~/Desktop$ cd ~/Desktop2 |' r: i" q0 H8 a9 q0 ~0 D% @/ F
richie@Redbuntu:~/Desktop$ neo-storm init -n NeoStormTest
9 d0 p- t2 @3 \3 l; ASuccessfully initialized smart contract [NeoStormTest]3 I4 h% R6 ?: o# Z% h1 O( S! Y
richie@Redbuntu:~/Desktop$ cd NeoStormTest/; u' G* {% t) W9 n( z
richie@Redbuntu:~/Desktop/NeoStormTest$ ls1 V4 v; U' a3 @2 Q
main.go2 `% _& ~, e6 Q" b5 @$ b
richie@Redbuntu:~/Desktop/NeoStormTest$ cat main.go' \9 d1 B( @" I( A
package NeoStormTest/ y/ _+ o9 Q; `3 B! \# k' Y+ n" Y7 u
import "github.com/CityOfZion/neo-storm/interop/runtime"
5 B* r9 {' B8 b8 |5 [9 t. ofunc Main(op string, args []interface{}) {2 J. s$ U+ w. C/ \/ S! V7 T
    runtime.Notify("Hello world!")6 ~% I  p  r6 l+ q
发行NEP-5通证合约9 \" _) ~! B& G: X  }
1要在NEO上发行NEP-5通证,我们必须遵守它的通证标准。 *改进的NEP5可以在Github上查看,它允许Token上线NEX交易所。
6 b1 M) S' ^; Z# t! kNEP-5 Token Standard
4 Y9 p9 D& Z6 E; o6 vMethods0 a1 d# _. G! L6 T) \5 F/ h# a3 l
-totalSupply()4 v/ W6 u2 k+ i0 x) o* u
-name()
) n7 u! s6 G5 E  c! N-symbol()$ i6 L- z* ]4 n' H8 h+ p
-decimals()
, T& N1 |/ f. [3 n2 S-balanceOf(account)( h# M* f. |, H5 b6 r! {+ m6 m
-transfer(from, to, amount)
, s7 H2 k1 P) `* H9 aEvents
; Z+ L3 n' E- w- j! @% o-transfer(from, to, amount)
1 o. @; ]  A& w# D' C; d) sNEP-5(.1) by NEX
; H4 [) `. i, m) f! l) \Methods
& H6 _' I* d3 ~4 b: G-totalSupply()
9 R* k2 j+ g) }  a+ K$ R/ q! M3 }-name()
4 G" u: T5 ~+ f9 x5 e( U-symbol()
# N! r+ T$ X6 U2 t! J& x  [-decimals()
% {9 e4 o- H/ U. S-balanceOf(ctx, account)
& b6 c0 W/ ?% A* A9 Q6 K; s! J" ?3 D-transfer(ctx, from, to, amount, callingScriptHash)
' y% e4 L4 m* l& `! R-transferFrom(ctx, from, to, amount)
3 N2 h/ x2 Y8 v. i4 r3 C-approve(ctx, owner, spender, amount, callingScriptHash). i1 ^1 B# V1 V1 f1 w2 L
-allowance(ctx, owner, spender)
: A- {- S8 i0 a$ g: s% q2不用重新编写一个Token合约,你可以fork/clone我的github仓库。
4 |8 L% L$ p8 [; F( `+ }. wrichie@Redbuntu:~/Desktop$ git clone https://github.com/maplerichie/neo-go-nep5 MyFirstNeoGoContract
& A. c" B7 w4 x6 Q3启动代码编辑器(我用的是Visual Studio Code),将~/Desktop/MyFirstNeoGoContract 添加到你的工作区(workspace)。Neo-storm的examples文件夹里也有例子,可以点击https://github.com/CityOfZion/neo-storm/tree/master/examples/token查看。# u; R, j3 p' e# J  F) F
) ?/ Y3 h: x, Z* t$ i% a6 ^
https://github.com/maplerichie/neo-go-nep5
8 K$ B5 m4 C% i4编辑package,修改NEP-5的属性值,例如decimals, multiplier, owner Address, Name, Symbol, TotalSupply。
! z! ~0 b; h* [4 ^2 y# u0 I6 OPackage:应该将package修改为 package MyFirstNeoGoContract ,从而与文件夹名称保持一致。
3 ?" `5 ?: v( L* R( wDecimals:用来设置Token使用的小数位数或者Token可被分割的最小单位。$ X% Q2 t* c2 z* q$ |8 }
例如:NEO的小数点位数是0,意味着它是不可分的Token。因此不能转账或者接收小数个NEO,只能是整数个。小数只能在交易所使用,因为它们创建了自己的十进制系统来方便交易。
! N: D9 N) W+ |- s4 G  O# BMultiplier:这给出了Decimals和TotalSupply相乘时的值。 输入格式为10 ^ Decimals。/ y& F8 C% o: e* D
例如: decimals = 6时,multiplier的值应该是10^6,即multiplier = 1000000。
, L  H5 X/ M; w# U$ ROwner: Token发行者的地址。这里我们使用neo-privetenet的地址AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y。! R- W' d5 U1 y* k
Name: 字符串格式的NEP-5Token的名称。
% U# U( `6 m6 RSymbol: NEP-5Token符号,通常是3个字符的长度,但不是必须的。
1 c5 y# C% R1 U; LTotalSupply: 总发行量。设置一个总发行量可以防止通胀。- h# @* E( ]8 `* {: [( x% b2 y
: W' `1 F$ b( o. G
5修改参数同时确保符合NEP-5Token标准。然后使用neo-storm来编译GO智能合约。
( m  p& u+ X+ a; z( d. S( brichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ neo-storm compile -i main.go -o main.avm
$ N6 Z7 m9 p) f3 Q4 `, Y6当前目录下你可以看到 main.avm文件。现在neo-storm不会运行检查NEP-5Token标准。我的经验是缺少owner Address信息时,会显示错误信息。$ u: {4 m$ z4 w* h: s  L
7现在讲NEP-5合约部署到Privatenet Docker。这么做之前我们需要先获取Privatenet Docker ID值,然后在主机上复制main.avm文件并粘贴进Privatenet Docker镜像中,然后将它附加到运行的Docker中。
# n6 {: r! v$ {8 _/ `richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo
. a9 Q: e9 v5 V3 a1 zdocker ps
/ o$ ^! u1 @6 YCONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                                                       
( P6 K! `3 p( {, |$ w8 d, bNAMES$ L! x+ L# r* `  _$ Q
69c60667835b        slipoh/neo-scan             "/bin/sh -c 'sleep: k0 B$ B$ ?! @: Q9 n5 Q0 i
3…"   6 hours ago         Up About a minute   0.0.0.0:4000->4000/tcp                                                      
& K7 r& c( j7 xneo-scan
* ?# W/ t1 d" A/ @! v* U, r: t88b358cdd8ff       : c. L7 u+ h3 R
cityofzion/neo-privatenet  
1 U; h1 r& G' m# g2 o"/bin/bash /opt/run.…"  
/ M) m: p0 T3 B5 v: [6 hours ago         Up About a
. g) n( d/ Z' r( O0 \) Gminute  
; @7 x' _8 `2 i! a: l4 T8 G# p0.0.0.0:20333-20336->20333-20336/tcp,5 c: d: C0 Z: Z* N7 [
0.0.0.0:30333-30336->30333-30336/tcp  
; W1 ^0 \. c2 @neo-privnet
  k0 [, X! t2 w2 fab96dc398c62        postgres:10.1              
$ e7 Q2 T( z5 ?" ]7 l"docker-entrypoint.s…"  
2 ~/ l. O: @' c: |: d& X6 hours ago         Up About a
; {/ o4 d2 x; L, Gminute   0.0.0.0:5432->5432/tcp                                                      9 x/ n7 R, w+ P  F0 u
neo-scan-docker_postgresql_1
9 Y) i8 K8 q, m& F8 Jrichie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm
# P) X! n3 p3 n. O" x, {" a8 b2 e88b358cdd8ff:/neo-python1 r/ Q+ M9 t& l' @% \% z
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it! c( m3 U- ^7 Q/ g3 o4 J# v
88b358cdd8ff /bin/bash
/ Y" S3 w) o1 E*共识节点运行在在screen sessions,使用’screen -ls’命令查看
* J0 m" u6 D0 k2 Z* j0 F% Z$ |*neo-python安装在/neo-python目录下,目录下带有a neo-privnet.wallet文件6 k+ R& U  Z- i
*有问题可报告给:https://github.com/CityOfZion/neo-privatenet-docker& @8 R# ^- Z% p) i6 i9 l
8在Docker上,打开neo-python-cli终端并使用密码coz解锁钱包。0 r7 k3 j5 t  `6 a( [3 i5 S. o
root@88b358cdd8ff:/neo-python# neopy
3 S: q1 f6 j6 s7 f7 q* d' {8 Z6 |. KPrivatenet useragent '/NEO:2.7.6/', nonce: 513759764
7 l/ S3 H7 f" _  p[I 180914 10:34:09 LevelDBBlockchain:114] Created Blockchain DB at /root/.neopython/Chains/privnet( L* b2 |8 t4 a9 i& Z
[I 180914 10:34:09 NotificationDB:73] Created Notification DB At
; G0 ?. v& X: ~2 R) R5 \; v% C3 n/root/.neopython/Chains/privnet_notif
2 P" q. A3 ]) n) gNEO cli. Type 'help' to get started
. Z$ |/ d( K6 S* e' Kneo> open wallet neo-privnet.wallet
, Y; T; H; N0 g1 o7 k; G6 \[password]> ***
4 i6 m5 C! ~1 R) v4 K5 `; jOpened wallet at neo-privnet.wallet
; f: B/ }1 o4 o, m% `. j9部署合约main.avm前,使用neo-scan看一看钱包余额。
/ ?6 ^% s; ~6 q& p3 Bneo> wallet
2 L9 p4 w1 m$ W1 M9 \9 k) }. [[I 180914 11:01:22 UserWallet:538] Script hash
6 j4 h* L; q9 sb'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9' / k: u6 [; [7 M" B8 v
Used 0.357 Gas
- ?" O' L$ ^2 P8 ?0 }& R" K4 gUsed 0.357 Gas
4 i, L& G$ w/ A+ i" S. h' TWallet {' E. _# m4 I/ m- U; O
    "path":
; N9 r) j0 ?5 s3 @$ j: }# E$ ^"neo-privnet.wallet",
' M$ q8 G# E8 H4 n' j& a; {% o$ U9 S    "addresses": [3 I! e* u& F* h$ O! n! j2 i( _
        {) x. d8 r$ C9 S1 j
            "version": 0,& _, \4 C* |5 y  j
            "script_hash":
; ]& a! @6 h( P6 Y1 ?  T+ ?"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
/ f0 d6 i- G4 W/ |' x% C* O            "frozen": false,8 P! q% T" Q" y4 Z" `: l
            "votes": [],+ C  r9 P) x' i; d2 a3 n. R- H  a- A
            "balances": {) t5 u8 @5 Q& X( y* `& `
         
, Y  |. b1 d% K8 p1 {$ U: N"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":
* [. x4 [7 ]9 _* W1 Y- |) J7 a"100000000.0",) A6 |% X' h9 W0 T, ?
              
" }  r  o( d4 s/ E( b: k"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":5 W- V5 R( b& m
"74589.9996"
1 O. ?2 o: z: ?0 j* d1 F            },
7 V! O$ z: d6 H  u+ E            "is_watch_only":, x) [3 P& U, l0 e5 j/ g% L/ ~' m
false,
! D; \6 w0 Q# I4 y% B8 ?+ T            "tokens": [" S+ E5 @) v$ f% d# L9 l8 N
                "[a3640dd3c560c75528e5f861da5da98958d0d713]. o' @. \5 _$ B9 [
NXT2 : 2500000.00000000"
( q! w( D, }0 S, L2 ]. B            ]
! b5 a, o' v( ~$ w  ~4 Y2 g        }3 Z# Q0 _: Y5 m) a2 K$ C. ?
    ],
* `$ K' r- A- b% W: J    "height": 10294,) S9 M4 H/ C" W6 ~2 r4 ?
    "percent_synced": 100,( K7 Y% Q- ~- h
    "synced_balances": [7 B7 h& L; o& j
        "[NEO]: 100000000.0 ",' I, W7 q8 ]( x- ?8 ^
        "[NEOGas]: 74589.9996
- O' T$ ~0 n. P% ?",( z3 Y3 c+ w4 H- Z
        "[NXT2]: 2500000 "
& i; \* F  V6 @    ],
0 }7 F# N: H$ W7 t! c! b1 o    "public_keys": [
  B! R4 F! t7 C$ c( G  [( ^        {
0 Q6 e! L  a4 T, z- I            "Address":9 @) f5 N4 O' x' c+ n
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",* Y3 O0 g; U/ q# j
            "Public Key":# Z- @# ]5 f6 Y0 }- w% b+ i
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
/ b; b7 ]$ V5 t- z; s8 z4 P& w        }' B+ m+ Z. Y! a- z
    ],# J( y. B  f, H5 ]" o7 ^; h
    "tokens": [
* U, f4 q: Z. |1 k        {7 ^& H; H  W6 m. i0 g
            "name": "NEX& j: l  C! _; X6 @' K. ?0 k) j
Template V2",
; Q# h* s3 O" I& i8 [            "symbol":
( m4 S7 a  G9 l' }& |"NXT2",
2 G/ U; V* `; ^) g5 o            "decimals": 8,
$ U6 J$ X+ D4 R3 p6 p' k            "script_hash":! s; t) z/ M, R1 u" C# M; H! H
"0xa3640dd3c560c75528e5f861da5da98958d0d713",' v. k1 E1 t. w2 D; z5 _
            "contract_address":
. F2 F+ h9 n. G4 {2 Q  v"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b"4 Z! u  v2 R9 Z! x
        }
# r6 p) ?& r9 J( ], q! G( z    ],
& h* q# B) B5 V7 K4 i3 N$ G    "claims": {
0 d6 l* Y3 t' U, n        "available":$ }3 z3 e7 e, N5 b# }
"0.0",& {0 S# x3 w- |$ ]' \1 _
        "unavailable":
6 A& B$ f, R( n3 A' ?9 Z"7730.0"
7 ?  L" d* k# H5 S* u" Q    }4 J1 n5 w2 f8 L- q' E/ x' J/ i6 e
}3 H" |% b2 D1 W$ D9 f9 |
10看来可以开始部署了。再次提醒,钱包密码是coz。
5 J$ b' Y) C, ]3 d9 E. Sneo> import contract main.avm 0710 05 True False
4 |0 m8 B% d5 U  c* ?contract properties: 1
8 P8 F  `+ |! l0 f. gPlease fill out the following contract details:; F. N3 A5 V% r9 l  \
[Contract Name] > MyFirstNEOToken. Q: x' f" f4 d1 y/ B- @
[Contract Version] > 1.0
6 @, s, d. z* y+ I[Contract Author] > Richie4 w5 b; E0 \4 t9 P0 L" q
[Contract Email] > babierichie@hotmail.com& t) a: T9 _/ [
[Contract Description] > First NEO Token
2 b3 e( j& O" l, ACreating smart contract....- |3 s2 ^# a5 e; o& X( W
                 Name: MyFirstNEOToken * @4 U6 [5 v9 K3 k  E, f) u* a8 X
              Version: 1.0" }5 N3 [4 Y; Y1 n1 `
               Author: Richie . K1 L# N/ _, f0 ?9 E
                Email: babierichie@hotmail.com
% B/ K; W# |7 |! k9 g. v8 s* P          Description: First NEO Token - G% [5 U8 a" o- p9 m/ M4 I
        Needs Storage: True   {% E$ G7 O: @( H% W: Y! m
Needs Dynamic Invoke: False
; R) [  s7 I. A9 }7 v/ y2 ~{
2 ]# m: y, t; g! o. ~2 x    "hash":8 v& M6 x4 A7 {% H* k$ _
"0x4e9b87c96158a8e2cc4b74794f727b38947e9862",
2 X: F% _' d8 D& h6 D    "script": "..."," \) v$ S: @0 P4 R: S* K
    "parameters":
- b# @- I$ ?/ E8 j' G$ M5 D8 N2 M"0710",
; k& `! \, R9 Y1 W- J0 S# d: z    "returntype":
' ?2 B4 f, S9 c: D8 |1 P"05"
* @; _! V- @: X; {! l8 Z3 I, v: C}
2 s7 \* c4 f. f  U; YUsed 500.0 Gas
' B6 }, P7 P7 B% L-------------------------------------------------------------------------------------------------------------------------------------; ~( `6 e4 a* N: c, L
Test deploy invoke successful
! M( C) m$ f/ ITotal operations executed: 11
: l. i& }  o; \  h/ A- TResults:; F. F7 q- y3 w6 i2 o! a
[]
8 X' J; ]( T$ a3 O$ \Deploy Invoke TX GAS cost: 490.0 1 P5 {9 C# f# f0 {1 h
Deploy Invoke TX Fee: 0.0   K; e' y" P2 z
-------------------------------------------------------------------------------------------------------------------------------------
; W5 f  ^; l5 ^2 aEnter your password to continue and deploy this contract
9 f& }" e* O& [  d) r! B) }2 z[password]> ***" b; I  ?% X' s, l& M0 k4 L7 W9 F
[I 180914 11:03:33 Transaction:613] Verifying transaction: b'9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114'+ k2 B9 ^3 n$ X: {0 M
Relayed Tx: 9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd65691146 ^0 N% t7 y4 G/ `  B1 x  n7 p3 F4 Z: C
11使用给定的哈希值验证交易。 注意:不同机器的哈希值是不一样的。, R" j9 N0 S7 @3 p9 I3 k
neo> tx
; L: I7 z& y9 e' t4 U9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114
; \" c# v2 h% I+ G; `1 g{0 q5 R+ g# V3 i' s
    "txid": "0x9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114",5 p# d9 p' [- D& P% d7 T
    "type":6 |. |6 r5 j; j! I( c7 ^+ a
"InvocationTransaction",
& E; b0 s1 V: T5 f/ P, u    "version": 1,
) r2 G& Z. h: }# w$ j    "attributes": [],
$ V" f; S- k* I; L) s& |    "vout": [
" a' N: v0 Y0 s9 K% C- d. E# Z  U        {9 X% {  J2 }. M  `4 b  D+ n
            "n": 0,
8 e0 f6 Z& g0 h            "asset":
) u! ^0 X, _. H8 @"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
9 f: Z# M; z. f7 S% A$ _% O6 r            "value":& C9 S1 o: F5 W, ?
"25493.9997",# D  Z# }9 B$ x
            "address":  |% G) q9 ^  n  E2 A
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"% Q- ?8 t6 B8 h; t- h  o
        }5 w; F& J) `  e0 _0 ~
    ],9 I" K5 D- P/ a
    "vin": [
6 W1 ?* K9 \" v, L* e        {
& ]2 |( I# @" c* A8 z0 N3 z$ I            "txid":9 R  |. ]) U1 |
"475a091ccaa6330320a29884f5f8796a260bdba91352dd409d16787b37d8be26"," d4 f1 q: C% c9 h$ k! j  a2 D
            "vout": 07 T; _& |) V, f3 _7 G
        }
& L8 f) e( X7 M! ^6 J    ],
" X, n, N* x" f, j  S7 n0 z! \9 _    "sys_fee":% ]/ K/ U' N3 i) a
"4.9e-06",: a/ Y& v1 {8 v4 ^8 y/ P  x8 Z! x
    "net_fee":" [6 j7 E9 e2 t" i: j
"489.9999951",
/ Q' e+ E  y& h2 M8 \, x( ~    "scripts": [# Y+ i9 T% U) `& _& J
        {
% N0 s& j# I; Y            "invocation":+ S3 N# J( v) ~6 K5 a8 W
"40510fa6630ef581108057ebe967cd306522466a32eaf068cf3717da1e640b866246c013033e3c878ebf9247a5a3500178b21b126b3af63ed07a86b0d2c4f34c89",
: I( Q4 n" U; W) i/ F            "verification":% o. D& P$ g9 H& W" g( ^
"21031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac"5 Y; `4 K4 I4 d1 N  {4 K8 b
        }" R, `  B7 o) Y- K# O( @
    ],) P  X& o9 z% B5 E5 f' B2 t
    "script": "...",4 H. s) T0 K  m
    "gas": 49000000000,' y! F( _, y: x- `1 H1 g
    "height": 10302,' F5 x: e$ b9 f. I- r. a) B
    "unspents": [
- q% ?8 c( J0 {4 B        {
+ d; V. Y7 T0 N  ?$ s* M. s* g            "n": 0," D4 |% ^4 i$ [; T% S. z
            "asset":7 X5 R: }+ d5 H% G0 x( H9 O, a: H0 G6 a
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
" g6 v, r; W" M4 T' t            "value":
1 J6 s6 v, \  X. H2 `. K9 Q"25493.9997",. O, F4 D  A' z, q, H6 U1 j4 _
            "address":/ S' V9 o0 h: Y9 @2 f
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y"
  U0 Y( p& f3 X        }; \2 h. w# H! h. T- E' |! V' h# c, q
    ]: a9 Q1 j% f' F
}% }: s$ L6 I4 N0 e0 v; z2 Q
12交易显示后,再次查看钱包余额。 在步骤9,我们的GAS余额为74589.9996,现在,GAS余额变为74099.9996。 因为这减少的490个 GAS已用于合约部署!
: a! ~2 x) ]& D* e: ]3 \neo> wallet- m* y5 F) |# @4 p
[I 180914 11:18:38 UserWallet:538] Script hash
9 Q2 d- Q6 _  q, Y" Cb'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'
, F" J  X9 a8 T: YUsed 0.357 Gas
! T, Z$ A8 w; ?/ k6 |" ]0 ^Used 0.357 Gas * W. J' |; E0 _  U) g
Wallet {
" P8 s8 k/ o% |, x" q7 O5 N/ m    "path":! D& R  b2 y$ W% }$ ^
"neo-privnet.wallet",! L  y6 ?/ m+ ^1 Z- f
    "addresses": [+ M1 O$ J+ l' X+ {. m9 C
        {$ T, T: r' O0 r- s/ I: k: |
            "version": 0,% w! f8 b" S3 r9 [+ @2 y% q
            "script_hash":
5 T& w9 J# }; ^& v+ W4 M"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
& j6 G4 W3 |  _8 [0 K            "frozen": false,
+ f8 {6 `) U) X) _! h            "votes": [],3 d1 [- X1 w& Y6 n& A
            "balances": {7 y7 `3 G1 x3 D* \" e. ^) K: v( q& {
               
% e7 v2 O& ]$ x% I+ k+ U- {) |" \"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b":0 u* T' ]/ b  [- q4 |" T- e
"100000000.0",
0 M6 @) g- j& e: b. U, m9 ?               & L/ R1 m$ O+ P& \% V
"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7":
/ W3 r9 e! d  h"74099.9995"' N" w4 _2 X  R) h( I
            },, X# e) K2 Y8 Z7 @0 Z5 r! V4 B
            "is_watch_only":3 v2 n! r) H0 Y1 ?. B+ W
false,
7 F  e6 B6 Z. g& L2 @) F            "tokens": [1 O0 h' a, J3 Q' d0 J3 [1 h
               
( u, r3 A8 L; t# p"[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 :, l4 [7 ~+ I, |5 r5 O+ u% V' t
2500000.00000000"
' U5 w; Y4 S& m* {: {  s- x" |            ]4 G; |; _5 T* Q5 K1 X
        }
9 d0 b7 X. D9 V; a. u& B) K    ],' z& r% \( B0 ]1 T
    "height": 10348,# E/ d4 \2 m+ P9 Y
    "percent_synced": 100,% P3 `: z# u" h1 p
    "synced_balances": [- `9 L4 p  y/ l4 y& W2 s+ ]0 Y& R
        "[NEO]: 100000000.0 ",
- v' t' [! Y9 d1 d" u        "[NEOGas]: 48605.9999
2 L  `% a+ A" S% K# C5 a3 O",- _$ t, ]9 x" F3 g. ~2 y
        "[NXT2]: 2500000 ": e4 C1 p8 h* h; X
    ],6 g( b, v& j% a6 h
    "public_keys": [
: f$ C0 _! @. g, A' w# f, ?! D" E        {
# y; Q" d" U/ x+ n9 t: z; m; N+ l            "Address":( o& O: {: W9 ^: U, q7 S
"AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",/ K' e7 v5 X( v: a( c9 u
            "Public Key":( k2 J- U; q4 l2 w5 v- r6 l/ g4 g
"031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
* N6 X0 o* h% C8 N  h+ J9 R  ~( _        }1 B3 K4 M" `; A  L( V
    ],; W* C2 B! A3 O1 q3 m/ e0 E5 o8 \6 ]
    "tokens": [
/ h) R" Q2 m) O# ~- j/ L        {. f; w/ A0 j) E3 I- c
            "name": "NEX
; g! G: u6 e$ q2 a0 \7 kTemplate V2",: m5 s* }7 ^" ~  K
            "symbol": "NXT2",8 g7 x7 [/ |- i4 d; r$ z
            "decimals": 8,
# k6 I- K/ k. X2 ?+ q            "script_hash":+ u$ X; s1 B* v$ E2 x
"0xa3640dd3c560c75528e5f861da5da98958d0d713",6 D( m* ~9 ]% g7 K
            "contract_address":
2 f$ T' ~- r# C- G7 k7 H* @# X"AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b", C0 ]. D3 @0 I  E
        }! w# _* A0 m. F5 G" `0 b9 o
    ],
% p& h+ p3 s2 a$ m9 A9 P) F    "claims": {
. A1 Z: X- o% ~$ @3 i% {8 @        "available":" M2 [- O4 g7 _0 c1 d9 u- k
"0.0",4 a0 c6 b6 {% o' |& D9 u
        "unavailable": "8652.0"0 D" e: }; d* M' H
    }1 M) O1 Z5 _% r
}
: ~9 d1 y* y6 J' |& [  ^我们也可以看一看部署好的合约。
# E* M5 T6 q* _( Z% D3 w, u( {# y# ]neo> contract search My- Y- o# F1 @0 B: c3 p7 c
Found 1 results for My+ }0 \- [+ G. y1 c: y( R
{
5 a. _/ X; `: E5 @8 F    "version": 0,/ F& f! d- S; a8 m5 t% c
    "code": {
, \' k9 i$ b% @. g3 s        "hash": "0x4e9b87c96158a8e2cc4b74794f727b38947e9862",$ J5 K% @1 Y4 {: N  u  E# R# S
        "script": "...",
5 z$ S9 u5 w# D& v- P  {8 ]# o        "parameters": "0710",
0 u4 e! f  ~; J" z2 r+ ~        "returntype": 5
& x/ N3 I( o, h+ ~% V# A    },
% r% x9 B- E- H$ X6 p2 `/ ]    "name": "MyFirstNEOToken",& V$ j  b; z* ~7 Y
    "code_version": "1.0",2 R, G2 x! V0 N4 v: ~
    "author": "Richie",
/ q9 h" p& D  a' B    "email": "babierichie@hotmail.com",2 J2 `) H# N0 u2 T. n8 t2 ?
    "description": "First NEO Token",
/ ^' X1 A! }( l+ t8 x    "properties": {
! ]& ?6 m' u6 V2 X3 m, b( `        "storage": true,- N+ J$ H+ M% |6 z" u+ T2 p* e' @
        "dynamic_invoke": false
' w6 ?1 H, c# n, }    }6 g& T, V  `: j3 V
}
) K9 v4 X  X) p6 R13最后,我们可以尝试使用钱包的密码coz,来调用这个带有合约哈希值的Token。
6 r6 ^5 _8 t% P9 Rneo> testinvoke: R, O" W( j1 P; }- w; I4 P, ?
0x4e9b87c96158a8e2cc4b74794f727b38947e9862 deploy []+ ^" z' f. M) Z0 A; ^3 e9 j+ v/ @# \8 O9 p
好了,现在你已经在NEO的私有域上成功的发行了NEP-5Token。$ x$ x+ c. n/ O
最后
2 F5 \8 }3 j6 y5 v' b( l希望对于Gophers来说,能很轻松地照着本教程学习。也希望GO开发人员能加入 NEO’s Discord,一起开发学习。你一定要试一试!) y4 w! M2 x' ?
如果您真的需要我的帮助,请在Discord上联系我(LikKee.Richie#5647)
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14