Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
将使用neo-local项目为本地开发和测试Neo智能合约设置私有链。 使用私有链可以使我们能够完全控制我们的环境,使我们能够独立工作而不用与外部测试网络打交道。  M4 \" w( q' L3 e( Z
为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:
0 d) d. G% ~% F6 P% NUbuntu 18.04(最小安装)4GB RAM50GB磁盘
- y, Z, ~! v7 d

5 _' C  Z- m9 p  _: [. k- z. e请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。5 e9 m1 i) _# w/ L% F9 b$ r( ~& o
Docker,Docker Compose和neo-local
) }: o) z0 a4 _$ rNeo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。1 s/ ~/ v$ m0 ^, H) E0 U9 c" n
安装Docker
! s. o1 J% s- R: M, b: b( p4 ?: {你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:
: [  E6 M1 o; t* S% X% k  A; y4 GWindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些)
: y1 |, g: Y( R3 ?8 ?
! s2 W4 @3 W( f# \2 K: P4 `
安装Docker 组件( ?# `0 i! o4 m
我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。
+ i- }; s8 R0 `5 b/ q. i测试Docker% _8 z9 u+ {9 ?% Y: o. f" V0 _
就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:( M8 `- ^) K" _2 |
$ docker --version
0 g4 D- ?! u# G6 RDocker version 18.06.0-ce, build 0ffa825
& {- V  u5 p: e7 j  y- ]$ docker-compose --version, }0 B- i+ D6 j
docker-compose version 1.22.0, build f46880fe( ]' U" T" K9 }
你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。" r6 ~7 u3 [8 i/ U2 H! l; I& X
如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:
6 L' S$ v; i: ^3 i. D& U8 `$ docker run hello-world$ B% |; K$ [( t1 d. H- ?. Y
设置neo-local
7 ~" O! [0 z6 |- H/ I- k最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。
/ V; D/ v4 q6 F9 v" y* y7 x9 b# t在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。
1 E& _) c* i6 q& g/ g$ git clone https://github.com/CityOfZion/neo-local.git9 S. j7 {" Q- i+ w" p
$ cd neo-local
% l1 s! A0 X& ]0 t; h这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。
. A& `' _5 y5 j4 ]" h我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。' m  h0 W# c- [1 k4 L. K7 E
启用neo-local堆栈8 b6 b% g: M, @$ v% I5 N6 v- L
在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。
2 C4 O& S5 J, Z9 }Windows (wiki)
: q4 y( m: E1 E/ U) p9 l$ docker-compose up -d --build --remove-orphans
( }) X) ~! W% r7 b! B1 ~) h$ docker exec -it neo-python np-prompt -p -v+ W' h8 ^" T( y9 {7 m
MacOs (wiki) 和 Linux (wiki)
8 i" \/ ~; B0 c1 Y安装make命令,如果你还没安装的话:
. w5 b0 X  I; A! p$ sudo apt install make
/ ?: g3 c' E5 ?3 P启用堆栈
" O8 s) D  |1 U  t, h$ make start
3 M1 y& j- h2 a- |) k) c打开钱包
' ^, o- V  M; k6 R7 ]2 D. r$ ?使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:
9 c2 s: ]* `: N) j( N$ q5 uneo> open wallet /wallets/neo-privnet.wallet; m. e( g) Z3 t+ a) c) a
[password]> ***
' _! _; U" @! R& J5 SOpened wallet at /wallets/neo-privnet.wallet
; y; c/ |" k& \7 p+ R' ?6 tneo>6 D9 `: d# o4 ~# {
基本的智能合约. t" f: H+ L# m' [+ s1 O# ]) \
由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:
3 n. y* Q3 E7 E3 udef Main(num):
" G- W3 `+ I( ?, a& ]2 q* W  return num + 1;  h7 j# Z0 n# i2 d; i8 U
如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。6 l/ v" B9 }+ I
Neo智能合约在NeoVM(Neo虚拟机)上运行,而且必须首先转换为字节码,这类似于Java,转为字节码后才能部署它们。 neo-python中的build {path}命令可以为我们执行此操作,提供.py文件作为输入参数,然后输出生成的.avm文件。 但是,这个文件本身并没有给我们带来太多好处。 我们将要从这个命令的变形build…test命令开始:- H, f" h" q! d
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5+ }  m* Y3 h: I4 \0 Y: k
在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:( s  R$ m7 r, _7 g. _
neo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]3 z. Q" e) l; J4 |) t
文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:
2 c# I; q3 I0 L/ fType        Byte! B/ f8 @! f3 [3 i( G7 N0 p( d6 n. b
Signature        00% t' G" @  _3 X5 J& k$ Y9 Z
Signature        010 j/ c6 p7 V% _$ H+ ^
Integer        02
" e# D$ m# a8 a$ PHash160        032 @7 f# A: O. l# X0 T7 i$ ^
Hash256        04
8 q0 ~4 D8 h$ tByteArray        05" }- Y, U+ S* A4 ^) a' }! R: j
PublicKey        06
+ h" X; \% a: Y0 q6 e" j3 W; _2 SString        07' \+ ?' F  c' L9 \' G- ]# Z+ N0 }6 n
Array        107 n+ C8 f- Q" o- Y" b7 J
InteropInterface        F03 f# U1 z" e% z# }* t* f4 J
Void        ff
% q$ ^: {/ m# g8 n7 G% g3 E! r9 w在我们的例子中,合约采用integer (整数)(02)并返回一个integer(02)。 接下来的三个参数是在合约上设置的属性,我们现在不会考虑这些。 最后一个参数是填写实际调用合同的时使用的数据。 在neo-python提示符下运行此命令应输出如下内容:& i; S) i9 z, J3 n( w
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5
4 @7 X* P6 R( B4 _9 T[I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm
: `& a0 y8 g7 Y0 d# a( Y[I 180909 22:53:38 Invoke:586] Used 0.021 Gas& U7 R7 \& c8 c" Q
-----------------------------------------------------------
+ L) v' k: s/ ZCalling /smart-contracts/plus_one.py with arguments ['5']
  P0 A! s4 e- u" v, ~5 }3 c3 V% u  jTest deploy invoke successful* {$ S: F  V' R( Z
Used total of 19 operations+ ^% U* C8 o  U. Z2 s2 U/ s. N, R% m/ l
Result [{'type': 'Integer', 'value': 6}]6 p/ a! G& h9 U, k, e! C6 g
Invoke TX gas cost: 0.0001
1 ~" J; ?, k5 y" F3 Q-------------------------------------------------------------
( S; A" a. x7 W& G( _' u6 K# O" ^3 dneo>; P8 {7 {4 G2 b) f- Q# J% x
第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了!
5 m! r; J# q: \" ?部署智能合约
1 R! `8 F8 j3 z4 H. e3 F4 E最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。
  a- E0 g; Q' a* ]1 C: Hneo> import contract /smart-contracts/plus_one.avm 02 02 False False False( B9 t% ?7 W  a- l1 j% V
系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。; }/ g( w' q( v) C
部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):3 o, n6 S2 G: s0 |4 `
testinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 80 W# D5 J3 c; S' `$ [
你应该看到预期结果的输出:4 m6 ]% x, s: Y4 p
----------------------------------------------------------------
5 O( g" I5 e9 L+ c; x+ H1 CTest invoke successful
& O8 e# f- \6 \/ v; zTotal operations: 19: u6 n: I5 g% t( B' b
Results [{'type': 'Integer', 'value': '9'}]
, a- _- q, D  }5 B  ?' LInvoke TX GAS cost: 0.0# ~4 S. J* a9 Q+ y. S  T+ U4 l
Invoke TX fee: 0.0001
5 J8 C' O% e$ ?) p----------------------------------------------------------------
) q0 P8 J- u: N1 y, r如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

温室小书生室d 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    13