利用Python在本地开发Neo智能合约
温室小书生室d
post on 2022-12-5 09:16:41
23
0
0
为了更好地理解文档的内容,你需要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操作,并使用nano进行文本编辑:
Ubuntu 18.04(最小安装)4GB RAM50GB磁盘
请注意,你可能需要至少20GB的磁盘空间来存储你的私有链。
Docker,Docker Compose和neo-local
Neo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。 Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。
安装Docker
你可以在Docker文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:
WindowsMacOSUbuntu (Linux的安装后步骤-也看看这些内容遵循这些)
安装Docker 组件
我们还需要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户需要按照文档的组件安装部分进行操作。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。
测试Docker
就像快速测试一样,你现在应该能够运行下面的这些命令(以’$’开头的行)并查看相应的输出:
$ docker --version
Docker version 18.06.0-ce, build 0ffa825
$ docker-compose --version
docker-compose version 1.22.0, build f46880fe
你的版本号可能与我的版本号不完全匹配,只要保证运行的是最新版本,就可以了。
如果安装后的步骤有效,Linux用户也应该能够在没有sudo权限的情况下运行’hello-world’ docker容器。 请注意,如果你收到某种“拒绝权限”错误,则可能需要重新启动计算机:
$ docker run hello-world
设置neo-local
最后,我们需要通过克隆仓库代码并安装预配置的钱包文件来设置neo-local,以便我们可以在我们的私人网络上使用GAS。
在终端中,导航到与NEO存储相关的文件目录下,然后克隆仓库。 对于那些不熟悉git的人来说,这个操作将创建一个名为“neo-local”的目录,里面包含有我们需要的文件。 导航到neo-local目录。
$ git clone https://github.com/CityOfZion/neo-local.git
$ cd neo-local
这里的大多数文件都与neo-local项目本身有关,我们不用对它们进行任何修改。 我们只会在设置过程中处理wallets/目录。 一旦我们启动并运行,我们的大多数文件都将保存在smart-contracts /目录中。
我们将使用的钱包文件不太容易找到。 你可以在Docker NEO私有链中心页面上找到它,或者只是点击这个链接中获取它。 将下载好的钱包文件放在neo-local项目仓库的wallets /目录中。 作为参考,这个钱包的密码是coz。
启用neo-local堆栈
在不同的操作系统之间启动堆栈的方法略有不同。 这两组命令都会让你进入neo-python命令行界面(CLI)。
Windows (wiki)
$ docker-compose up -d --build --remove-orphans
$ docker exec -it neo-python np-prompt -p -v
MacOs (wiki) 和 Linux (wiki)
安装make命令,如果你还没安装的话:
$ sudo apt install make
启用堆栈
$ make start
打开钱包
使用智能合约之前的最后一个设置步骤是打开我们之前复制的钱包。 Docker设置在根目录下挂载wallets /目录,因此我们的钱包位于/wallets/neo-privnet.wallet路径下。 neo-python中的help命令将显示所有可能的命令列表。 我们正在查找的命令是open wallet {path},输入这个命令后会提示你输入钱包的密码(coz)。 整个过程应该如下所示:
neo> open wallet /wallets/neo-privnet.wallet
[password]> ***
Opened wallet at /wallets/neo-privnet.wallet
neo>
基本的智能合约
由于neo-local堆栈使用neo-python,我们将使用Python语言编写一个基本的智能合约。 在smart-contracts /目录中创建文件plus_one.py并添加以下代码:
def Main(num):
return num + 1;
如你所见,合约接受一个数字作为输入并返回该数字加1后的值。 就像wallets /目录一样,smart-contracts /也挂载在根目录上,因此合约的路径是/smart-contracts/plus_one.py。
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
在我们获取输出文件之前将这个命令拆开来看看。 命令的完整签名是:
neo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]
文件的路径是相当不言自明的。 但是,类型是按照 ContractParameterType页面中的形式提供的,其中参数和返回类型均表示为单个字节:
Type Byte
Signature 00
Signature 01
Integer 02
Hash160 03
Hash256 04
ByteArray 05
PublicKey 06
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
[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
-----------------------------------------------------------
Calling /smart-contracts/plus_one.py with arguments ['5']
Test deploy invoke successful
Used total of 19 operations
Result [{'type': 'Integer', 'value': 6}]
Invoke TX gas cost: 0.0001
-------------------------------------------------------------
neo>
第一个输出行是确认字节码是否已构建完成以及它所保存的位置。 输出的其余部分描述了合约的设置和结果。 我们用值“5”调用它,调用成功了,我们收到返回结果是整数’6’。 看起来我们的合约生效了!
部署智能合约
最后,一旦我们构建并测试了我们的智能合约,我们就需要将其部署到网络中。 这实际上是一个相当简单的过程,我们只需要使用import contract命令。
neo> import contract /smart-contracts/plus_one.avm 02 02 False False False
系统将提示你填写一些字段,例如合同名称和版本,作者姓名和电子邮件等。填写完成后,将打印输出一些有关合同的元数据信息,同时系统将提示你输入钱包密码。 输入密码后将开始部署合同并向你收取必要数量的GAS。 由于这是一个私人网络,你应该可以继续部署 – 测试钱包种有很多可以使用的GAS。
部署完成后,从打印的元数据中获取“哈希”并运行testinvoke命令(替换为你自己的合约哈希):
testinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 8
你应该看到预期结果的输出:
----------------------------------------------------------------
Test invoke successful
Total operations: 19
Results [{'type': 'Integer', 'value': '9'}]
Invoke TX GAS cost: 0.0
Invoke TX fee: 0.0001
----------------------------------------------------------------
如果你收到消息提示说找不到合约,那么你可能需要等待一两分钟,等你的合约能被一个区块挖矿后才能调用它。 再次提醒,这将是一个本地调用,并且输入你的密码可以在网络上运行真实的合约,这个过程中向你收取GAS费用。
BitMere.com is Information release platform,just provides information storage space services.
The opinions expressed are solely those of the author,Does not constitute advice, please treat with caution.
The opinions expressed are solely those of the author,Does not constitute advice, please treat with caution.
Write the first review