Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
将使用neo-local项目为本地开发和测试Neo智能合约设置私有链。 使用私有链可以使我们能够完全控制我们的环境,使我们能够独立工作而不用与外部测试网络打交道。4 Q& y; @: t/ r& Q; q- O& A
为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:# N' O  H! j. L: m0 a
Ubuntu 18.04(最小安装)4GB RAM50GB磁盘7 N1 X9 a  N- b+ d! K$ b
% N. Z: y% T) l- R- C# Z
请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。  P' |2 r7 G, O
Docker,Docker Compose和neo-local1 J7 J4 _; S  I6 F6 v- u9 q; H& j2 m
Neo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。) }+ W- G. r4 V2 Y" P
安装Docker& a% u' O! v1 k" M' _  U) t+ t2 E% `
你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:
: S3 \, _6 o% S# P3 KWindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些); k2 ?' T: r5 ~/ L7 w' F+ A

  X6 {' E' w2 S& C/ y安装Docker 组件
- F3 X0 v8 F, V$ j) g- F+ C我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。
4 a0 c0 G0 F, N2 v  R* g测试Docker
, q8 }) B* B$ S就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:5 m1 G- W, J) X1 U; X  X
$ docker --version2 J7 D- R3 _" |0 b4 B4 z
Docker version 18.06.0-ce, build 0ffa825
& N: a7 k4 Q& a- ]' a! Q1 k$ docker-compose --version- v/ M" v  a& g
docker-compose version 1.22.0, build f46880fe
* Q0 n9 `5 p  `' M5 E你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。! _  ?4 q& S" }
如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:
3 ?, |6 e" o0 w3 z$ docker run hello-world/ a& d5 M$ N0 A8 B
设置neo-local
3 ?8 I4 ?: J! O' \' C' p最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。
- U3 M: s. W3 J$ l( Z" r; G& d在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。
; M- t) @% D7 f7 @4 y, _$ git clone https://github.com/CityOfZion/neo-local.git
! v& `2 \) @; _0 ]( E; ^( Z. `$ cd neo-local
# ^. d. O2 T6 f# u5 [! Q) G这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。3 S/ Z: l' k2 b9 e) m/ W1 u
我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。
; f7 {; x7 G1 |6 ?! g启用neo-local堆栈
5 `+ R1 o: l) c3 L在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。  P+ b$ R- F6 z7 M/ f0 }
Windows (wiki)
) b9 T% j: U/ p% n$ docker-compose up -d --build --remove-orphans: ~: Z7 W7 \! c+ d  u6 L
$ docker exec -it neo-python np-prompt -p -v
1 y7 |" h+ N% Q& B: _3 Q3 {MacOs (wiki) 和 Linux (wiki)
0 L6 f. B5 ^: P安装make命令,如果你还没安装的话:
) O2 p% L, c3 H* y$ sudo apt install make
$ z  H) K0 l' k$ Y2 \$ ?启用堆栈! ?$ y6 f3 @$ V2 S; m% `' W) f( o+ N
$ make start! U1 a3 ~# y6 J7 V) r
打开钱包- E7 m6 h1 B7 {( Y
使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:  }$ [$ k8 h& L. d/ v
neo> open wallet /wallets/neo-privnet.wallet) u, E& I) c- z: _6 q# F, m' `- ^6 R; G
[password]> ***
' h, U! {8 f/ C2 QOpened wallet at /wallets/neo-privnet.wallet4 I( y  c$ L5 q- B$ G& r  x
neo>7 c6 }$ i1 A3 V7 w" Q1 ]. a
基本的智能合约7 r% Y" W3 F/ O
由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:9 E7 _% ]3 v( @1 v! X  S9 t
def Main(num):
9 d! V5 P2 Q! r: g) L1 p) p  return num + 1;5 f+ H, I7 }& W  I/ j8 }
如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。' G, ?! S7 r8 C, u
Neo智能合约在NeoVM(Neo虚拟机)上运行,而且必须首先转换为字节码,这类似于Java,转为字节码后才能部署它们。 neo-python中的build {path}命令可以为我们执行此操作,提供.py文件作为输入参数,然后输出生成的.avm文件。 但是,这个文件本身并没有给我们带来太多好处。 我们将要从这个命令的变形build…test命令开始:) E5 ^8 N+ k0 }
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5: c8 g- u1 r& V+ d# ]& ]
在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:
6 a7 X, C- c+ w# Q0 Eneo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]+ D& p" O* A3 g  }
文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:
9 e7 J: y7 |# Q# s" SType        Byte1 V4 R6 ]& x. f" n& N) S4 N
Signature        00
; V/ ^' q2 U% \3 h0 j$ OSignature        01
5 u/ g+ }' J" v' a4 l0 {Integer        02
. S* y& ^' p" }$ dHash160        03
$ P9 S5 U4 Q! ^Hash256        04
& P$ Z/ C8 |3 \: a* LByteArray        05
% x2 }: V- k, v6 Z6 E. f  pPublicKey        06% j" L. N" o5 w% N8 D# ?
String        07
7 p9 Z# ]" x9 CArray        10
. G2 }, z1 y5 b2 n9 B% gInteropInterface        F0
: b( M5 V& K  [, VVoid        ff
, v/ S" e  |0 p: @在我们的例子中,合约采用integer (整数)(02)并返回一个integer(02)。 接下来的三个参数是在合约上设置的属性,我们现在不会考虑这些。 最后一个参数是填写实际调用合同的时使用的数据。 在neo-python提示符下运行此命令应输出如下内容:$ m4 w; F: o' ^5 i6 U/ u
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5+ s8 K0 X. Y) e2 H* x& x3 G
[I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm
- z. ?% ^6 H# G' X3 A" `# n& y[I 180909 22:53:38 Invoke:586] Used 0.021 Gas
8 |5 e* n% V) {6 j( C& D-----------------------------------------------------------
  W! a6 x6 s9 PCalling /smart-contracts/plus_one.py with arguments ['5']
& B9 k, A( ^" ^# aTest deploy invoke successful/ S& f& s3 q( @* ~
Used total of 19 operations
! _( C9 J5 N6 n$ SResult [{'type': 'Integer', 'value': 6}]
' M4 j! T8 X. c- X' c# A7 R  cInvoke TX gas cost: 0.0001
% H) w0 q: _+ K( G4 s0 E6 R-------------------------------------------------------------
8 C) s0 g# h: T, Q' @: M& L6 bneo>" u! m: u7 @- }5 s, X: {3 R. g
第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了!& u5 u) @8 T0 f4 I0 Z# J
部署智能合约
  i/ @3 G0 z; j7 E* j* A+ v, D最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。7 B  E: }1 @9 j
neo> import contract /smart-contracts/plus_one.avm 02 02 False False False4 `; o2 U) [$ [
系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。+ V" K* V4 e& ?0 ~: C% b0 z8 R, c
部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):
. x1 K2 t8 I8 K3 k) ?5 d5 |- btestinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 8
0 a8 P9 d" z" U/ _3 J你应该看到预期结果的输出:. F  F% v# K  @# p! ?- D' Z
----------------------------------------------------------------! `! H: b# h/ D0 X7 e
Test invoke successful  D$ ~) b7 h% r. Q7 s: O+ D+ B- L  ^
Total operations: 19
+ Z" ]% Z- _$ h6 nResults [{'type': 'Integer', 'value': '9'}]
2 G9 n0 N. Q( _4 M  FInvoke TX GAS cost: 0.0
+ |8 ^1 [. r. gInvoke TX fee: 0.0001
  L' f# y# Q7 o5 M: q9 I9 T- ]----------------------------------------------------------------& a# [# p9 n$ a- C
如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    13