Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
将使用neo-local项目为本地开发和测试Neo智能合约设置私有链。 使用私有链可以使我们能够完全控制我们的环境,使我们能够独立工作而不用与外部测试网络打交道。* {6 w6 E9 }4 w; `2 E/ U
为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:
. a% F0 [% b- @Ubuntu 18.04(最小安装)4GB RAM50GB磁盘
/ s( M, I/ y' }' G! N/ g. A

7 u) j! A" e7 p9 G1 c" e请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。
( M; e) N+ b* X* o% q  P4 K5 DDocker,Docker Compose和neo-local
% ?. E* i( W8 x& [0 U3 nNeo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。
* Y, O4 [. P) L# M( H% F安装Docker# Q: v: n' [3 o* z7 N; E' ^, ]
你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:
3 {$ w+ c. X2 k- D6 c. h6 R, ~WindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些)2 I2 L8 l9 k! ?8 D
) p& m/ r% [3 d9 E# |$ `- X% n. I
安装Docker 组件
: T: r, O  n8 ]我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。
3 `" ?9 n3 S4 k7 `测试Docker
4 g% ~" m8 k+ p# d3 h就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:
4 A; w' B4 T: K$ docker --version
/ w& X* U* p( PDocker version 18.06.0-ce, build 0ffa825  k  ^! t4 g7 e3 e
$ docker-compose --version; T3 C$ A* p& m3 |0 t8 _2 F8 i
docker-compose version 1.22.0, build f46880fe
: ?7 H3 k% X, f( A7 X9 ~8 M7 K6 f你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。
6 ]. X  h( W- i  Q. ?+ l如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:
9 U; M5 S/ ?% ^% L  x$ docker run hello-world
0 W1 n5 P3 y& b6 @设置neo-local; b4 j7 L' |1 F, g; H  a* u3 C+ u- g
最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。
- K1 |2 J& A3 r8 J6 W) |& B2 {在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。
+ v9 z! u( K0 t: [" v" W$ git clone https://github.com/CityOfZion/neo-local.git
3 t8 q% W4 ]) P! D0 t& b5 p$ cd neo-local
# j$ z$ x8 ^& w7 m+ R1 i6 I这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。
/ c* E* L4 Q# z4 f$ C- j我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。" u' M& V$ [  V0 g9 V
启用neo-local堆栈5 q/ n: e! Q$ F' u9 I) `* r
在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。
# J" r* n7 O4 o) I  B! D9 s( HWindows (wiki)
# ]% K1 N5 e2 f( \% \$ docker-compose up -d --build --remove-orphans; O9 _0 s; C  K; Z9 R  O+ I" `
$ docker exec -it neo-python np-prompt -p -v
$ W$ C; r$ w7 V& }2 C- b' C, \4 }MacOs (wiki) 和 Linux (wiki)0 T2 ~4 R5 v% K1 n! O
安装make命令,如果你还没安装的话:
/ D* P% X+ l4 v) U0 f( `+ ]$ sudo apt install make
7 c- A4 w& K- D$ \; s: Z启用堆栈
3 Q* u2 j6 u5 L( e5 V7 J$ make start+ u3 \% h7 T0 T& h+ y
打开钱包
2 H, e: ?6 U$ b; O3 K" l  `. r: @5 ?使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:$ y: A$ @7 ~" ^5 [' ]' i; o1 _9 U$ E6 g
neo> open wallet /wallets/neo-privnet.wallet+ C8 ~! M8 k, @0 M% {- T1 E
[password]> ***/ F0 ^+ F" X) d2 z' p6 F
Opened wallet at /wallets/neo-privnet.wallet
  s* ?6 r5 _4 ]3 S9 cneo>& U- Q/ h' g9 K6 }
基本的智能合约
; b; g" `# h" A* {0 h, N由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:
: S: a' A) t  g# Ldef Main(num):
& c' N: E2 i" h" |) Y9 y  return num + 1;
* g* R- W' N1 t- t5 l- O0 ^如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。$ M# t4 S) O" m7 A- G2 {
Neo智能合约在NeoVM(Neo虚拟机)上运行,而且必须首先转换为字节码,这类似于Java,转为字节码后才能部署它们。 neo-python中的build {path}命令可以为我们执行此操作,提供.py文件作为输入参数,然后输出生成的.avm文件。 但是,这个文件本身并没有给我们带来太多好处。 我们将要从这个命令的变形build…test命令开始:
/ R& v9 q3 x7 R* T5 J/ `9 uneo> build /smart-contracts/plus_one.py test 02 02 False False False 5
% v5 _% c' ]( j3 S在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:) k7 E2 W: Q2 w6 m
neo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]
* E1 E9 @2 `! @# D' Y! S文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:
( R0 y$ d8 B, {! N3 v) H6 w8 ?/ uType        Byte5 q7 [  w0 p$ w9 D0 z/ f
Signature        00
- d5 [  N5 H! I/ ASignature        01
% q3 R7 D. v! FInteger        02, ~2 h. \* }1 z
Hash160        033 q' k% {% N5 s6 F
Hash256        044 r; ^0 ]( e+ ~' P7 x$ f  n
ByteArray        05. j0 C$ R+ @$ x1 z+ m
PublicKey        061 f6 ]0 @! P0 A0 @+ U3 }
String        07& h6 j' P8 k8 E
Array        10
* X, Z- T1 I& v; s$ S3 cInteropInterface        F06 y+ w/ J6 ~1 @& C; _9 V
Void        ff4 K! o6 ^" v+ O- O5 v0 `/ O5 P
在我们的例子中,合约采用integer (整数)(02)并返回一个integer(02)。 接下来的三个参数是在合约上设置的属性,我们现在不会考虑这些。 最后一个参数是填写实际调用合同的时使用的数据。 在neo-python提示符下运行此命令应输出如下内容:! L, _4 Z3 ^  ^: _  e" `; j
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5  f7 i3 x& c; z$ {; L% ~" ~% b
[I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm; f6 \* c* P% R8 V( U' @6 o) E
[I 180909 22:53:38 Invoke:586] Used 0.021 Gas) F; f- k  `5 _% W* e
-----------------------------------------------------------& }& {+ p8 ?' s0 K; z- b, {$ D
Calling /smart-contracts/plus_one.py with arguments ['5']
/ k: Y: L+ I3 }2 }% B6 wTest deploy invoke successful
& s! I: c5 f5 `* P8 t& [Used total of 19 operations+ z0 N5 Y# U: X, e
Result [{'type': 'Integer', 'value': 6}]- c# I# D# l) h3 d
Invoke TX gas cost: 0.0001
: a) L+ v/ Z2 A( G-------------------------------------------------------------1 H7 e% I- \/ s0 }( k. ^
neo># x* P7 @& N6 E) A3 Q
第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了!0 u4 g0 \: x7 i) B5 L
部署智能合约
) |: L. h! c6 l5 s最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。
" f9 x2 K9 }2 {: `! n3 fneo> import contract /smart-contracts/plus_one.avm 02 02 False False False4 l1 `- @& o* f; w, w' a0 J, B9 M
系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。
- n( ]9 u5 k4 I+ }, R8 U$ q部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):
( @. c; p; P( w1 W; Dtestinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 88 m  I4 \3 h4 D7 u  _5 g
你应该看到预期结果的输出:+ r: a4 T0 B  ~. \
----------------------------------------------------------------
9 x" C5 f0 M* F2 B$ b2 }Test invoke successful
: S9 U9 B! _# ~. l$ V# S; UTotal operations: 195 F% \, f7 m2 }& N- ~, G5 j
Results [{'type': 'Integer', 'value': '9'}]$ K" q2 _5 L8 B" g- s
Invoke TX GAS cost: 0.06 V# p7 u* R* t+ F$ r/ @
Invoke TX fee: 0.0001( l/ c# ^% L5 X3 Q, ]
----------------------------------------------------------------
5 h0 K: s6 ]! [8 o0 N9 b' }如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    13