想开发区块链应用你被solidity拖后

2019年05月15日 来源:

一些基于迅雷链WASM上开发的美好体验

想开发区块链运用,你被solidity拖后腿了吗?

作为一个前端开发,我接触智能合约开发已经快一年了,期间也开发了几个智能合约应用,看过了一些以太坊合约代码。

在使用Solidity开发基于EVM的智能合约的进程中曾不可避免的踩过许多坑,因此当我得知迅雷链最近推出了支持C/C++开发基于WASM合约的时候,迫不及待的来上手尝试了一番,期望能够获的比使用Solidity开发合约时更好的体验。

以下是我基于Catalyst的TRC3模板合约体验及一些简单的合约移植后代码修改的流程,主要介绍一下曾经在使用Solidity时出现的问题,和后来使用C/C++在WASM实现中的比较

Dapp合约开发经历

我曾经使用Solidity写过一个溯源存证类的合约,主要就是把用户通过表单提交的一些信息,存入到区块链上。最初按照传统的方案实现,直接将数据库表字段映照到合约里的结构体,然后调用合约方法存储到Map里。

如果大家有过相似的开发经历的话,大都会遇到一个很直接的问题:stack too deep, try using fewer variables。如下面这段代码:

pragma solidity ^0.4.20;

contract Test {

struct Tstr {

string a1;

string a2;

string a3;

string a4;

string a5;

string a6;

string a7;

string a8;

}

mapping(uint = Tstr) public tmap;

function test(string _a1, string _a2, string _a3, string _a4, string _a5, string _a6, string _a7, string _a8) public {

Tstr memory tstr = Tstr(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8);

tmap[0] = tstr;

}

}

这个毛病是由于EVM限制了栈最多能取到stack[15]就是从栈顶向下第16个栈元素的内容,这就导致了如果一个函数方法的入参、返回值、函数内参数的个数如果大于一定量的时候极可能会触发这个毛病,实际情况要根据opcode来分析。

理论上来讲如果合约业务逻辑复杂,总会有不可避免的情况会遇到上述问题。

比如,理论上我们可以通过拆分合约逻辑,优化代码结构来修复。但这就是一个典型的EVM限制开发的问题。 另外还有像EVM限制合约Bytecode大小不超过24K,Solidity没法在合约外返回变长数组、没有迭代器来遍历map,不支持原生string的操作等等这些问题。

抱着这些使用Solidity过程中产生的疑惑和对WASM的期待,我们来看一下使用C/C++开发合约的过程。

使用Catalyst

首先我从迅雷链的Catalyst工具开始,因为目前为止想通过迅雷链部署WASM类型的合约,还只能通过官方提供的Catalyst做编译测试。

对Catalyst的使用这里不做过多介绍,由于其实整体和remix的使用体验很贴近,只是编译、部署和执行都是通过迅雷链测试环境实现的。

而Catalyst里提供了一份WASM类型的模板合约,实现的是TRC3标准的token,也就是ERC20的token合约。接触过区块链的应当都知道这是以太坊的token通证发行标准,并且已经有很多基于Solidity的成熟的实现。

我们以这里的C++实现的token合约模板来解析。

结构

可以看到模板里TRC3 token合约分为三个文件来实现,其中p定义了TRC3的必须要实现的方法,以及两个事件;p则继承自ITRC3,并定义了一般token所需要的私有属性,私有方法(transfer,approve),并实现了接口类的方法; p则是通过thunderchain_main初始化了TRC3的合约实例,定义了一系列ACTION提供对外调用的逻辑入口,并调用TRC3对应方法实现最终函数。

使用TC宏

每个文件里都引用了 tcapi.h 头文件,这应该是迅雷链为WASM合约开发提供的一个工具函数库,比如合约里使用到的address 类型定义、TCStorage的操作,TCnotify事件操作等,这些api都是可以通过迅雷链的文档查到的,链接

这一段自定义了范型参数的类TCMap,实现私有属性 _balances 和 _allowed

// Mapping from address to balance

TCMap

// Mapping from spender to approvals

TCMap_allowed{"allowed_"};

另外合约事件的宏定义及参数的传递以下

#define EMIT(eventID, arg1, arg2, arg3) {

void *jsroot = TC_JsonNewObject();

