Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
将使用neo-local项目为本地开发和测试Neo智能合约设置私有链。 使用私有链可以使我们能够完全控制我们的环境,使我们能够独立工作而不用与外部测试网络打交道。/ p  ^# j) i9 l/ O* z+ n, J8 {& Z# _' C
为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:8 a6 u- Q8 L8 q) _+ g6 f! S# F
Ubuntu 18.04(最小安装)4GB RAM50GB磁盘. ^! J" i+ x( V! `

) O! \. M2 P) ?! I0 p8 o3 o. s请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。
; k7 X" |9 l3 u' oDocker,Docker Compose和neo-local8 K+ {) o0 O- x$ t  J6 p, y$ v/ O! t
Neo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。! t& f& r7 P% q% O; f/ R
安装Docker( r  @) n2 y8 N5 t) l  B+ u/ `
你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:5 u& Z8 X! W1 K9 v$ T& P7 v
WindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些)& z9 e' _( O2 i
0 [2 P2 W) A2 s4 j
安装Docker 组件  F3 b' I3 [1 h8 B
我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。
# f  V9 ^" @- E测试Docker/ b0 Q' O0 v! m( ^% d0 a- x
就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:
8 F$ ?6 P, _" w" g$ docker --version
% L1 c; l  S3 E! p1 eDocker version 18.06.0-ce, build 0ffa825( T+ J. `+ L6 x5 }/ O+ b! `
$ docker-compose --version1 M4 P  X. Y: `9 }# z
docker-compose version 1.22.0, build f46880fe
% o" U8 R, G) u& L" D你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。
. H! R0 m- [' l5 b8 v  g. [如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:7 ^/ {7 n6 Q6 g/ }; S
$ docker run hello-world
( k7 S1 q6 a# ~4 Q# ~" y设置neo-local
, b2 N! R& U6 z6 h% A+ j6 F最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。! T/ G% ?( r/ E6 c
在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。0 n/ W( z- z, _5 D+ C
$ git clone https://github.com/CityOfZion/neo-local.git2 l: `) X! p/ Q
$ cd neo-local( u6 K% q, f7 s" b' A  @% Q! f
这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。# y$ |6 O% D2 O
我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。
; z* L4 J: p9 ]* @  X; q" N启用neo-local堆栈
; M; O. w) N3 |* o, H6 ^) ^# B在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。
) ?0 `+ p0 g7 c& o9 ^8 v* n8 Q% aWindows (wiki)
* P% N6 o( a9 n0 J0 C$ docker-compose up -d --build --remove-orphans- d/ `! g/ s: h( ?
$ docker exec -it neo-python np-prompt -p -v
  A6 r) j5 X( k" r! K; kMacOs (wiki) 和 Linux (wiki)
0 o' d0 y( ]1 n* J4 D0 ^安装make命令,如果你还没安装的话:/ J6 t4 [2 }; p$ r
$ sudo apt install make$ o* p8 K: s# F0 G% U6 S6 {: m
启用堆栈
* C5 f, X9 t# n- Z8 O0 o$ make start, t( s: G0 W' ?# ?% W
打开钱包
% I: Q7 A9 O/ a使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:
0 a( }! W+ b9 f3 D- n( v* ~neo> open wallet /wallets/neo-privnet.wallet7 ^: p  V9 t- Y: B; b1 ~( g
[password]> ***9 b- N: R: o5 `/ |+ {
Opened wallet at /wallets/neo-privnet.wallet9 t8 I( z) W! D, h6 Z& [' l
neo>
+ \+ c9 U: V4 u基本的智能合约
3 B" T3 N( ~2 l8 @由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:
" }2 u, q- y+ a0 T8 p+ Wdef Main(num):. @1 T# B/ {# W& ^4 G4 w% e
  return num + 1;
% C* K0 k4 I6 V; ^( [* S) }如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。0 F! w5 p" y+ e) r
Neo智能合约在NeoVM(Neo虚拟机)上运行,而且必须首先转换为字节码,这类似于Java,转为字节码后才能部署它们。 neo-python中的build {path}命令可以为我们执行此操作,提供.py文件作为输入参数,然后输出生成的.avm文件。 但是,这个文件本身并没有给我们带来太多好处。 我们将要从这个命令的变形build…test命令开始:% z# [1 f0 \1 s& ]
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5
6 C; N- _* C/ V, ]) n在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:9 C  `$ ]" b6 W- k
neo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]
9 M9 A: _" |. h3 _3 v. r4 P6 {' m文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:
8 ^; B  Q, }$ y+ F  H5 OType        Byte
1 X* u" U0 Z, x- K0 ]# u# g; lSignature        00# B) F4 j" ~. T/ E) T3 N6 T6 _
Signature        01
) I0 Y2 p, v* V. V- [- n! L" [# mInteger        02
# C, m" t! h, t' |Hash160        03
- U' n6 [! l: I4 \8 M, yHash256        04
& q* R7 C1 ]& d% _  F# \ByteArray        05
/ q9 W7 T* {# v5 W; `5 I; Y6 qPublicKey        06: g$ ^0 k- Q6 [
String        07
7 ?- o* T6 t6 [$ o' KArray        10
& ^. O' f, K* c; M5 FInteropInterface        F0
; H8 |' B" E8 x' C1 O9 t: N- XVoid        ff4 n( X) C$ l5 k& M! ]$ A0 t5 Y
在我们的例子中,合约采用integer (整数)(02)并返回一个integer(02)。 接下来的三个参数是在合约上设置的属性,我们现在不会考虑这些。 最后一个参数是填写实际调用合同的时使用的数据。 在neo-python提示符下运行此命令应输出如下内容:
: c3 J, K8 W) \; b" [7 n5 dneo> build /smart-contracts/plus_one.py test 02 02 False False False 5
( N2 Q/ @9 @: N& o7 \% B+ h[I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm
0 W  @! H* @& o[I 180909 22:53:38 Invoke:586] Used 0.021 Gas
. E" Q1 b: Q- y; a/ Y6 \+ w-----------------------------------------------------------2 X2 _- M" c. J$ P1 T0 b- E$ J# \
Calling /smart-contracts/plus_one.py with arguments ['5']
. {9 \. `+ S4 G6 e: m: dTest deploy invoke successful
# c3 }' D1 ]& B3 i+ g, K7 XUsed total of 19 operations, i3 @. }* m6 y$ ^: f2 d4 U
Result [{'type': 'Integer', 'value': 6}]( l% }0 ^9 ?* s5 v% p) Q
Invoke TX gas cost: 0.0001
+ e0 x4 Q" d$ d- p$ w4 f-------------------------------------------------------------+ m  R. U8 W- F5 R7 h- |3 \! L* W
neo>
9 ?, {% J* o6 b8 j3 O; ~第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了!7 y4 R* O$ \7 k& L- B5 i( w3 a- x
部署智能合约# T' R# h3 M  |" e3 `- A6 {
最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。+ I! V$ k, \+ g1 w
neo> import contract /smart-contracts/plus_one.avm 02 02 False False False
6 {) }3 O# t. w4 V9 U$ ?系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。
2 h4 r! w3 _- E: F% D; z' Z部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):
  l. f9 `1 e1 N; P6 \testinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 8: d% ?2 D: `. \- }+ l
你应该看到预期结果的输出:
( e0 T0 F6 M+ l. E# Q; e5 m----------------------------------------------------------------( y1 V5 o, m+ w3 w# s) G
Test invoke successful
$ s2 G; o6 X/ H; b  k1 LTotal operations: 194 N& A0 n/ c9 i) j2 t. u+ N
Results [{'type': 'Integer', 'value': '9'}]! u0 O7 G: a+ K) _& A$ H9 H+ m( e
Invoke TX GAS cost: 0.0
; A( m* O1 _: V* lInvoke TX fee: 0.0001
) Z& T) ]& B; w6 P) J----------------------------------------------------------------) H' {& E4 J; H& e  i# P8 u
如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    13