查看原文
其他

NEXT社区小课堂 | 第二十课:利用Python在本地开发NEO智能合约

NEONEXT 2023-07-20

The following article is from BCIF Author BCIF

NEXT社区 | 小课堂


由于近期NEXT社区加入很多新的小伙伴,有在校大学生,有对区块链感兴趣的传统企业从业者。为了更方便、更系统的让NEXT社区的伙伴们了解NEO的技术知识,因此我们开设了小课堂,每周3节,向大家普及NEO相关的知识要点!


NEXT社区小课堂 | 第二十课

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




在本教程中,我们将使用neo-local(https://github.com/CityOfZion/neo-local)项目为本地开发和测试Neo智能合约设置私有链。使用私有链可以使我们能够完全控制我们的环境,使我们能够独立工作而不用与外部测试网络打交道。


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


● Ubuntu 18.04(最小安装)

● 4GB RAM

● 50GB磁盘


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


- Docker,Docker Compose和neo-local   


Neo-local项目需要运行在Docker上,因此首先要做的事情就是安装好Docker。Docker是一个容器引擎,可以运行预先配置的设置,这正是neo-local使用它的原因。我们将使用Docker 社区版(Docker CE)。


- 安装Docker  


你可以在Docker(https://docs.docker.com/install/)文档中找到所选操作系统的详细安装说明。以下是几种常见操作系统的安装文档链接:


● Windows:https://docs.docker.com/docker-for-windows/install/

● MacOS:https://docs.docker.com/docker-for-mac/install/

● Ubuntu :https://docs.docker.com/install/linux/

(Linux的安装后步骤:

https://docs.docker.com/install/linux/linux-postinstall/

-也看看这些内容遵循这些)


- 安装Docker 组件  


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


组件安装部分:

https://docs.docker.com/install/linux/linux-postinstall/https:/docs.docker.com/compose/install/

GitHub版本页面:https://github.com/docker/compose/releases


- 测试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。


Docker NEO私有链中心页面:

https://hub.docker.com/r/cityofzion/neo-privatenet/

这个链接:https://s3.amazonaws.com/neo-experiments/neo-privnet.wallet


- 启用neo-local堆栈  


在不同的操作系统之间启动堆栈的方法略有不同。这两组命令都会让你进入neo-python命令行界面(CLI)。


- Windows (wiki)  

wiki:https://github.com/CityOfZion/neo-local/wiki/Usage-(Windows)


$ docker-compose up -d --build --remove-orphans
$ docker exec -it neo-python np-prompt -p -v


- MacOs (wiki) 和 Linux (wiki)  

MacOs (wiki) 

:https://github.com/CityOfZion/neo-local/wiki/Usage-(Mac)

Linux (wiki) 

:https://github.com/CityOfZion/neo-local/wiki/Usage-(Linux)


安装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(链接如下)页面中的形式提供的,其中参数和返回类型均表示为单个字节:


 ContractParameterType:http://docs.neo.org/en-us/sc/Parameter.html


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-python docs :

https://neo-python.readthedocs.io/en/latest/index.html

● 智能合约部分:

https://neo-python.readthedocs.io/en/latest/neo/SmartContract/smartcontracts.html


● Neo Docs :http://docs.neo.org/en-us/index.html

 智能合约部分:http://docs.neo.org/en-us/sc/introduction.html


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

neon-js:https://github.com/CityOfZion/neon-js



以上完!



往期课堂



NEXT社区小课堂 | 第十七课:开发NEO智能合约的实用技巧

NEXT社区小课堂 | 第十六课:开发NEO智能合约的工作流程

NEXT社区小课堂 | 第十五课:NEO虚拟机

NEXT社区小课堂 | 第十八课:NEO智能合约部署与调用

NEXT社区小课堂 | 第十九课:如何用 C# 编写 NEO 智能合约



↓↓↓

  联系我们  

微博:https://weibo.com/u/6724929880

官网:https://neonext.club/

QQ群:612334080

电报:https://t.me/neonextop

twitter:https://twitter.com/NE0NEXT


扫码关注NEO NEXT官方公众号

获取更多一手社区资讯

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存