Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
将使用neo-local项目为本地开发和测试Neo智能合约设置私有链。 使用私有链可以使我们能够完全控制我们的环境,使我们能够独立工作而不用与外部测试网络打交道。
, e2 }, R- D# s9 }为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:3 u' i3 A- b8 t* u' d+ A8 h3 ^
Ubuntu 18.04(最小安装)4GB RAM50GB磁盘
9 G/ u8 F+ n$ D! t' ?; _, I4 V
. J1 m( R- @1 F4 g/ X: p6 p; r
请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。, y7 G; p, T1 e! c& h% j
Docker,Docker Compose和neo-local
5 j: q2 L' \0 U' T- RNeo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。* M5 T8 R5 a$ ]6 t( C
安装Docker
6 c! N2 V3 S8 E- `# O8 a  x你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:
5 P% }  `! c! y# f% IWindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些)
( O1 ?; ]2 z& D6 s$ V6 A8 `

0 c: O0 v. \+ {! I1 Q' E4 s安装Docker 组件
) u3 c3 x8 G$ t6 U0 w% @* e我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。# G' l; L5 a* a
测试Docker
6 U* R$ `: N8 F* k9 k; w' u7 ]就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:2 z$ v- s6 u$ Y3 y( c2 R
$ docker --version
& C) _- W' o5 X, N' u& ]+ EDocker version 18.06.0-ce, build 0ffa825
' a% n, [4 z  s2 Z$ docker-compose --version* n$ y! c) i+ Y7 C
docker-compose version 1.22.0, build f46880fe
. Z" K+ K/ O* J" h3 e6 b' J: @你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。
' [9 T# \: L" O! E* g; x( g8 p4 B7 o如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:
' ?; B( v4 g4 t- I, `& o; X" t8 s9 l" V$ docker run hello-world' }5 ?; c, \4 J0 M9 e* e$ ~
设置neo-local
. V8 F/ T+ `5 [/ U0 l最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。
2 S! \* E1 R* R, s: O8 v! ^在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。2 y1 r+ k+ G* q, M
$ git clone https://github.com/CityOfZion/neo-local.git& l4 P. Z$ j! A( m9 Y
$ cd neo-local- M; J3 i! i/ x$ e7 i% p
这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。# b3 J- F2 t. J: n' j
我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。
* B  s5 E: K1 A0 T, Z启用neo-local堆栈6 q# M0 ]4 g* l7 Y' r3 [* t
在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。* F. l/ |4 p" \4 w2 v3 P% K; K
Windows (wiki)4 j, F, O! O- R3 ^
$ docker-compose up -d --build --remove-orphans1 S6 i( N  z; k! ]9 a8 ?* @0 w
$ docker exec -it neo-python np-prompt -p -v5 E# d& P0 M( ^, s) D( ^
MacOs (wiki) 和 Linux (wiki)3 [+ R6 t% |& ]# T4 Q. ?
安装make命令,如果你还没安装的话:0 }3 {9 P* O& ~4 I. w7 k
$ sudo apt install make
  c/ k) P" E: o9 i启用堆栈
  d0 C' L  {, S; j/ X& |$ make start
, t- q, y  {: J) L3 H打开钱包
* O) h7 Q) Z2 W使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:$ Z2 q, A. o7 |3 T
neo> open wallet /wallets/neo-privnet.wallet* g7 d% B" y7 w% _( H" Z- B
[password]> ***
2 @+ v: k4 f4 @/ r; l. Y- o: uOpened wallet at /wallets/neo-privnet.wallet
* O* A, ]+ }- h1 |7 f' O# jneo>
2 A0 c! Y0 x: ^5 R/ h基本的智能合约
" r, ?7 C5 ~+ J% e' v由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:
; ~0 C/ Q3 B- q% U, jdef Main(num):
5 \# P! x. m* O! v$ G  W/ |  return num + 1;
9 ?2 h6 U$ X8 j5 c4 Q5 y如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。" K2 g' Z' x5 x* g! D$ s* F* w
Neo智能合约在NeoVM(Neo虚拟机)上运行,而且必须首先转换为字节码,这类似于Java,转为字节码后才能部署它们。 neo-python中的build {path}命令可以为我们执行此操作,提供.py文件作为输入参数,然后输出生成的.avm文件。 但是,这个文件本身并没有给我们带来太多好处。 我们将要从这个命令的变形build…test命令开始:/ B0 S3 r% x0 v/ J! [
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5
) H8 {; e8 L8 j2 I在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:
2 m2 `1 i7 F& k" Z! Zneo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]* ?: [9 }; Q) h8 z1 p
文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:
% l/ [4 [$ J# L8 R8 Y  R5 SType        Byte# q9 ?! w( A8 J8 c% y
Signature        00
8 p' u( J" `6 [1 {) _, t2 C7 oSignature        019 A$ F+ H3 ?/ k9 v
Integer        022 n7 I5 y4 j2 h! ^1 d: `
Hash160        03
2 l. p8 A5 K! |0 o$ j3 b7 Y6 SHash256        04
9 ~% |6 y: O: G; b- F# }5 }4 IByteArray        05
( i$ n2 J; L7 o1 M1 x" v, U0 ?PublicKey        068 g! [# D2 O$ ^0 {' h
String        07
8 E0 i  F5 {3 B* ]/ d4 O( m  YArray        10/ Y$ m. [3 Y  m, s6 Z
InteropInterface        F0! P1 {5 V- V' N( l
Void        ff
+ E; ~( o4 u9 x% V5 K在我们的例子中,合约采用integer (整数)(02)并返回一个integer(02)。 接下来的三个参数是在合约上设置的属性,我们现在不会考虑这些。 最后一个参数是填写实际调用合同的时使用的数据。 在neo-python提示符下运行此命令应输出如下内容:- m( M% b8 w1 `0 g6 Y  I9 K9 |
neo> build /smart-contracts/plus_one.py test 02 02 False False False 59 _8 j. v# [) S4 t0 V4 N- ?7 h
[I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm/ R) ?8 |+ g% |; E8 k0 M: k; t. m7 a
[I 180909 22:53:38 Invoke:586] Used 0.021 Gas
5 d9 [7 @4 D. F* N-----------------------------------------------------------
! s3 G2 L6 G6 n7 \( i- }0 k5 VCalling /smart-contracts/plus_one.py with arguments ['5']# U5 P2 q  B3 z( f* Z
Test deploy invoke successful
3 D% `7 ]' X- T0 B6 l& v( f( E5 OUsed total of 19 operations
/ d8 B% Q$ S0 s8 UResult [{'type': 'Integer', 'value': 6}]
. t5 h- {) c, ]7 `+ g7 ]* [4 KInvoke TX gas cost: 0.0001/ Z8 T  v( K: |  U! V4 R' ^8 \
-------------------------------------------------------------% F: \  i, `) @4 O8 n
neo>4 Z4 z! F& S) C. R
第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了!
5 B& M3 b2 {0 k; v3 w部署智能合约
7 m' [' v% M4 B; G最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。
7 {) _+ o& b, S8 p+ fneo> import contract /smart-contracts/plus_one.avm 02 02 False False False, U( u' ?& a6 ^' f, v
系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。# c! R; T7 _. `2 y- W7 ?8 [
部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):4 a8 j  K. c! l+ S/ h5 x
testinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 87 i6 }4 a+ ]) z. s! D
你应该看到预期结果的输出:6 V/ v0 A/ Y- L: g
----------------------------------------------------------------. A1 d* L+ m$ x$ B0 f
Test invoke successful7 d4 x6 ^7 C# ~. ~& M( |& m8 p
Total operations: 19: s9 y7 F' x  r. ^- o8 N
Results [{'type': 'Integer', 'value': '9'}], h+ \% k! x8 q1 m( }0 S! _* w
Invoke TX GAS cost: 0.0: ]- P1 F# F8 ~) |  R
Invoke TX fee: 0.0001
/ U& C; O/ E5 p7 e, K$ O----------------------------------------------------------------& O7 W' E$ S+ L0 t8 B* {3 S
如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    13