代币发布时应遵循其他最佳实践经验,但也要有一些独特的注意事项。
符合最新标准
一般来说,代币的智能合约应遵循公认且稳定的标准。
目前接受的标准有:
· EIP20标准
· EIP721标准
注意在EIP-20上的前端攻击
EIP-20令牌的approve()函数为批准的支出者创造了超出预期金额的可能性。可以使用前端攻击,使批准的支出者可以在处理对approve()的调用之前和之后调用transferFrom()。
防止将代币传输到0x0地址
在编写本文时,“零”地址(0x0000000000000000000000000000000000000000)包含值超过8000万美元的代币。
防止将代币传传输合约地址
还要考虑防止代币转移到智能合约的同一地址。
EOS代币智能合约就是其中一个可能造成损失的例子,其中超过90,000个代币被卡在合约地址上。
示例:
实施上述两项建议的一个示例是创建以下修饰符;验证“to”地址既不是0x0也不是智能合约自己的地址:
modifier validDestination( address to ) {
require(to != address(0x0));
require(to != address(this) );
_;
}
然后将修饰符应用于“ transfer”和“ transferFrom”方法:
function transfer(address _to, uint _value)
validDestination(_to)
returns (bool)
{
(。.. your logic 。..)
}
function transferFrom(address _from, address _to, uint _value)
validDestination(_to)
returns (bool)
{
(。.. your logic 。..)
}
程序文件
当启动一个将有大量资金或需要关键任务的智能合约时,必须包括适当的解释文件和安全相关的文档包括:
规格和推出计划
· 规范,图表,状态机,模型和其他文档,可帮助审核员,审阅者和社区了解系统的意图。
· 很多bug都可以从规范中找到,从而降低修复它们的成本。
· 推出计划,其中包括此处列出的详细信息以及目标日期。
状态
· 当前代码的部署位置。
· 编译器版本,使用的标志以及用于验证部署的字节码的步骤与源代码匹配
· 将用于不同阶段的编译器版本和标志
· 已部署代码的当前状态(包括未决问题、性能统计等)
已知的问题
· 智能合约的主要风险。 (例如, 你可能会丢掉所有的钱,黑客可能会通过投票支持某些结果)
· 所有已知Bug/限制。
· 潜在的攻击和解决方法。
· 潜在的利益冲突。(例如,筹集的Ether将纳入自己的腰包,像Slock.it与DAO一样)
历史记录
· 测试(包括使用情况统计信息,发现的Bug,测试时间)。
· 已审阅代码的人员(及其关键反馈)。
紧急程序
· 发现Bug时的行动计划(例如,紧急选项,公共通知流程等)。
· 如果出现问题,请结束流程(例如出资者会在攻击前从剩余资金中获得余额的百分比)。
· 负责任的披露政策(例如在何处报告发现的Bug,任何Bug赏金计划的规则)。
· 发生故障时的追索权(例如保险,罚款基金,无追索权)。
联系信息
· 谁来处理问题。
· 程序员和/或其他重要人员的姓名。
· 可以提问的聊天室。
来源: 区块链研究实验室
评论
查看更多