Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
将使用neo-local项目为本地开发和测试Neo智能合约设置私有链。 使用私有链可以使我们能够完全控制我们的环境,使我们能够独立工作而不用与外部测试网络打交道。; d1 q/ L$ I5 |$ I
为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:7 j; f, |9 q4 J/ J5 B5 t5 z
Ubuntu 18.04(最小安装)4GB RAM50GB磁盘3 }# |& M4 N2 ~

' P) ~) f' [% K5 R* A8 [9 J请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。' N/ a& O% B" B- |( e2 x; j" O3 H- \
Docker,Docker Compose和neo-local1 `# G+ k6 d# q! t+ s
Neo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。
# f. q" D7 s$ h2 B' ?安装Docker/ M6 E/ s" N0 s) c
你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:
1 ?% k, b/ m/ E' d" fWindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些)" `8 V, d: v$ i3 m3 a/ s) r' `- O' g
; W: T% }. U) P) W! P& M( d
安装Docker 组件. J& P! @1 A* ~9 J% r; ~( f
我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。
, {. A4 ~3 J* B$ V测试Docker8 d% k" Y4 B( w) V8 X3 `, R+ g, C
就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:
# G7 R1 |: s: v) }$ docker --version# t2 z8 {* e; C& R( Y3 l# ]# Y
Docker version 18.06.0-ce, build 0ffa8257 {& d" h! P4 U  |
$ docker-compose --version
& E4 |: G& b1 r+ L7 }$ [docker-compose version 1.22.0, build f46880fe6 R% i( V4 z, N& l9 n" s3 b
你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。
9 l. K  e: m) U: N+ v% p( M5 [如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:
2 Y6 l; v$ q% o1 y. q; s5 D$ docker run hello-world
. h' g3 M$ L* _1 Z设置neo-local
2 [: g3 ?' ]4 D最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。& ^4 y- O. A( z4 ^7 r( ]/ J' p" V+ q
在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。# T: I; x( a/ l+ G# m2 ~: r
$ git clone https://github.com/CityOfZion/neo-local.git
& k! l3 K" H0 j$ cd neo-local: _2 `. Q2 [; |7 Z( t% P6 B* n" Z
这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。
+ [$ P! g& l# s0 p4 k! y- U% ?我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。
6 z" B1 t4 h$ E) z$ l. i启用neo-local堆栈
# A1 D' G$ j' W$ C- p: ?0 o2 K/ Z2 @在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。
+ E- Y" U: M% B9 x! SWindows (wiki)$ ?$ z' ^5 K2 a
$ docker-compose up -d --build --remove-orphans
( M7 V; Y. n+ `, p1 T. }$ docker exec -it neo-python np-prompt -p -v
% Q) g% _) E4 b  Z5 U$ {MacOs (wiki) 和 Linux (wiki). B9 p0 v, O9 q' \& [: j& T
安装make命令,如果你还没安装的话:, j1 I- x! H& r% p! P
$ sudo apt install make
9 s3 K& @5 H/ ]6 ]启用堆栈
: F2 ^% O# t9 D# j' w% w( k$ make start
: x7 J/ S% m7 k1 J$ ?' W/ h打开钱包
2 g; o' z: w6 h5 [( G使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:$ i* K( A, k1 j# L) x
neo> open wallet /wallets/neo-privnet.wallet0 {5 @; R0 r' R8 k- }# r& D
[password]> ***
8 Z6 m, k! M" e5 ?5 VOpened wallet at /wallets/neo-privnet.wallet
! T/ M" T- E4 kneo>4 c; Z5 R8 f1 s# Y. X+ r( ^0 v
基本的智能合约
# b! F8 H) r, ^6 |, l, D7 E9 z由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:
( g6 m& o  P6 {  Tdef Main(num):
4 H+ K! [" U" P) }, Q  return num + 1;
3 D& Q1 h# \. J, X" {, ~. R如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。
9 j6 P! v" ^# VNeo智能合约在NeoVM(Neo虚拟机)上运行,而且必须首先转换为字节码,这类似于Java,转为字节码后才能部署它们。 neo-python中的build {path}命令可以为我们执行此操作,提供.py文件作为输入参数,然后输出生成的.avm文件。 但是,这个文件本身并没有给我们带来太多好处。 我们将要从这个命令的变形build…test命令开始:
. O/ E: U8 J0 X( r# jneo> build /smart-contracts/plus_one.py test 02 02 False False False 5$ U1 ?5 N; G( F% a, i7 a% j
在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:1 E/ C! b' K0 H" e
neo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]5 L. `: j+ L7 X. j; e! e) O
文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:
$ R) f- H/ |3 R' nType        Byte
; H' x3 h# g7 W4 k0 d, u& Q: c- dSignature        00" J4 j. p7 e: J2 h2 V
Signature        018 Z4 E5 N: L: p) b% _) T2 Q
Integer        02
3 r* F8 A$ F. o3 q( m8 f0 U* GHash160        03
6 b7 J2 a! q+ XHash256        04
* V/ O- i( `3 f% d4 ?- NByteArray        05
1 @0 u# t3 v* E8 v. e& {. fPublicKey        06! B- g+ E: C/ l" z2 I
String        078 F2 u6 z  U; C& N
Array        101 @* }4 j6 [$ K
InteropInterface        F0
. f9 c1 `: o6 B1 sVoid        ff
+ ^# ]& b( o% G: M$ Y在我们的例子中,合约采用integer (整数)(02)并返回一个integer(02)。 接下来的三个参数是在合约上设置的属性,我们现在不会考虑这些。 最后一个参数是填写实际调用合同的时使用的数据。 在neo-python提示符下运行此命令应输出如下内容:
; F* Y$ s5 |- ?5 z/ M! yneo> build /smart-contracts/plus_one.py test 02 02 False False False 58 g& p2 P/ U& i/ i* R. g- b- \9 K4 Q
[I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm( a' z( G& W- o( G2 X
[I 180909 22:53:38 Invoke:586] Used 0.021 Gas- O, [2 |! ^  m
-----------------------------------------------------------9 F1 X- {% f1 x0 d& O/ `: {0 s
Calling /smart-contracts/plus_one.py with arguments ['5']+ W, L1 @, k* n" F
Test deploy invoke successful9 l2 i; H- N6 G! e& T
Used total of 19 operations
2 L3 c0 N0 F& W: W2 U* v+ {- b1 ZResult [{'type': 'Integer', 'value': 6}]7 k2 |. {' p2 q* m* ]
Invoke TX gas cost: 0.0001
" l9 G$ O/ ^' c' n, m' c5 J-------------------------------------------------------------3 D" w# {9 ]6 g. C/ X" G
neo># a- h* B$ o7 A0 h9 y5 K6 N
第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了!0 T/ h; G$ @4 T: X/ y
部署智能合约
, F, I! ^9 J' U; t0 p, w! i最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。
6 z9 W( U+ b3 }( W: {neo> import contract /smart-contracts/plus_one.avm 02 02 False False False! |- p; Z5 }% z7 v) Y6 x5 E
系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。. I, c- ^8 o1 l: e0 x+ k( o; h% M" n
部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):. a6 I6 R( l5 [. S
testinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 88 H- ^  L) E6 i; L, ?; t+ o# t
你应该看到预期结果的输出:- o3 K, b0 f3 s: D4 Y, n7 i
----------------------------------------------------------------
& Y7 p- l% H# d  tTest invoke successful
" |9 y1 X4 V8 e; ~9 a- uTotal operations: 191 [; J/ W9 t6 G! t& E7 I
Results [{'type': 'Integer', 'value': '9'}]9 k& c1 a. X! H+ f$ L6 e, F
Invoke TX GAS cost: 0.0% ]) M8 ]2 g6 M5 }0 x8 {1 v. P
Invoke TX fee: 0.0001
- n  D. c4 w* Q  _/ L+ U, ^----------------------------------------------------------------' @: P" w# S% c* }! H7 L
如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    13