Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
将使用neo-local项目为本地开发和测试Neo智能合约设置私有链。 使用私有链可以使我们能够完全控制我们的环境,使我们能够独立工作而不用与外部测试网络打交道。
7 Q8 ~7 I9 y- k( B/ Q0 W6 }  e为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:
, L& Y  o8 b+ y$ m3 Q/ w3 p9 mUbuntu 18.04(最小安装)4GB RAM50GB磁盘! I" |% f2 c/ \0 Q' ]

7 T( B% ~' L9 `2 m# |请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。; B6 v. V- [# `1 Y% q. e3 x
Docker,Docker Compose和neo-local
7 f6 x3 f6 U5 ?+ f3 @- R) oNeo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。3 r7 d9 F1 e! c8 F! {4 X
安装Docker; s. V* t( c; N# W: H" E" _/ _
你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:5 ]/ U! m+ m3 J* T6 t( l7 ?* n: X
WindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些)5 U; p) w& Q' r8 @9 R/ ]8 R

4 Z, @# t8 G, }+ J! w. r% z8 K安装Docker 组件
0 ~4 H2 o5 d, r我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。
8 r3 Q) O- F) W; o, z  l测试Docker2 @* W+ s1 o; B9 A/ I; C
就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:
, ~, y! ]1 k# }* s  H/ @. I- y* Z$ docker --version
7 w6 G7 Y/ D% x2 \- c; M% ]2 eDocker version 18.06.0-ce, build 0ffa8251 ^" ]% U, V6 I$ _/ [( |6 E: o
$ docker-compose --version
$ j. |% ]2 ^1 j8 b, C. U/ Q. Xdocker-compose version 1.22.0, build f46880fe7 @- m/ b% s, k4 e3 R5 Q# m
你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。0 R+ W. n% V5 x& ~1 q- q! \" ?
如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:
! u8 @! [6 N: a) r; s$ a  r, O$ docker run hello-world0 j# W2 k! S' d, u+ U; A, c: i0 F
设置neo-local
. }8 [) P" R; Y* `% ^9 I1 W最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。
) z; \9 e8 K+ {在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。
- {& p! R' J" Q# x1 ]& F+ h) n$ git clone https://github.com/CityOfZion/neo-local.git; a7 `9 D8 C) s$ f4 P' K# S1 m+ V
$ cd neo-local+ f' S2 [0 [3 u( H2 X
这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。
5 D6 ^# Z) Y+ X& H我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。
0 U$ m' L) Y$ D' _5 ]& j启用neo-local堆栈" U( e5 F- J0 O% x
在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。2 l0 ~$ Y4 c7 Y" a5 e; ^3 w& q
Windows (wiki)+ e) {8 a1 Z% g( V- T! t; j: y
$ docker-compose up -d --build --remove-orphans
" J; {1 J% H( P" f! Z7 d$ docker exec -it neo-python np-prompt -p -v
' _# _; }; W7 S: qMacOs (wiki) 和 Linux (wiki). O( V! |# x1 x2 w. b
安装make命令,如果你还没安装的话:
! u. k  ?1 x, |! e% m# w3 e: r, U$ sudo apt install make
& D8 B1 G& j# b7 z  y启用堆栈% W) \6 m- e0 D8 P
$ make start# b5 ?* T: I! _3 M: F- {
打开钱包
3 `# p2 C9 f3 F9 o9 ?2 e! X% t  X使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:
" w2 O; z: J- ^+ Q: Vneo> open wallet /wallets/neo-privnet.wallet. Y# R9 C9 G: @9 Q" Q& J. }, W
[password]> ***
- E+ ^0 Y4 z3 q" `' A6 Z, @( J1 i8 A9 ^Opened wallet at /wallets/neo-privnet.wallet
+ b2 S5 ]7 g0 H( Mneo>
' M# e: P: t1 m% {' \# S% y1 I/ ~基本的智能合约8 x, U& p6 }) ]- v2 ?
由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:" g0 R, i! s; R/ B, I8 U6 R6 [
def Main(num):
6 [3 L& Z; v& w6 R  return num + 1;
5 M+ q# ~  w7 q$ ~1 R/ G如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。
, u* l& D, @! @7 i8 X2 CNeo智能合约在NeoVM(Neo虚拟机)上运行,而且必须首先转换为字节码,这类似于Java,转为字节码后才能部署它们。 neo-python中的build {path}命令可以为我们执行此操作,提供.py文件作为输入参数,然后输出生成的.avm文件。 但是,这个文件本身并没有给我们带来太多好处。 我们将要从这个命令的变形build…test命令开始:8 M' G2 v  N* @
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5! z8 c  u4 {9 M
在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:
0 A# I. |& y' v, Hneo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]9 U$ t, ?; J; l! q7 _8 A- z
文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:
! v; F- |  w  n+ _9 |9 E. ?: QType        Byte( G/ \* o8 r7 U- o
Signature        00) @  L/ r8 Q' \: g- t7 c
Signature        01
* H) l7 b7 Q) I4 d7 `; i0 `5 \Integer        029 t8 z: w+ p' l# p' j
Hash160        03+ |; H, U3 v7 {% B
Hash256        04
) U* a1 ]+ `; S9 WByteArray        05
4 [: y; O) |6 LPublicKey        06
9 v8 R: c/ L1 ~, @9 s2 X0 QString        07
$ ^. x+ Y1 r3 Z% z, MArray        10, J! C! f: Q$ K0 G3 Y+ s: C, y
InteropInterface        F0; }4 X8 y% O; v) V
Void        ff0 o3 ]6 s. X( P0 k0 l- |
在我们的例子中,合约采用integer (整数)(02)并返回一个integer(02)。 接下来的三个参数是在合约上设置的属性,我们现在不会考虑这些。 最后一个参数是填写实际调用合同的时使用的数据。 在neo-python提示符下运行此命令应输出如下内容:
$ ^+ E% J% t; y- \# p8 Mneo> build /smart-contracts/plus_one.py test 02 02 False False False 53 v8 f9 [$ b- y$ G0 y, }
[I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm
3 q) t5 ]3 l" N# a6 z6 @' f[I 180909 22:53:38 Invoke:586] Used 0.021 Gas
( X0 g3 q+ {: J+ A-----------------------------------------------------------( X, `' n4 o0 v2 U# H. \5 w
Calling /smart-contracts/plus_one.py with arguments ['5']9 B* I" Y2 ]  |; M# T: E
Test deploy invoke successful
% i$ K4 @3 |4 ]1 u! K# Q0 D  @Used total of 19 operations/ F5 D, {- D# t
Result [{'type': 'Integer', 'value': 6}]
: R: D4 `; q, r" p$ a3 ?Invoke TX gas cost: 0.0001
8 z# H' x0 l2 I8 V  B8 V3 j- I! Z-------------------------------------------------------------: b4 k! e2 |* D5 b/ {  @+ ^
neo>) @5 X9 g* R* P( b) K
第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了!
$ }4 Y. P7 a) _# p$ p部署智能合约- \. T4 W' d( q$ _/ C2 p1 I
最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。
: i, b( w6 B* c7 ~" gneo> import contract /smart-contracts/plus_one.avm 02 02 False False False$ H7 [4 |& ^# b6 U, m
系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。
/ o% b$ }( O# f+ r9 U- ^% H. C部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):2 }: h- t( B' f1 P: _6 K
testinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 8/ L9 n: S. d& {7 g: A" t# ?
你应该看到预期结果的输出:" `( o- ]' ~; X* n+ q
----------------------------------------------------------------5 O  x+ s& l& g7 G% `  F: ^
Test invoke successful
& q( e3 T+ j; H2 j5 L& {Total operations: 198 K2 a/ d: n4 B# d
Results [{'type': 'Integer', 'value': '9'}]
  C1 X- c5 w+ o  j( ]Invoke TX GAS cost: 0.0
1 P% i4 s: R8 v0 iInvoke TX fee: 0.0001
; W# ]8 Q" S% n! @/ g) }----------------------------------------------------------------, @2 d$ [" ]$ Y
如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    13