利用Python在本地开发Neo智能合约
温室小书生室d
发表于 2022-12-5 09:16:41
153
0
0
为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:8 i; Y+ H, [% q: _( { w
Ubuntu 18.04(最小安装)4GB RAM50GB磁盘0 w, ~# V0 s6 ~6 H! X" g0 f
7 t4 g j* B' k- U( E/ ^8 X% |3 i
请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。3 x9 H2 K0 {$ o: _4 T5 u
Docker,Docker Compose和neo-local3 Y ^4 |, w6 B$ Y
Neo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。% {3 a/ s5 F2 b* G) V( L( }
安装Docker, ^7 s2 C& g6 P
你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:' i, R1 `) K5 v* s v' v G
WindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些)
安装Docker 组件6 o0 G: S: p" I" f+ M: b
我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。9 g6 d+ b: |! q+ m0 L% y0 O
测试Docker1 R, L5 h# F5 ~ Y* y
就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:
$ docker --version
Docker version 18.06.0-ce, build 0ffa825+ ?) x; Z9 m2 J7 i1 O
$ docker-compose --version
docker-compose version 1.22.0, build f46880fe
你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。
如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:
$ docker run hello-world; B4 o& I7 e$ \- c
设置neo-local
最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。5 J4 F' H; {0 |! G" Z
在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。2 }* @8 z, l* j* ]# t2 D
$ git clone https://github.com/CityOfZion/neo-local.git
$ cd neo-local
这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。! _6 o! R7 h2 {7 V
我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。
启用neo-local堆栈
在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。8 G; n* M, Q. F# L6 J1 I
Windows (wiki)
$ docker-compose up -d --build --remove-orphans, e; `$ T* t/ W8 F/ A" y& c
$ docker exec -it neo-python np-prompt -p -v! i& `4 ~( o" r; h- _. r
MacOs (wiki) 和 Linux (wiki): \& V6 D" ]9 v! h
安装make命令,如果你还没安装的话:. k3 {8 d8 V$ O8 V4 A$ t1 z1 E. l
$ sudo apt install make
启用堆栈
$ make start7 e3 m9 b) o& A( ~9 I
打开钱包
使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:. {3 h0 G5 v! C3 z. E
neo> open wallet /wallets/neo-privnet.wallet S; G+ ? r2 e" U/ P4 k
[password]> ***+ |7 i* t7 T$ c; ?1 v8 q# M
Opened wallet at /wallets/neo-privnet.wallet E/ b. H; |7 j5 J' p
neo>( z! t% t5 C4 {: ~) `
基本的智能合约+ ~- X1 n+ T" S3 R
由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:
def Main(num):. y; q3 u; b8 r+ O8 o* H7 W: N
return num + 1;
如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。. w" r- v% f/ l0 I
Neo智能合约在NeoVM(Neo虚拟机)上运行,而且必须首先转换为字节码,这类似于Java,转为字节码后才能部署它们。 neo-python中的build {path}命令可以为我们执行此操作,提供.py文件作为输入参数,然后输出生成的.avm文件。 但是,这个文件本身并没有给我们带来太多好处。 我们将要从这个命令的变形build…test命令开始:
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5
在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:" @) l. j5 v1 w% T6 y, s0 [) Z7 t" U
neo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]7 W: S! ~# _0 p
文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:
Type Byte
Signature 003 }* `" q X7 g/ @, |$ k
Signature 01/ m' r, H3 g, A! L" f% Z2 L( l
Integer 02+ Z* D" ^/ b5 O. y' j3 z
Hash160 03( g$ Q# v" d% Z0 L; m
Hash256 04
ByteArray 056 H% D7 V! X* g9 q6 k
PublicKey 06$ U. k% Z% o: r/ |0 k7 ?
String 07
Array 10
InteropInterface F0
Void ff
在我们的例子中,合约采用integer (整数)(02)并返回一个integer(02)。 接下来的三个参数是在合约上设置的属性,我们现在不会考虑这些。 最后一个参数是填写实际调用合同的时使用的数据。 在neo-python提示符下运行此命令应输出如下内容:
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5 x9 a' } K' k2 Z
[I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm
[I 180909 22:53:38 Invoke:586] Used 0.021 Gas
-----------------------------------------------------------9 h1 f' ?( T6 U1 s* D+ A& I9 b: }* P
Calling /smart-contracts/plus_one.py with arguments ['5']& b6 Q; V* B0 Y2 v, i R; c1 Q! G
Test deploy invoke successful
Used total of 19 operations
Result [{'type': 'Integer', 'value': 6}]
Invoke TX gas cost: 0.0001
-------------------------------------------------------------
neo>/ k5 R* E7 K7 r! P9 Y
第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了! A* P& H" E+ T, D0 @" @/ G+ \% k" P6 g
部署智能合约
最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。
neo> import contract /smart-contracts/plus_one.avm 02 02 False False False
系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。7 _- f1 ?$ [* X9 l2 K! h/ ?
部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):" M) h6 [$ n3 l9 a7 m
testinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 8
你应该看到预期结果的输出:7 u# A* s E" \7 I( K) K
----------------------------------------------------------------7 X( f0 R! {; W
Test invoke successful
Total operations: 19
Results [{'type': 'Integer', 'value': '9'}]) \* S- C$ {6 f$ j8 |! m' M
Invoke TX GAS cost: 0.0! r: b: U# f( w# @& h% p
Invoke TX fee: 0.0001
----------------------------------------------------------------
如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
成为第一个吐槽的人