TC_JsonPutString(jsroot, #arg1, arg1);

TC_JsonPutString(jsroot, #arg2, arg2);

TC_JsonPutString(jsroot, #arg3, arg3);

TC_Notify(_transferEventID, TC_JsonToString(jsroot));

}

使用TC_Json相干Api可以轻松实现json数据,然后通过事件将json string触发。

其他transfer的常规实现利用C++和迅雷链提供的一些Api,可以说基本照搬Solidity中对ERC20合约的实现便可。

ACTION

从p合约的实现来看,所有的合约需要有一个名为thunderchainmain的主函数入口,并且通过ACTION case来路由对应的方法调用。thunderchainmain的参数只有两个,就是要履行的方法action名称,以及执行方法的参数json。 因为这里将所有的参数都转为json情势传入,并且WASM对栈的使用无限制,所以不会出现像EVM一样的stack too deep的问题。

但是这种方法路由的实现方式也是有一些弊端:比如合约调用方必须准确匹配要调用的合约名称,以及参数的名称(json参数取值根据参数名获取),否则就会执行到默认action。

基于上述方式的合约方法调用和查询,是将交易data按照|的形式,action与args以"|"分割,这种实现相比于Solidity基于ABI编码参数和解码返回值,更加直接。

对比

通过对比使用C/C++开发合约的进程,现在对这类实现有了一些简单的认识。

从开发的角度来看,WASM虚拟机更多的意义在于带来了一种常见语言(以后或许能支持更多语言)支持合约的开发,使开发者有了一定的可选择性。

而C/C++作为更成熟的语言,大部分的开发者会有一定的开发基础。

编写的便利性得到提升,安全性也有一定的保障。

还有一个比较好的地方体现在,随着越来越多的人加入,工具库和合约被开发和复用,合约的开发也将会更加便捷高效。

也欢迎使用迅雷链开发的人多跟我沟通和交流。

益母颗粒什么时候用
益母颗粒适合什么人吃
中药调理月经量少
相关文章
  • 络黑社会操控舆论花五万元可左右法院判决
    络黑社会操控舆论花五万元可左右法院判决

    互联是我们生活的一部分,但在上看到的消息,,特别是论坛里的很多帖子、话题,可能有很多都是不真实的,我们的就发现了一个潜伏于水下的灰色产业链。据中国互联络信息中心统计,目前中国民数量规模已达3.38亿人,普及率达22.6%,超过全球平均水平。互联几...

  • 宜兰选战蓝向青年招手绿打女性温情牌
    宜兰选战蓝向青年招手绿打女性温情牌

    宜兰选战:蓝向青年招手 绿打女性温情牌台海12月4日讯 宜兰县长选战打得激烈,倒数时刻蓝营邀请在宜兰打拼的青年人力挺吕国华,强调宜兰是年轻人事业版图;绿营打出女性幸福牌,表示虽然林聪贤曾离婚,但单亲爸爸让他更能体会女人辛苦。据台湾《中国时报...

  • 独家解析国务院总理李克强的四大支柱有何深意
    独家解析国务院总理李克强的四大支柱有何深意

    当地时间5月25日,李克强在这里发表演讲时说,中国愿和拉美深化合作,互学互鉴,共同开创中拉全面合作伙伴关系新征程。双方应着力打造四大支柱,即巩固传统友好和政治互信、推动经贸合作提质升级、多措并举推进人文交流、完善和创新整体合作机制。这是继...

  • 八国集团峰会开幕欧美决定展开自贸协定谈判
    八国集团峰会开幕欧美决定展开自贸协定谈判

    新华英国厄恩湖6月17日电 为期两天的八国集团峰会17日下午在英国北爱尔兰西部厄恩湖开幕,全球经济和反恐被列入峰会重要议题。作为本次峰会首个重要成果。欧盟委员会主席巴罗佐和美国总统奥巴马在发布会上宣布,欧盟与美国将正式展开双边自贸协定谈判,这...

  • 6款经典早餐的营养吃法
    6款经典早餐的营养吃法

    煎饼果子、鸡蛋灌饼、小笼包等备受欢迎。然而,路边早餐的安全问题也一直是大家关注的重点,今天,营养专家将为大家支招,为路边早餐“变个身”,让它更安全营养。小笼包选素的。“我曾在路边吃过小笼包,里面的肉馅和外面的面皮都可能存在问题。”营养...

  • 乳企联合签署乳品企业自律南京宣言
    乳企联合签署乳品企业自律南京宣言

    6月21日,伊利、蒙牛、三元等乳品企业在南京召开的以“乳品企业健康发展与和谐奶业建设”为主题的2007年中国奶业协会年会上联合签署并发布了“乳品企业自律南京宣言”。乳品企业家代表一致呼吁,要推行合同收奶,反对争抢奶源,限量收奶,压级压价,拖欠奶...