合约地址
- 合约地址: 0xe82719202e5965Cf5D9B6673B7503a3b92DE20be
- 代码: https://etherscan.io/address/0xe82719202e5965Cf5D9B6673B7503a3b92DE20be#code
核心代码
// 合约名字原本是 DynamicPyramid ,但是上线前修改成了 Rubixi 并且未测试直接发布
contract Rubixi {
uint private collectedFees = 0;
address private creator;
//Sets creator
// 合约名字修改后,构造函数名称没有更改,它将变成正常的可调用函数。
// 任何人都可以调用它
function DynamicPyramid() {
creator = msg.sender;
}
modifier onlyowner {
if (msg.sender == creator) _
}
//Fee functions for creator
// 任何人都可以提取手续费,只需先把自己设置为 owner
function collectAllFees() onlyowner {
if (collectedFees == 0) throw;
creator.send(collectedFees);
collectedFees = 0;
}
}
反思
这个问题已经不可能出现了,构造函数在 solidity v0.4.22 改为 constructor
了。不会再出现这个问题了。
我们需要反思的是临时修改合约的时候,不能直接上线。我们写代码的时候,一定要写单元测试。保险起见,上线后还需要走 E2E 测试(区块链上做啥都要钱,所以很多人为了省钱不太做这些事情。为了安全还是需要多测试的)。
这个合约大概是没有单元测试,或者上线前没有执行单元测试。否则单元测试不可能通过。
相关攻击案例
- Morpheus 被任意铸币 : https://www.freebuf.com/vuls/175904.html