作为一名前端开发人员,我已经从事智能合约开发近一年,在此期间,我开发了一些智能合约应用程序,并查看了一些以太坊合约代码。在使用Solidity开发基于EVM的智能合约的过程中,我们不可避免地会遇到很多坑,所以当我们了解到Thunderbolt Chain最近支持基于WASM的合约的C/C++开发时,我们迫不及待地想尝试一下。我希望你能获得比Solidity开发合同更好的经验。以下是基于Catalyst的TRC3模板合约的经验,以及合约移植后的简单代码更改过程。主要介绍了使用Solidity时遇到的问题,以及在WASM实现中使用C/C++开发Dapp合约的经验。我曾经使用Solidity为跟踪存储类编写了一个合约,主要是为了将用户通过表单提交的信息存储在区块链上。它最初是以传统方式实现的,直接将数据库表字段映射到契约中的结构体,然后调用契约方法将其存储在Map中。如果你有类似的开发经验,Metropolitan面临着一个非常直接的问题:stack too deep try using fewer variables。如下面的代码所示:pragma idity ^0.4.20; conTest {strT {string a1;string a2;string a3;string a4;string a5;string a6;string a7;string a8;} m uint => T功能测试细节string_a1_a1理论上,当合约的业务逻辑复杂时,不可避免地会出现上述问题。例如,从理论上讲,可以通过拆分合约逻辑来优化代码结构来纠正它。然而,这是EVM限制其发展的典型问题。 还有一些问题,例如EVM将合约Bytecode大小限制在24K以下,Solidity不会在合约外返回可变长度数组,没有遍历映射的迭代器,不支持本机字符串操作。考虑到使用Solidity所产生的问题和对WASM的期望,让我们来看看使用C/C++的合同开发过程。使用催化剂我们从Thunderbolt Chain的催化剂工具开始现在,如果你想通过Thunderbolt Chain部署WASM类型的合约,你只能通过官方的Catalyst进行编译测试。实际上,整体的使用经验和混音非常接近,所以我不会在这里详细介绍Catalyst的使用,但是编译、部署和运行都是通过Thunderbolt Chain测试环境完成的。Catalyst提供了一个WASM类型的模板协议,该协议实现了TRC3标准令牌,即ERC20令牌协议。任何熟悉区块链的人都应该知道,这是以太坊的代币发行标准,并且已经有很多基于Solidity的成熟实现。在这里,我们将解析一个在C++中实现的令牌合约模板。

模板中的TRC3令牌合约是在三个文件中实现的。ITRC3.hpp定义了TRC3必须实现的方法和两个事件。TRC3.hpp继承自ITRC3,定义了通用令牌所需的私有属性、私有方法(传输、实现),并实现接口类方法。 TRC3.cpp通过thunderchain_main初始化TRC3的合约实例,定义一系列ACTION提供外部调用的逻辑条目,然后调用TRC3的相应方法来实现final函数。每个使用TC宏的文件都引用了tcapi. h头文件,这应该是WASM合同开发的Thunder chain。例如,契约地址类型定义、TCStorage操作、TCnotify事件操作等,这些API都可以通过Thunderchain文档找到,链接https/open.onethingcloud.com/site/wasm.htm。

本节自定义TCMap类的范式参数,并实现private属性_balances和_allowed//mapping from address to balanceTCMap// Mapping from spender to approvalsTCMap_allowed {“allowed_”}。eventID jsroot我们可以说,其他传输的常规实现使用了C++和Thunderbolt Chain提供的API,基本上复制了Solidity的ERC20合约实现。

在TRC3.cpp合约的实现中,所有合约都必须有一个叫做thunderchainmain的主函数条目,并且相应的方法调用必须通过ACTION case进行路由。thunderchainmain只有两个参数:要执行的方法操作的名称和要执行的方法json参数。 这里的所有参数都是以JSON格式传递的,WASM允许无限数量的堆栈使用,因此不会像EVM那样存在堆栈太深的问题。然而,这种路由方法的实现存在一些缺点。例如,合约调用者必须与他们想要调用的合约名称和参数名称完全匹配(json参数的值是根据参数名称获得的)否则,将执行缺省操作。基于上述方法的契约方法调用和查询遵循事务数据。|在的形式中,action和args是“|拆分:此实现比Solidity更容易实现基于ABI的编码参数和解码返回值。通过比较使用C/C++开发合同的过程,我们对这个实现有了一个简单的想法。从开发的角度来看,WASM虚拟机带来了一种通用的语言(可能未来还会有更多的语言)来支持合同开发,这给开发人员提供了一些选择。C/C++是一门比较成熟的语言,大多数开发者都有一定的开发基础。写作的方便性提高了,安全性也有一定的保证。另一个好的方面是,随着越来越多的人参与,随着基于工具的合同和合同的开发和重用,合同开发将变得更加方便和高效。此外,使用雷霆链开发的人也欢迎与我沟通。