EOS智能合约安全终极指南。当世界上最大的ICO,EOS于2018年6月推出时,加密社区变得持怀疑态度,并且由于软件错误而被冻结了2天。但快进4个月,EOS今天占了以太网今天所做交易的两倍以上。通过免费和更快速交易的承诺,EOS最顶级的Dapp拥有大约13,000个每日活跃用户,而以太网的最顶级Dapp只有2,000个。
一些常见的智能合约漏洞几乎适用于所有平台。与以太坊一样,在EOS上编写的智能合约需要在主网上上线之前进行审核。合约中的致命错误可以在合约没有经过足够的测试时被利用。在本指南中,我们将帮助你避免在EOS上制作下一个杀手dApp的过程中常见的陷阱。
在阅读本指南之前,了解有关EOS开发的一些先决条件信息非常重要,这些信息在你阅读本指南时会很方便。了解C++是必须的。开始智能合约开发的最佳位置是EOSIO自己的文档。
ABI调用处理
extern "C" {
void apply(uint64_t receiver, uint64_t code, uint64_t action) {
class_name thiscontract(receiver);
if ((code == N(eosio.token)) && (action == N(transfer))) {
execute_action(&thiscontract, &class_name::transfer);
return;
}
if (code != receiver) return;
switch (action) { EOSIO_API(class_name, (action_1)(action_n))};
eosio_exit(0);
}
}
上面是修改后的ABI调用程序的示例代码。如下所示的更简单的ABI调用程序用于简化合约的操作处理。
EOSIO_ABI( class_name, (action_1)(action_n) );
ABI调用程序/交易处理程序允许合约收听传入的eosio.token
交易时间,以及与智能合约的正常交互。为了避免异常和非法调用,绑定每个键操作和代码以满足要求是很重要的。
一个例子是由于他们的ABI转发源代码中的错误而发生在dApp EOSBet Casino上的黑客攻击 。
if( code == self || code == N(eosio.token) ) {
TYPE thiscontract( self );
switch( action ) {
EOSIO_API( TYPE, MEMBERS )
}
}
上面检查ABI转发源代码的apply动作处理程序允许攻击者完全绕过eosio.token::transfer()
函数,并在放置之前直接调用contract::transfer()
函数而不将EOS转移到合约中。打赌。对于损失,他没有得到任何报酬,但一无所获。然而,对于胜利,他从合约中支付了真正的EOS。
他们通过在传入操作请求合约之前添加eosio.token
合约转移操作检查来修复上述错误。
if( code == self || code == N(eosio.token) ) {
if( action == N(transfer) ){
eosio_assert( code == N(eosio.token), "Must transfer EOS");
}
TYPE thiscontract( self );
switch( action ) {
EOSIO_API( TYPE, MEMBERS )
}
}
使用语句require_auth(account)
非常重要;进入只需要授权帐户才能执行的操作。require_auth(_self)
;用于仅授权合约的所有者签署交易。
操作中的授权
void token::transfer( account_name fro