硬核FAQ,这次讲讲智能合约开发。
昨日,PlatON联合无涯社区举办了主题为《PlatON智能合约开发》的活动,PlatON技术副总裁傅志敬详细分享了PlatON EVM合约与WASM合约开发相关知识与操作及合约开发场景应用。
一场为开发者准备的知识盛宴尽在此文。
Q:PlatON当前的测试网的智能合约到什么阶段了?已经完善阶段或是还会有大版本迭代?
A:PlatON当前的测试网的智能合约现在同时支持了WASM和EVM两种智能合约虚机平台。WASM虚机目前只支持
C++语言,EVM虚机支持Solidity语言。
测试网目前最新的0.13.0这个版本已经是完备阶段,大家可以在测试网上进行相应的应用开发和测试工作。
主网上线版本0.13.1没有新的和大的版本变化,只是在0.13.0上进行了部分优化工作。
Q:PlatON智能合约支持哪些语言?未来会有新的语言支持吗?
A:PlatON智能合约支持目前仅仅支持C++和Solidity两种语言,C++语言对应的运行在WASM虚机上,Solidity语言对应的运行在EVM虚拟机上。
未来在WASM虚机上还会支持Rust、GO、Python等高级语言。
Q:目前看到PlatON上支持EVM智能合约, 那么以太坊上现有的智能合约是直接兼容还是需要做一些调整可以部署在PlatON上?EVM智能合约的完整技术栈包含哪些内容?
A:以太坊上现有solidity合约是直接兼容的,如果合约中包含以太币单位和地址的话,需要做简单调整,改为PlatON的LAT相关单位和地址即可。
并且我们鼓励社区开发一键移植的工具,可以考虑用Grants的方式进行激励,欢迎开发者社区的高手贡献一份力量。
EVM智能合约完整技术栈包含以下内容:
对区块链和虚拟机有一个简单的理解,比如gas机制、交易、区块打包和上链流程等
solidity语言相关知识,比如solidity语言的语法、对应的类型和接口等
开发者工具,如:truffle
Q:当前合约的部署成本的开销是怎么计算的?对GAS的开销有哪些建议给开发者?
A:当前合约的部署成本的开销主要还是看合约二进制大小,同时跟合约的参数的大小也有关系。
部署成本是gas*gasprice。
对GAS的开销的建议是:
使用正确的类型,如:可以使用uint类型的情况下,不要使用string类型
避免使用不必要的代码等
避免在循环中执行gas成本高的操作。如:由于SLOAD和SSTORE操作码的成本高昂,因为管理storage变量的gas成本要远远高于内存变量,所以要避免在循环中操作storage变量
避免循环中的重复进行计算
另外,我们现在正在与电子科大教授开发合作EVM gas优化项目。
Q:以太坊平台上的合约的安全问题层出不穷, 针对此问题PlatON对开发者有哪些建议?以及PlatON对安全的底层做了哪些工作?
A:关于以太坊平台上的合约的安全问题,我们的建议是:
可以参看我们的安全开发指南、包括从编译器、开发流程、以及怎么避免重入、发送token、栈深度和权限控制等常见漏洞。
PlatON对安全的底层做了如下工作:
PlatON底层从P2P安全(异形攻击、节点连接数等)、RPC安全、账户模型、虚拟机,共识安全等多方面做了验证和测试。
同时慢雾进行了两轮安全审计,慢雾链安全审计负责人Johan表示:“慢雾安全团队针对PlatON的WASM虚拟机、EVM虚拟机、节点激励模型等7个模块进行了新一轮安全审计,并重点审查了在第一轮审计之后修改的代码。据审计报告结果显示,PlatON以极高的代码质量,确保了已被审计部分不存在任何安全风险。”
我们非常重视安全问题,积极开展相关的工作,比如与慢雾合作漏洞赏金活动、请Runtime公司进行形式化验证和跟电子科大合作开发EVM安全项目等
Q:基于PlatON开发智能合约在开发实践上有哪些更好的实践操作的建议给开发者?
A:我选WASM和EVM共性的几个要点简要说一下:
费用合理设置
当需要在PlatON的主网上部署合约时,需要设置一个合理的费用限制。在PlatON网络中,默认最高gas的限制为 100,800,000, 最低为 21,000,过低或者过高都会导致交易失败。在部署大型合约或者运行复杂功能时,可以将gas的限制调高。例如: 1,000,000,如果是普通转账则设置为最低值即可。具体的值需要根据合约的规模及复杂度进行估算,在合约发布前可以调用接口platon_estimateGas进行大概估算,避免因不足而导致失败。
避免超时
在PlatON网络上发送交易,没有超时的概念,但是最终会根据所设置的gas限制值停止,如果限制值低于合约部署所需要的消耗,则交易发送失败,同时会扣除对应的手续费。手续费的设定不可能无限大,因为在网络中,区块本身有一个最大的gas上限,当交易的GasLimit超过该值时,交易将无法被接收。
如果是针对已发布的合约执行call调用(call调用指合约逻辑内无状态变更操作),存在5s超时的限制,如果在5s内合约逻辑没有执行完成,虚拟机会超时强制退出,导致查询失败。
为避免部署合约交易失败,请尝试将大型合约分成较小的块,并根据需要相互引用。为了避免无限循环,请注意常见的陷阱和递归调用。
非法操作处罚
如果智能合约不是通过标准有效的编译器编译合约或者随意的更改指令码,都会导致操作码无效。此类合约不仅无法部署和执行成功,而且还会产生“GasLimit*GasPrice”的全额惩罚,当次交易的手续费会全部被扣除,这是一个力度很大的惩罚。如果操作者没注意该点,不断重试,那么付出的成本会更高,代价更重。
一般产生无效操作码有以下情况:
对正常已编译出的合约手动更改了指令码
合约编译器版本与网络锁支持的合约版本不一致
使用浮点数运算
在PlatON网络中操作合约时,请务必先确认当前网络所支持的智能合约版本,然后选择对应版本的编译器。
常规操作是使用PlatON官方提供的最新的Truffle/PlatON-CDT来编译/部署/执行合约,同时在切换到主网操作前,务必在测试网进行有效的验证。
其他还有编码规范、智能合约文件组织结构、WASM合约特殊的一些C++语言的限制和特性建议我就不在这里展开赘述了,有兴趣的朋友可以去我们的官方文档上面查阅学习,具体地址如下:
EVM:
https://devdocs.platon.network/docs/zh-CN/EVM_Smart_Contract/#%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5
WASM:
https://devdocs.platon.network/docs/zh-CN/WASM_Smart_Contract/#%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5
Q:WASM合约开发适合的场景有哪些?对于WASM技术PlatON未来会有什么动作吗?
A:我们在内部测试中对比EVM与WASM虚拟机的TPS可以看到,EVM在执行业务逻辑比较简单的场景中具备更好表现,这主要原因在于EVM的加载启动简单,WASM的启动在高级语言层面(C++)进行实现。当执行的业务逻辑较为简单的情况下,WASM的加载启动在一笔交易的执行时间占比较大。但当业务逻辑复杂一些,如测试中的插入排序测试,业务逻辑执行时间占比更高情况,WASM的优势则体现出来,这归功于WASM与高级语言的结合,各个高级语言拥有强大的编译优化能力,对执行效率有极大的帮助。由此测试我们更推荐在业务模型复杂的情况使用WASM合约,在执行效率与业务抽象能力上都更具优势。
结论是:WASM合约对于比较复杂的合约具有更好的性能和更低的GAS消耗。
另外针对WASM我们持续在优化性能和GAS消耗。并且我们后续会在WASM上提供隐私计算的能力。
Q:当前智能合约上适合开发的应用场景会有哪些?
A:当前PlatON上的智能合约适合开发的应用场景有:金融,游戏,社交等。
我们后续会在WASM上提供隐私计算的能力,并正在以此为基础来建构下一代的数据资产权确认与价值交易的基础设施服务。
另基于EOS开发Horseman GO这款游戏,已经开始在往PlatON上面移植了,敬请期待!
Q:开发者在开发环境下如何使用PlatON的钱包接口?以及用户端是如何方便地使用Dapp访问钱包?
A:我们给开发者提供强大的开发者工具包:
platon-truffle
https://platon-truffle.readthedocs.io/en/v0.11.1/
Java sdk
https://devdocs.platon.network/docs/zh-CN/Java_SDK/
JS sdk
https://devdocs.platon.network/docs/zh-CN/JS_SDK/
利用对应的SDK通过RPC接口来使用PlatON钱包接口。
目前我们官方提供了一个ATON钱包Dapp,可以方便用户使用钱包:
https://devdocs.platon.network/docs/zh-CN/ATON-user-manual/