智能合约开发与调试要点整理——基于truffle框架

开发以太坊DAPP已有一段时间,期间折腾过两个体量较大的合约项目,在调试合约的时候尝试过不少思路,踩过很多坑。感觉有必要总结一下DAPP开发的一些经验教训。

1,solidity虽然是图灵完备的,但是个人感觉,它并不适合做大型的业务处理——调试难度会急剧上升。
2,选择一个可升级的合约结构。稍微复杂一点的合约系统都会有多个sol文件,其中涉及业务逻辑的sol会经常有bug,这是无法避免的。但在整个合约系统中最好有一个合约是不升级的——这个合约是该合约系统的入口,最好不要变动。我们当前用的方案是用一个合约做数据存储,对数据的读写设定访问权限。具体可参见另一篇博文。对于有token的合约系统,token合约一般是不能升级的,好在ERC20标准简单,实现的代码较少,推荐使用成熟项目的ERC20代币的代码,并保证余额相关的操作使用safeMath。
3,DAPP都会有前端页面与之配套,负责展示信息、承载用户操作。前端页面会通过自己的eth网络节点或者官方提供的网络节点,与合约进行交互。合约在给前端提供接口时,尽可能利用solidity函数支持多返回值这个特性,在一次请求内返回多个信息,减少请求次数、加快页面响应。必要时可以返回定长数组以扩充返回值的数量。
4,尽可能使用较新版本的solc,新版本的语法检查会越来越严格,可以尽早暴漏问题。
5,使用truffle可以极大的加快合约的部署与调试,墙裂推荐。remix也挺好,但remix更适合小合约的尝试,比如验证某些想法、语言特点,可以直接在浏览器的remix中尝试。大型合约还是用truffle顺手。

6,在truffle项目目录中使用本地安装相关npm包——不同的项目可以使用不同版本的solc,相互独立。比如在truffle中新建一个script文件见,放置package.json,配置各个以来的包。初始化项目环境时,npm install即可完成。另外该目录还可以放置运行虚拟机的脚本,实现一键测试。

7,部署脚本,要同时适用于正式网络、测试网络、虚拟机等不同环境。对于多个合约的DAPP系统来讲,执行migrate的时候经常遇到正式网络、测试网络连接不稳等情况,此时已部署的合约地址应尽早写道本地硬盘,下次部署时继续,而不是从头来过——费钱费时。

8,充分利用Mocha 测试框架,在虚拟机环境下,设计用例,对每个函数、每个内部边界进行详细测试。

9,函数内部使用的require\assert等可以在第二个参数中带上错误信息,可以加快问题的定位。副作用是会加大合约的体积,增加了部署成本。

10,当某个调用出现revert,但是有没有足够的错误信息辅助定位代码位置,如果是在虚拟机环境下,可以通过注释的方式不断逼近出错代码。如果用的是测试网络,可以使用parity trace功能查询出错的函数的签名、找出出错的位置。

11,如果一个接口合约(合约)没有被其他合约引用,那么该接口合约就是不必要的。truffle对于未实现的接口,无法给出定位,只提示合约无法部署,会造成很多不必要的麻烦。

12,如果在合约A内需要频繁调用合约B的某一个方法,可以将本调用包装成一个内部方法,可以减小合约体积。

你可能感兴趣的:(BlockChain,Solidity)