Баг был совсем не ламерский.
Опять СМИ начитались?
Это не ламерский?:
function splitDAO(
uint _proposalID,
address _newCurator
) noEther onlyTokenholders returns (bool _success) {
...........
withdrawRewardFor(msg.sender); // be nice, and get his rewards
totalSupply -= balances[msg.sender];
balances[msg.sender] = 0;
paidOut[msg.sender] = 0;
function withdrawRewardFor(address _account) noEther internal returns (bool _success) {
...
if (!rewardAccount.payOut(_account, reward))
throw;
paidOut[_account] += reward;
function payOut(address _recipient, uint _amount) returns (bool) {
....
if (_recipient.call.value(_amount)()) {
https://github.com/slockit/DAO/blob/v1.0/ManagedAccount.solhttps://github.com/slockit/DAO/blob/v1.0/DAO.solВызвать сторонний код методом
call, да еще и без лимита газа - разве не ламерство?
Да еще и
перед тем, как уменьшить баланс.
Такого ламерского бага я давно не видел в таких серьезных приложениях, хотя видел подобное не раз.
Потом почему не откатали контракт в тестнете? Почему не наняли нормального хакера потестить, баги поискать?
Разработчики либо явно не знают что такое гонки, рекурсия, итд, либо так было сделано специально. Баг то стандартный и давно известный для всех языков, не только solidity. Вызвал
неосторожно сторонний код - жди беды.
Если ламер - используй send, разработчики эфира об этом позаботились и лимитировали газ вроде в 2300 или 2100, не помню. Для рекурсии этого не хватит даже на 1 вызов. А если используешь call - то думай головой и тыщу раз проверь, перед тем, как запускать такое в main-net.
Жаль, что я поздно узнал об этом ДАО, а так бы сам потянул себе несколько десятков тыщ эфиров, чтоб никто не заметил.
