NEO智能合约之发布和升级(一)

↑关注获取专业的区块链开发学习计划

前言

nep7协议的发布,新增加了VerificationR和ApplicationR两种合约触发器。使合约能够拒绝接受资产,或者在接受资产的同时能够做一些操作。同时nep5协议也更新了transfer时需要验证目标账户是不是允许获得资产。这要求我们在发布合约时要对合约是否可收钱进行设置。而这个功能NeoGui的支持更新不是很到位,所以在本文中我们将利用Nel的轻钱包(thinwallet)来发布和升级合约。

在本文中会分为两部分,首先会介绍利用thinwallet发布和升级合约的操作流程,然后会介绍相关例子代码。例子的实现利用了nel大佬李总写的sdk来构造和解析数据。最下方会附上本文中涉及工具以及资讯的地址。

正文

准备工作

首先我们编写一个智能合约方便用以下面的流程,编译出对应的avm。

利用thinwallet发布合约

首先我们打开thinwallet主页面,并导入私钥。你可以在AccountInfo框中看到你所有的资产。由于发布合约是需要花费一定gas的,所以你需要在input框中拖入一定数量的utxo。

点击发布合约按钮打开如下图页面,导入我们刚才生成的avm格式的合约文件,并设置相关参数。

其中Parameter List和Return Type是智能合约参数和返回值。具体的需求可以参考

http://docs.neo.org/zh-cn/sc/Parameter.html

在我们的例子中我们的参数是(string method, object[] args)返回值是object所以我们这里的参数设置为0710返回值为05

Need Storage ,Need DynCall,Can Charge这三个确认按键代表的是合约是否需要存储区,是否需要动态调用,能否收钱

合约的hash是

0x297c78a028bc387b71801be0156f9952ca5925ad

点击ok键回到主页面,点击test获得发布合约所需gas,由于例子合约中使用了存储空间,所以花费是490

点击Publish中的键进行签名和发送交易,等待交易确认。

等交易确认后,我们点击AppCall键,来到下图的页面,输入我们刚才合约的hash(0x297c78a028bc387b71801be0156f9952ca5925ad),点击LoadScript。

如果参数框出现参数,则代表合约发布成功。

接下来我们测试一下合约的put和get方法,首先将下方的textParam改成put发送交易,然后重复流程改成get,点击test,可以得到值。

这里只附上调用get的图,可以看到获取到了存入的“1”

发布合约的代码介绍

首先合约的发布是调用Neo.Contract.Create(byte[] script, byte[] parameter_list, byte return_type, bool need_storage, string name, string version, string author, string email, string description)函数来执行的。

其中script是合约代码,parameter_list是参数列表,return_type是合约的返回值,name是合约的名称,version是版本号,author是作者,email是作者邮箱,description是合约的描述。

其中need_storage这个参数单独拉出来讲,是因为need_storage从字面意思和官方介绍中都为是否需要持久化存储区。但随着nep4和nep7协议的发布,这个字段也增加了对是否动态调用以及是否为可收钱合约的兼容。

现在的need_storage=need_storage | need_nep4 | need_canCharge;其中的need_storage为是否需要存储区(0false,1true),need_nep4为是否需要动态调用(0false,2true),need_canCharge为是否为可收钱合约(0false,4true)。

也就是说如果你的合约需要存储区也需要动态调用并且为可收钱合约,那么这个字段的值应该为7.

接下来附上代码片段,

例子详情可见

https://github.com/NewEconoLab/neo-thinsdk-cs/blob/master/smartContractDemo/tests/others/PubScDemo.cs。

发布合约的构造代码如下

然后调用invokeScript来获得虚拟机执行这段脚本所需花费的gas(你可以调用本地cli或者nelApi的invoke来获得花费)

最后构造交易数据下图中的makeTran是对tran的inputs和outputs进行构造

其中所用到的构造脚本的scriptBuilder和构造交易的Transaction都是用了李总写的sdk。如果你要用原生的Transaction和ScriptBuilder,这里就不附上代码了。原理一样,自己对比。

升级的相关内容会在NEO智能合约之发布和升级(二)继续。

thinwallet

https://github.com/NewEconoLab/neo-thinsdk-csthinWallet工程

sdk for neo (c#)

https://github.com/NewEconoLab/neo-thinsdk-csthinSDK工程

文中的例子

https://github.com/NewEconoLab/neo-thinsdk-cs/blob/master/smartContractDemo/tests/others/PubScDemo.cs

nep协议

https://github.com/neo-project/proposals

©著作权归作者所有

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180626G18OC100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券