Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
将使用neo-local项目为本地开发和测试Neo智能合约设置私有链。 使用私有链可以使我们能够完全控制我们的环境,使我们能够独立工作而不用与外部测试网络打交道。
2 V+ k/ J; {2 P" F$ g- M1 k! _为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:. s" w: V1 M& C0 t6 m6 e. ~
Ubuntu 18.04(最小安装)4GB RAM50GB磁盘/ {4 z0 K2 f  x$ g, B
. N5 ]5 {# K8 ?) H7 Q$ s
请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。7 K! n% N6 a7 D- T* A$ S
Docker,Docker Compose和neo-local
2 X  M& t3 I9 Q; \) S  ANeo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。( l2 c2 k  M* z7 e
安装Docker. f' y& ^0 s$ M
你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:2 r8 _3 p. _: H( }4 Z0 Y" t
WindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些)0 h6 b2 E4 r' [) E  ~. R
( M8 ~1 A4 K/ [! y
安装Docker 组件
% e+ `$ O. ^: t2 F我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。; G: v/ T# x4 u6 F  @9 v9 y
测试Docker
) N9 q0 m- D; {, Z就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:
, f/ k: S$ K7 |$ V2 {, y4 b$ docker --version
. B8 W+ J$ Z" R8 S% ODocker version 18.06.0-ce, build 0ffa825' w# E: I$ b, n
$ docker-compose --version
4 {, B6 \8 @( z9 }7 ndocker-compose version 1.22.0, build f46880fe
0 n1 Z5 X. w, j" O0 ^你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。
$ U8 ^9 w, Y$ h. D7 ^' y如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:
# S) n5 e4 z6 y4 W) k5 q" h$ docker run hello-world8 ?  L, i- ?; x# U
设置neo-local
( u; A. C3 C/ o最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。
) t  G7 v  ~7 W" S$ @' U在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。. |8 J5 `" \& Q8 k, x* b! A, s
$ git clone https://github.com/CityOfZion/neo-local.git5 m: G7 u5 Q( S, ~) z
$ cd neo-local0 _% [% [! Y1 h. z4 m3 L6 m
这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。
3 W4 L, H! K! P- J5 O+ c我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。( l; T$ h8 }  r% s9 R5 e2 x
启用neo-local堆栈
0 o( s& N1 b" Q8 _/ o( _在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。
8 n) X/ [: Q$ T1 b: l1 K# L8 yWindows (wiki)" m! K3 T+ z$ Q' c
$ docker-compose up -d --build --remove-orphans: O1 Y1 M; n8 X* D: E
$ docker exec -it neo-python np-prompt -p -v% Z6 o2 Z, c1 T  R/ Z$ A
MacOs (wiki) 和 Linux (wiki): o; ~/ C  H6 Y) Z* f+ H3 a
安装make命令,如果你还没安装的话:
) q& F% m, ~8 V$ q, x$ sudo apt install make
8 m. a; ]; h& Z, Z$ {启用堆栈
1 N9 Z9 h4 B: c% X7 A$ make start
# O1 }4 B7 S8 L. e0 @  `* G打开钱包
1 s1 y2 _* j& b& c( |) a使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:
, P$ |. I, ?( E6 Q6 w6 [: vneo> open wallet /wallets/neo-privnet.wallet1 J3 ?' \" _) l, G' \( Y* e
[password]> ***
. X2 Z7 ^$ F! `Opened wallet at /wallets/neo-privnet.wallet5 N- E  m0 b) e5 Z) \
neo>. l+ M2 l* ?. F$ ^, m2 K# g+ P: f
基本的智能合约; V! U1 Q& a1 I+ g* e
由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:9 ^/ B& t" N% I# e( g+ ?
def Main(num):- r; g+ U  p* g$ t5 L
  return num + 1;
" O2 z& |$ K0 ~& Q  J. o如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。
  e; x8 S. g9 b" UNeo智能合约在NeoVM(Neo虚拟机)上运行,而且必须首先转换为字节码,这类似于Java,转为字节码后才能部署它们。 neo-python中的build {path}命令可以为我们执行此操作,提供.py文件作为输入参数,然后输出生成的.avm文件。 但是,这个文件本身并没有给我们带来太多好处。 我们将要从这个命令的变形build…test命令开始:
& s5 G* v$ v6 b. \% S7 g8 n' L# ineo> build /smart-contracts/plus_one.py test 02 02 False False False 5
, a3 B# \6 M: x7 m在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:- G- ]3 [& [' E: S' z8 Y
neo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]1 I4 H6 n; D" u
文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:' p1 e/ h; D" \/ u
Type        Byte
8 l' D0 D8 P; D5 \3 {4 P8 c7 tSignature        00  n2 f9 h' s, Y1 q4 w
Signature        01$ J1 h% Y; F, v9 O( t( S2 I
Integer        023 w! E, c  d9 N! Q1 w3 C
Hash160        03- u" W9 w' W& W, n9 ~: p
Hash256        04, j8 x6 E3 o6 z  W5 P! e1 d
ByteArray        05
% V6 q  {' e* v+ C8 z0 gPublicKey        06
2 O1 i3 ]4 d' e0 i( cString        07: A6 M- i2 E0 L, [- i
Array        10, y* f! d+ w- f5 k( I( r# N. L
InteropInterface        F0
) z2 R% M+ _. {8 U7 zVoid        ff; U3 g+ R, e4 z: |, y9 L
在我们的例子中,合约采用integer (整数)(02)并返回一个integer(02)。 接下来的三个参数是在合约上设置的属性,我们现在不会考虑这些。 最后一个参数是填写实际调用合同的时使用的数据。 在neo-python提示符下运行此命令应输出如下内容:
8 t4 P( N+ s. z, y: A( x9 o" ^' |neo> build /smart-contracts/plus_one.py test 02 02 False False False 5
  @9 Y% L7 ^6 V: W: N+ n- d0 r' m[I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm6 s5 O3 K9 |8 p: r% c% R: W; A
[I 180909 22:53:38 Invoke:586] Used 0.021 Gas
9 \. ?8 ~% R1 J, E: G-----------------------------------------------------------
  z' f; O2 M1 k7 Q: @$ D; h- t# tCalling /smart-contracts/plus_one.py with arguments ['5']( ]2 i/ H! o! H6 N! q1 k+ ~
Test deploy invoke successful' B2 V9 {. e  m- u3 U! G
Used total of 19 operations' }- i) Y+ u4 z6 Y5 A" T
Result [{'type': 'Integer', 'value': 6}]
, c: |% P' i( KInvoke TX gas cost: 0.0001
- e/ d: i6 `7 s8 l4 W8 l$ R# }-------------------------------------------------------------/ J: X5 a. w/ L) D
neo>
" ~# h2 ~# s( O" I第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了!- G; s& ~; b# n7 Y) R) v
部署智能合约
. c/ F  A9 |5 C! |( b9 }1 X9 h' d最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。
" _0 H0 N) P8 b0 c5 Kneo> import contract /smart-contracts/plus_one.avm 02 02 False False False& y8 t( i$ Y1 |4 n  M
系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。8 n, N$ j  B- A! ^8 J3 C9 V
部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):
- e+ c, |7 u" O' H; Etestinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 81 N- Z' l  {- L. _" [5 t. \7 n( D
你应该看到预期结果的输出:7 u# s) M) h9 m2 ]4 {: q
----------------------------------------------------------------6 T/ q& v+ z# ], ]9 S/ b
Test invoke successful
/ t6 _$ O/ s# L) e+ y1 lTotal operations: 19
: X) y6 z# P0 x- }) j9 d: q3 F3 RResults [{'type': 'Integer', 'value': '9'}]3 I& g& H" W4 H
Invoke TX GAS cost: 0.0& r  J& G4 s& L9 ~$ e
Invoke TX fee: 0.00019 y: T  @6 M) I
----------------------------------------------------------------
$ z8 I* t, o3 }* ]: Y% E如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    13