Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
将使用neo-local项目为本地开发和测试Neo智能合约设置私有链。 使用私有链可以使我们能够完全控制我们的环境,使我们能够独立工作而不用与外部测试网络打交道。$ d5 S& `) m, ?# C) r; K4 E& _
为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:
1 f! K  I6 @$ v: s& g' i/ |) ?0 d9 ~, fUbuntu 18.04(最小安装)4GB RAM50GB磁盘, d1 |# L$ N& q4 d5 l$ T
$ ~& G9 G* T) x) C  a
请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。3 K: y3 v- U6 [, I7 W
Docker,Docker Compose和neo-local
+ X$ t, ]+ r: [* f! rNeo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。
1 `2 F# ~+ d/ M: Y& R% n# @! I安装Docker
6 v: `$ b) [; I9 S你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:
* D1 @5 |) k0 @7 O; k9 f* AWindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些)
6 D0 g$ P1 P" f3 M9 E/ |5 i. |
: i  G. J: N( ^! M3 p0 e& g
安装Docker 组件
2 L  q0 ^2 H: D" K( g) L" ~" z9 ]4 E& j我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。
4 y, f$ Q' i8 Q$ w测试Docker. [/ {6 K) ^6 Z/ q* I
就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:4 W: X( U: o% C. B
$ docker --version7 U' c7 b- u+ n5 n$ \# ?
Docker version 18.06.0-ce, build 0ffa825
) E4 V& e- b. P$ J; Y# p7 z$ docker-compose --version
# h; [( \: [6 n( j1 Q. vdocker-compose version 1.22.0, build f46880fe) q( G' o0 L  k) ]. w
你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。
4 U& A1 N+ E/ J( ~7 t# `如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:4 }* q8 {" g3 a+ i/ V' `$ n
$ docker run hello-world4 f) ~- u& P( M0 K
设置neo-local3 [4 q- s0 ^: Y# Q! H7 U6 z
最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。6 `0 ?+ b. d, e  }. e* p
在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。
5 m. |9 u0 `5 Q7 @8 n, \; F+ S$ git clone https://github.com/CityOfZion/neo-local.git
# B8 X- n5 u: u8 x1 d$ cd neo-local2 S; L$ A: u) t# E  D- g
这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。
  M: H% E, `! w- H$ U我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。' Y6 O) s+ A; l/ L  c7 e
启用neo-local堆栈
+ v' i! x7 I5 [7 A( T7 P3 j在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。
7 ~" [& |1 L/ s. pWindows (wiki)
9 E2 Y$ A, f6 y6 |4 j$ docker-compose up -d --build --remove-orphans
! }; r' h/ k/ M7 b$ docker exec -it neo-python np-prompt -p -v0 V' V/ z7 F" c' E# Y' Z3 B* E
MacOs (wiki) 和 Linux (wiki)
$ K9 Q: ~  }( {" T' I1 h安装make命令,如果你还没安装的话:: c- }4 N+ w* u$ r4 k
$ sudo apt install make
8 [7 i8 W+ q: _3 S+ ^" O启用堆栈
! u) Q( X; F* I/ m1 q- Q$ make start- B3 @' C0 V* A8 a) N& i* z" r
打开钱包
5 w' ?7 x/ J) L7 a. c使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:
. g% {/ F% r1 J  e8 @% eneo> open wallet /wallets/neo-privnet.wallet, Q. F8 N4 P# P5 e/ h5 v3 C, }
[password]> ***/ f8 P! M" \4 O
Opened wallet at /wallets/neo-privnet.wallet
( l1 o8 N- y: D7 Z8 N! ineo>7 O5 ^# b1 j! c2 j8 d. I- a
基本的智能合约3 E( ^3 |( z; R& a5 j9 \
由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:9 y3 Q" T4 l; a2 ~: D
def Main(num):
! T, v- ~# z# d* W' x. N3 W* n  return num + 1;# _2 D' R2 E+ `2 b5 G
如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。
8 M' f" @6 h2 I8 o0 s8 Y7 Z' CNeo智能合约在NeoVM(Neo虚拟机)上运行,而且必须首先转换为字节码,这类似于Java,转为字节码后才能部署它们。 neo-python中的build {path}命令可以为我们执行此操作,提供.py文件作为输入参数,然后输出生成的.avm文件。 但是,这个文件本身并没有给我们带来太多好处。 我们将要从这个命令的变形build…test命令开始:" }4 F4 r6 G$ w5 S
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5
3 z% E+ w( C# u! F& ^7 Z7 s2 i在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:
+ W9 Z# S$ [" @+ E0 z7 \neo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]" u5 R" g7 Y" [( M
文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:
8 d( @$ C, v6 o; nType        Byte
# {; k# e( M  ^' q7 W' iSignature        00  ~4 b) a+ o5 l5 b. Z, ]
Signature        01* {. m4 z& L% w. y3 F
Integer        028 k7 C! P/ G3 Y6 Z) ~5 h( T
Hash160        03. B% _$ y/ y- Q. p! k
Hash256        04
, l/ K4 K2 `* g' }8 z' ]2 jByteArray        05
4 R; s- x: X; N' R# g3 S+ ZPublicKey        06
1 p) o2 B- o7 F, p2 |) XString        07
' U* Q6 r& s5 VArray        10
& m( \0 @7 T0 X' E' ?9 I, fInteropInterface        F0( W2 k+ j# w/ S; X" B& I7 j
Void        ff  y( Z0 \4 b( [6 P- E( E0 ]
在我们的例子中,合约采用integer (整数)(02)并返回一个integer(02)。 接下来的三个参数是在合约上设置的属性,我们现在不会考虑这些。 最后一个参数是填写实际调用合同的时使用的数据。 在neo-python提示符下运行此命令应输出如下内容:! `- V/ D) y3 x# P, T0 d* W
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5% N: F; b( Q5 g( ?
[I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm
8 _% R) o' i9 S" T! y[I 180909 22:53:38 Invoke:586] Used 0.021 Gas
. p9 j+ n, s/ l# }; m, P" e9 t-----------------------------------------------------------
! N+ f( p( a6 y/ p" X+ \5 QCalling /smart-contracts/plus_one.py with arguments ['5']+ q. Z0 [; {6 u6 |$ Z
Test deploy invoke successful/ N2 S9 ~2 a% p# h
Used total of 19 operations
$ m- j9 X8 p# ~: QResult [{'type': 'Integer', 'value': 6}]0 J" G$ Y) d- a) o4 _% N
Invoke TX gas cost: 0.0001' Z1 X3 _, C- F+ p# U! M
-------------------------------------------------------------
+ l' n  \) P. f1 yneo>
$ U) E3 o6 r7 w: ]- f第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了!1 B* V' i& O: s8 A1 `4 n1 O
部署智能合约
8 ^( S" N; f6 e( `' P; I0 W5 W最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。1 g: k( J3 D+ w* {5 ^
neo> import contract /smart-contracts/plus_one.avm 02 02 False False False
( |( }5 x% {2 O! m7 T系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。
, p. k8 k+ b% o) b部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):$ a  n8 f1 U/ b) x* t7 D
testinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 8
- u) r; E2 h- K4 J8 f, T3 X你应该看到预期结果的输出:5 U$ `' r) ?2 Z- c" S
----------------------------------------------------------------% v8 i4 s, c1 T* H  _* H' ^, S
Test invoke successful
( s- G4 F5 ~; M+ H4 v% I1 j' NTotal operations: 19
% F8 t' b6 q  y2 B2 y) Q+ u# _Results [{'type': 'Integer', 'value': '9'}]8 S0 `5 H- n2 ^/ m( c4 G
Invoke TX GAS cost: 0.0* C( R/ _/ m- q" X
Invoke TX fee: 0.0001
  B3 z; D& w" ?, T7 v0 }* v----------------------------------------------------------------
* Q# u; V; s$ ?: x/ G9 {8 @如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    13