Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
将使用neo-local项目为本地开发和测试Neo智能合约设置私有链。 使用私有链可以使我们能够完全控制我们的环境,使我们能够独立工作而不用与外部测试网络打交道。( q7 |0 G; f" [8 O' {
为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:
5 W7 e: e  N3 Q6 F' oUbuntu 18.04(最小安装)4GB RAM50GB磁盘
7 W# w; Z) w2 k6 ~% U7 x6 ?* w
& T; N% p5 a/ T- t0 A& g/ f. S
请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。; n9 L( u9 ^+ V  y4 R; Z1 v; _, i
Docker,Docker Compose和neo-local
6 @' G7 f/ M, C8 VNeo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。5 ^1 j: \4 W/ M3 q
安装Docker
1 \/ K% F7 d7 @7 x1 E# u你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:& u& s1 N" |) t  J+ k; V
WindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些)
2 s0 O% ~; V0 L6 P/ p' _

& z4 `( L9 Y' l* w* Y7 }安装Docker 组件
; \( w) \8 H- p4 y- b% @" {; r我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。6 v: g' ]6 q0 w
测试Docker' L: z; J8 F5 C( ^) a4 B& `
就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:8 m* R# G& h" U0 Q6 g' T8 J: y* p
$ docker --version
9 C" s  N. z2 K, LDocker version 18.06.0-ce, build 0ffa8257 u8 N+ ?# Z; Z" x+ Q6 L$ p
$ docker-compose --version
3 u" w& X7 W+ ]+ k" c# D4 vdocker-compose version 1.22.0, build f46880fe
, d' ?( f: O: Q你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。% ~) z4 S  t" v& S1 @8 q
如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:4 b  @5 G6 M$ J/ ^# F( ]6 K
$ docker run hello-world5 b; Q* ~9 X5 b  Z
设置neo-local$ k& P  m1 v$ B: T" N2 I+ Q. o
最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。7 E  d( k& y# V- \. L
在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。! K% N5 w4 R, ]& V* l* B! L% M
$ git clone https://github.com/CityOfZion/neo-local.git; n! O: q) w/ V6 [" J0 F) d
$ cd neo-local4 c7 n6 b* I% I% }
这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。
* O5 o3 q$ k, ~8 s  t0 ]5 ^$ G我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。
9 N1 a* e' _  j+ f启用neo-local堆栈
% [: E; v5 s# S" Y2 P在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。+ W4 O# P# M( e4 r5 R
Windows (wiki)1 h7 R; ~( H: w0 P  c
$ docker-compose up -d --build --remove-orphans
( N3 {) a& o; Q3 H' V- G$ docker exec -it neo-python np-prompt -p -v( ]# I4 c6 \& A, g$ X
MacOs (wiki) 和 Linux (wiki)
. ]" _9 `" P( k安装make命令,如果你还没安装的话:, ]; h. D* ?* p$ W+ [8 {$ c' E
$ sudo apt install make' F+ U4 ]% J; t
启用堆栈
( Y6 N9 z7 k: R5 O8 V$ make start4 f: l0 z' b, J
打开钱包
2 N& _' u, i! S  R& ?" ]使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:
' F4 o' ^6 O2 W/ uneo> open wallet /wallets/neo-privnet.wallet- E& C! L7 z4 @
[password]> ***2 K2 k$ U  q' i/ W
Opened wallet at /wallets/neo-privnet.wallet
5 p, E. v( a* q* g) e/ Zneo>1 N. _$ O# A2 v" B" l$ @
基本的智能合约% x" t+ R7 F$ c* {; ^) {  [; Y
由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:8 j, W  X& o* `( w& Z) R1 R6 u
def Main(num):
, n& {8 w. Q' U7 d* A& m) b  return num + 1;. p0 k9 c2 b: F% C4 q& S6 B# x
如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。
: ], \! T. x5 Z3 m4 HNeo智能合约在NeoVM(Neo虚拟机)上运行,而且必须首先转换为字节码,这类似于Java,转为字节码后才能部署它们。 neo-python中的build {path}命令可以为我们执行此操作,提供.py文件作为输入参数,然后输出生成的.avm文件。 但是,这个文件本身并没有给我们带来太多好处。 我们将要从这个命令的变形build…test命令开始:) p5 K6 D+ j, S; ?8 q, p
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5
9 i5 v+ m$ q/ I9 K在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:/ ]# M; ]1 i" w
neo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]) R4 {* b+ Y2 t2 D
文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:
, Y/ W" d% |# o/ s, q+ mType        Byte* G- Q7 G5 o. g
Signature        00/ z8 \6 s4 E. {' g
Signature        01$ w9 L" d) o' F
Integer        02
2 J2 Q& L2 ^9 d& p+ C7 VHash160        033 I0 S  r6 s* [; a( u" U0 B1 z
Hash256        04
2 b  t8 D/ _: y* B" M1 VByteArray        05
, f, H* w/ e: J( P8 \) fPublicKey        06# @$ I/ z5 h, d6 [9 `
String        07* C: E. R  R* ]. e; K9 C2 B
Array        10
5 B% h2 E& j7 M" z. `, W$ ?InteropInterface        F0- @7 V5 s7 t" Z
Void        ff
3 \4 J: A5 I+ e在我们的例子中,合约采用integer (整数)(02)并返回一个integer(02)。 接下来的三个参数是在合约上设置的属性,我们现在不会考虑这些。 最后一个参数是填写实际调用合同的时使用的数据。 在neo-python提示符下运行此命令应输出如下内容:
) p3 Q3 p8 ^- C4 l3 jneo> build /smart-contracts/plus_one.py test 02 02 False False False 5
4 K: R4 A( a9 e3 R+ _0 e  o[I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm( e  U: R1 P: ]2 J
[I 180909 22:53:38 Invoke:586] Used 0.021 Gas1 s3 M! y; a4 H" S
-----------------------------------------------------------
- q1 N1 F0 r- W/ O$ Y/ _Calling /smart-contracts/plus_one.py with arguments ['5']1 ]# ]5 W; k1 M- f3 u* i
Test deploy invoke successful
* l* }% B+ U1 Z/ n; NUsed total of 19 operations
  K. F$ F4 g, G4 d+ NResult [{'type': 'Integer', 'value': 6}]
! B# z/ b" y# A2 u6 dInvoke TX gas cost: 0.0001% Y8 Y& F: J! r" g
-------------------------------------------------------------
$ _( J/ Y/ h+ M( Gneo>1 |& Y) G5 p2 Z: Y9 l% @
第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了!
, x/ `, x" t0 V# [4 V部署智能合约3 z: }9 b- Q& A5 ?3 p4 F
最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。3 l% Z3 e  d: V
neo> import contract /smart-contracts/plus_one.avm 02 02 False False False5 D- x% w& k) L: S
系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。
1 B' X1 ?$ i+ n部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):# p; n6 [9 ^6 y' A' L3 h5 r
testinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 8. e6 Y; x/ {" n* d0 X
你应该看到预期结果的输出:
/ S; d. ]0 z5 ]* `1 j$ j----------------------------------------------------------------
4 y& _& t6 m+ |# HTest invoke successful3 C( R' j- J0 O& O
Total operations: 19, ]5 q% c' I) ^' Q" j
Results [{'type': 'Integer', 'value': '9'}]
! u. Z3 A5 r4 Z/ g% ^Invoke TX GAS cost: 0.0! g* B, x( L  s+ Q5 Z4 K
Invoke TX fee: 0.0001
- N* G  u# U# k/ Z0 t/ Q- U) U$ M----------------------------------------------------------------3 m1 {% \/ j) `4 h. j8 E) o
如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    13