Post
Topic
Board Альтернативные криптовалюты
Re: [ETH] Ethereum - мировой компьютер
by
klbax381
on 23/06/2016, 21:49:59 UTC
Баг был совсем не ламерский.
Опять СМИ начитались?

Это не ламерский?:
Code:
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.sol
https://github.com/slockit/DAO/blob/v1.0/DAO.sol

Вызвать сторонний код методом call, да еще и без лимита газа - разве не ламерство?
Да еще и перед тем, как уменьшить баланс.
Такого ламерского бага я давно не видел в таких серьезных приложениях, хотя видел подобное не раз.
Потом почему не откатали контракт в тестнете? Почему не наняли нормального хакера потестить, баги поискать?

Разработчики либо явно не знают что такое гонки, рекурсия, итд, либо так было сделано специально. Баг то стандартный и давно известный для всех языков, не только solidity. Вызвал неосторожно сторонний код - жди беды.
Если ламер - используй send, разработчики эфира об этом позаботились и лимитировали газ вроде в 2300 или 2100, не помню. Для рекурсии этого не хватит даже на 1 вызов. А если используешь call - то думай головой и тыщу раз проверь, перед тем, как запускать такое в main-net.

Жаль, что я поздно узнал об этом ДАО, а так бы сам потянул себе несколько десятков тыщ эфиров, чтоб никто не заметил. Smiley