教程 | 智能合约中常见错误及如何避免

张亚宁   |     |   1609 次阅读

常见错误:

TOD

在常规的中心化的系统中,系统能为状态变化提供更多的保证,但是在以太坊的去中心化的环境下,智能和约的编程却完全不同。所以就有了常见的Transaction-Ordering Dependence (TOD),即交易顺序的依赖。DAO事件就是一个很好的例子。

解决办法:
1,首先要区别send和call的区别,并理解以太坊的gas机制,选择正确的使用方法。
2,使用正确的顺序或者采用加锁的方式

时间戳依赖

在一个TheRun的应用中,采用当前时间生成随机数来做彩票奖励。但是实际上时间戳是由矿工控制的,智能合约提供了now变量来获取时间,但是这个时间并非完全中立的。

解决办法:
1. 合理使用now
2. 随机可以采用randao(即将发布)。

send结果处理

当前很多合约对send函数的结果没有处理,这点很容易成为攻击对象。但是有时候简单的使用throw,也不是很合适。
比如在一个竞拍合约中:

/// THIS IS STILL A NEGATIVE EXAMPLE! DO NOT USE!
if (highestBidder != 0) 
  if (!highestBidder.send(highestBid)) throw;

参与者可以在使用合约出价,然后在fallback中,强行throw,这样其他人就无法通过出价更高来成功。

解决办法:
1. 转换发送模式为提款模式,使收款方控制以太币转移
2. 合理使用throw

循环错误

因为有gas限制,所以通过制造超出gas限制的循环来攻击合约。

解决办法:
1. 去掉循环或在限制循环次数
2. 让合约调用者控制循环

关于智能合约语言的考虑

现在常用的智能合约语言是Solidity和Serpent,它们都是非常高级的语言。但是作为开发者,很多时候并不是非常了解内部处理,比如fallback,now等。

现在有几个智能合约语言的分析工具,来帮助开发者更好的检查错误。
1. https://blog.slock.it/an-ethereum-contract-analyzer-93e9da92fecb#.chp38xgdw
2. https://github.com/raineorshine/solgraph

参考链接:
https://blog.slock.it/an-ethereum-contract-analyzer-93e9da92fecb#.chp38xgdw

http://ethfans.org/posts/116

http://ethfans.org/rubyu2/articles/128

http://ethfans.org/topics/420

 
5 人喜欢