【bCamp大咖分享课程回放】用Python编写NEO智能合约

1

分享嘉宾

莫韬

NEO社区技术Reddit者、布道者深度参与NEO社区贡献

参与了Github文档的翻译维护和NEO英文社区的建设运营,活跃于Reddit和Discord社区

2

分享实录

准备

教程基于macOS或Linux Ubuntu,windows用户需要使用linux虚拟机。

Linux Ubuntu

1.首先确认基本的apt和curl都已安装/更新,执行

2.安装docker,以备运行私链容器(neo-privatenet),执行

3.安装docker compose,执行

(因版本可能更新,具体命令以docker的Github页面为准)

此命令可能需要翻墙,如果下载时间过长,见3.0.1,否则见3.1

3.0.1. 手动从Github下载此项目,并将文件重命名为,放在/usr/local/bin/

3.1. 设定权限

Mac OS

下载Docker for Mac,Docker以及Docker Compose均整合在安装文件里。

环境搭建

NEO-Local

1.进入想要把neo-local下载到的文件夹,比如:

2.下载Github上的NEO-Local, COZ制作的整合包,整合了NEO-Python钱包的所有依赖包,可以一键搭建neo-python和私链。执行:

3.进入neo-local所在的路径

4.启动docker

5.运行neo-local:

注:第一次运行时需要下载4.4G的内容,可能需要翻墙

6.运行neo-python钱包:

出现如下界面进入了NEO CLI 命令行,那么恭喜你已经成功搭建好所有环境。

7.退出钱包:

8.停止运行neo-local:

Tip: 当neo-local停止运行时目前的私链也会停止运行

注:若想要不使用整合包的搭建环境方法,可见此教程https://blog.gallifrey.cn/?p=419

钱包使用

打开钱包

创建自己的钱包

转账

合约测试+部署

###编译和测试

打开合约事件日志

合约编译命令格式

build path/to/file.py test param1 param2 etc..

输入参数类型(参数类型表的值之一)

返回值类型(参数类型表的值之一)

True/False: 合约是否需要用到存储

合约是否需要用到动态调用(绝大多数情况下是False)

is also a boolean, indicating whether or not the SC will be calling another contract whose address it will not know until runtime. This will most always be

动态调用可以允许调用直到runtime之前都没有发布的合约。

传入合约的参数

参数类型表

部署和调用

部署.avm格式合约:

import contract path/to/sample2.avm

注意无需传入参数

输入合约的一些信息

输入密码以确认部署

部署完成后的合约存储于区块链上,无法改变

调用

调用合约时需要知道这个合约的hash,通过

可以查找合约。此外contract_hash也可以在合约完成发布时的日志里找到。

通过hash调用合约:

例子

可从这里下载[]。放入文件夹内

Print and Notify

是Python内置的打印函数,和同样是打印输出,不同的是可以打印对象,上面我们用打印了一个数组。

Calculator

defMain(operation,a,b):ifoperation=='add':returna+belifoperation=='sub':returna-belifoperation=='mul':returna*belifoperation=='div':returna/belse:return-1

070202 02

Storage

note: NEO智能合约的存储是通过键-值存储。

fromboa.interop.Neo.StorageimportGet,Put,Delete,GetContextdefMain(operation,addr,value):ifnotis_valid_addr(addr):returnFalsecontext=GetContext()ifoperation=='add': balance=Get(context, addr) new_balance=balance+value Put(context, addr, new_balance)returnnew_balanceelifoperation=='remove': balance=Get(context, addr) Put(context, addr, balance-value)returnbalance-valueelifoperation=='balance':returnGet(context, addr)returnFalsedefis_valid_addr(addr):iflen(addr)==20:returnTruereturnFalse

是通过上下文使用指定key获取值,是通过上下文用指定key将value给存储或更新,是通过上下文用删除指定key存储的值。

输入参数为字符串字节数组 整数。输出参数为整数

注意当处理地址时,可以输入地址的字符串(string)形式或字节数组(bytearray)形式

Domain域名服务

此智能合约通过使用区块链的存储系统,给钱包地址提供域名服务。每个注册的域名对应一个地址。

合约有以下功能:

在函数中,通过不同的来调用不同的函数进行操作,并进行参数校验。

:进行域名查询操作,通过查询所对应的地址,若对应地址存在,则返回查询到的地址,否则返回。

:注册域名,我们应该只能自己当前钱包的地址进行注册等操作,所以使用进行核验,核验地址是否为当前钱包所有,然后判断域名是否已经被注册。

:域名转让,将域名转让到新地址上。首先校验被转让的域名是否已经注册存在,不存在的域名是无法转让的、然后检验新地址是否为当前钱包所有,不是自己的域名是无法转让的、最后检验新地址长度是否合法。

:删除域名,首先校验域名是否存在,然后校验域名是否为当前钱包所有,否则不能删除。

编译:注意输入参数为字符串和数组,输出参数为字节数组

build smart-contracts/5-domain.py 0710 05 True False

部署

调用

testinvoke register ['domain.com', 'ATZE8izvnGGuxLYRZUDPwFr6yqyaBavVWV']

因为合约返回的地址为字节数组,所以需要用一个线上工具来转换:

https://peterlinx.github.io/DataTransformationTools/

以下是我们的知识星球,欢迎有兴趣的小伙伴加入我们,共同成长!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180805G10E9J00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励