Hi 游客

更多精彩,请登录!

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

本版积分规则

成为第一个吐槽的人

V刘晨曦 初中生
  • 粉丝

    0

  • 关注

    3

  • 主题

    14