利用Python在本地开发Neo智能合约


在本教程中,咱们将使用neo-local项目为本地开发和测试Neo智能合约设置私有链。 使用私有链可使咱们可以彻底控制咱们的环境,使咱们可以独立工做而不用与外部测试网络打交道。html

为了更好地理解文档的内容,你须要使用类Unix的终端和某种文本编辑器。 本文我将在虚拟机中操做,并使用nano进行文本编辑:python

  • Ubuntu 18.04(最小安装)
  • 4GB RAM
  • 50GB磁盘

请注意,你可能须要至少20GB的磁盘空间来存储你的私有链。linux

Docker,Docker Compose和neo-local

Neo-local项目须要运行在Docker上,所以首先要作的事情就是安装好Docker。 Docker是一个容器引擎,能够运行预先配置的设置,这正是neo-local使用它的缘由。咱们将使用Docker 社区版(Docker CE)。git

安装Docker

你能够在Docker文档中找到所选操做系统的详细安装说明。如下是几种常见操做系统的安装文档连接:github

安装Docker 组件

咱们还须要Docker 组件。对于Windows和MacOS系统,它应该已经包含在上一步安装的软件包中了。 Linux用户须要按照文档的组件安装部分进行操做。确保已经按照指南中的说明查看了GitHub版本页面,保证下载的是最新的版本- 不要只是复制/粘贴命令而不检查。docker

测试Docker

就像快速测试同样,你如今应该可以运行下面的这些命令(以’$’开头的行)并查看相应的输出:ubuntu

$ docker --version
Docker version 18.06.0-ce, build 0ffa825
$ docker-compose --version
docker-compose version 1.22.0, build f46880fe
复制代码

你的版本号可能与个人版本号不彻底匹配,只要保证运行的是最新版本,就能够了。windows

若是安装后的步骤有效,Linux用户也应该可以在没有sudo权限的状况下运行’hello-world’ docker容器。 请注意,若是你收到某种“拒绝权限”错误,则可能须要从新启动计算机:bash

$ 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费用。

下一步

写这篇文章的时候,Neo文档还是至关的分散。 不过如下这些网站提供了关于智能合约开发的很好的资料信息:

此外,neon-js可用于与JavaScript环境中的智能合约进行交互。

原文连接:github.com/nevantan/ne…

翻译:包子

相关文章
相关标签/搜索