Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
将使用neo-local项目为本地开发和测试Neo智能合约设置私有链。 使用私有链可以使我们能够完全控制我们的环境,使我们能够独立工作而不用与外部测试网络打交道。
0 b. B) P7 q# b& c% C为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:
7 a* v! R0 Q/ B" S8 ~9 O$ t0 J: rUbuntu 18.04(最小安装)4GB RAM50GB磁盘
0 Z% }) J7 E$ q

$ e* C2 k- t; o% j, B请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。% R8 r$ u1 \& N. ]* H. L5 q& G: t* F
Docker,Docker Compose和neo-local
7 o: c, y9 y2 JNeo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。4 G. ~8 _; H0 E; X" }
安装Docker. @8 y7 Z/ Q! M) u" v* V3 Q* Q  G
你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:, z& `, N3 |% C! z; j5 o
WindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些), a: ^, {9 q' ~9 k0 P* o3 [2 H
" c: [0 q* V) f1 {- z2 o
安装Docker 组件
3 Q! p3 D8 V/ A! x; u% |我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。
. I3 p4 H1 E/ V2 g+ Z$ m测试Docker7 Q' B' ^7 k; T& o3 a
就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:! E) X) M0 w. c3 p- H, A
$ docker --version4 ^# X0 Y8 @$ s& |6 B! C
Docker version 18.06.0-ce, build 0ffa8259 m" g; e+ x7 ]. v
$ docker-compose --version
) F* M" p# Z8 t* ~3 Bdocker-compose version 1.22.0, build f46880fe
; Q0 V7 a5 o3 h7 z你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。
' b, l: d: A$ F如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:5 B: X9 K" i8 G3 n: u
$ docker run hello-world
6 K, n- j. E. J9 ^! H+ M设置neo-local
& q: H5 F$ d* L& ]最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。# |8 D* \8 |- w8 l. U5 |! K. k6 p) U
在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。% e6 D4 j5 R/ _+ v0 @: t0 R5 I
$ git clone https://github.com/CityOfZion/neo-local.git
; K5 ^: ]# t' n& G0 S$ cd neo-local
" w/ l9 \: r3 z1 x. K: n这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。  ^% q4 M3 D5 N6 C
我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。
9 G1 ^% D: Z& U5 g4 R启用neo-local堆栈
4 F" X! A  |+ B6 v在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。) e* R0 @5 X5 R; R3 X- R  ~7 C
Windows (wiki)
" N8 Z# v- ~9 e  J- y- @3 q2 x  ]$ docker-compose up -d --build --remove-orphans
5 @& A& S5 [- V! n) w. w$ docker exec -it neo-python np-prompt -p -v
# d9 h3 H% z$ I  j! R% SMacOs (wiki) 和 Linux (wiki)$ D$ ~% S7 a% t3 W, L" \5 e( r
安装make命令,如果你还没安装的话:  B  _8 p) ?* b0 f+ z
$ sudo apt install make
7 h- A* i) U8 s' F8 h5 y! g- `# F6 d启用堆栈
% Q6 n2 N0 j7 K8 {: H& t$ make start
5 E) G& C6 a; T1 v3 B4 o打开钱包
6 L6 U5 n1 `  t  ?) [8 K使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:
' P7 C. G2 l/ N: R1 f. n7 z- `$ O3 pneo> open wallet /wallets/neo-privnet.wallet  g+ h" @" z. x" \4 y: r
[password]> ***9 c( v! Z* W5 P  H; H8 w$ i- O5 b  V
Opened wallet at /wallets/neo-privnet.wallet/ G! D5 w8 C5 A3 w2 H( A
neo>* P: @: t9 b/ Z" p2 {2 E# X
基本的智能合约
' e4 T% Q- l5 O/ F- L& B由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:/ t* f4 ?5 n+ {0 _2 O
def Main(num):# F6 l9 E  N7 |$ H2 ^$ u
  return num + 1;6 ?( q" ~6 Y5 a& k) x6 F9 ]
如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。
4 Z1 h( F! L5 L9 `/ Q$ aNeo智能合约在NeoVM(Neo虚拟机)上运行,而且必须首先转换为字节码,这类似于Java,转为字节码后才能部署它们。 neo-python中的build {path}命令可以为我们执行此操作,提供.py文件作为输入参数,然后输出生成的.avm文件。 但是,这个文件本身并没有给我们带来太多好处。 我们将要从这个命令的变形build…test命令开始:
! Y7 w- x0 V" k7 A" d  hneo> build /smart-contracts/plus_one.py test 02 02 False False False 5# R, `# K8 u* f  ^6 o+ M
在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:9 V) R3 d3 b! O
neo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]7 \  q! L: b& x, S
文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:
5 O" ?  K" z+ N. X2 i2 WType        Byte3 k7 g! C/ s' P( m( y
Signature        00
: C' B/ {; x) Y7 nSignature        01
* N# R; T# ~$ [/ h, FInteger        02' h+ t8 y: R" i* T# }
Hash160        03( |% W& {) V2 r) d* i1 m. k6 p
Hash256        04/ t8 w! _5 ?+ T/ J$ P0 Y& d
ByteArray        05
2 w6 [2 p4 {/ n4 D& m2 r5 wPublicKey        06
% n1 w3 J$ h( B! H+ u. ~String        07
% h8 u. q  X! P" Y0 ?; {Array        10
7 C$ {4 Y$ B2 e1 N  DInteropInterface        F0
4 ]5 ?6 s( Y/ {  g2 u+ Y0 P7 v- TVoid        ff# a# g2 d7 x) d1 V. E1 W: K$ ^' e* e
在我们的例子中,合约采用integer (整数)(02)并返回一个integer(02)。 接下来的三个参数是在合约上设置的属性,我们现在不会考虑这些。 最后一个参数是填写实际调用合同的时使用的数据。 在neo-python提示符下运行此命令应输出如下内容:0 u0 e- o! Y/ `+ Q/ V
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5
: R2 J: {, j1 v9 p9 v3 L  Y[I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm
0 |7 m& }0 v7 R[I 180909 22:53:38 Invoke:586] Used 0.021 Gas# [/ F! Z, e" |7 }
-----------------------------------------------------------# E2 |+ U1 B9 R
Calling /smart-contracts/plus_one.py with arguments ['5']- N/ p0 O6 @- U" }" O
Test deploy invoke successful, {2 f! @/ u- H" U9 k
Used total of 19 operations
' X$ e* t3 ~* k1 FResult [{'type': 'Integer', 'value': 6}]
1 [4 g  u" t) a: o" ?, r' }Invoke TX gas cost: 0.0001
; _6 e' D6 D5 G-------------------------------------------------------------
  Z, U* }# j5 Vneo>7 J) N( U( A0 M% |/ C7 y
第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了!
# }: ~1 D! ~- u/ k部署智能合约
% U  R7 s" U* }4 p最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。1 f+ r- [+ ^( t0 ?, B
neo> import contract /smart-contracts/plus_one.avm 02 02 False False False# H/ Z2 y9 l, S; \- H+ Z1 e8 k
系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。; X7 y- W6 M% W5 L
部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):% h. O0 W$ C3 ^+ t; V# M, e
testinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 88 q2 P; |; q7 a, e6 O
你应该看到预期结果的输出:/ \+ \/ T6 Z( ]! R
----------------------------------------------------------------
" {5 ~) n, l& T$ fTest invoke successful2 M: k0 }7 V. V& w: b. k! b
Total operations: 19
9 `; q2 m6 h/ E2 W- NResults [{'type': 'Integer', 'value': '9'}]9 O) T3 L2 P; ?; \; {( u
Invoke TX GAS cost: 0.0
$ P1 s7 o% u$ O- ]Invoke TX fee: 0.0001$ ~7 F6 S1 _% i* i
----------------------------------------------------------------
" B" X& m$ h! f' T% r3 J如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    13