Как мне конвертировать свои токены The DAO в эфиры, используя контракт на вывод средств после хардфорка?

Контракт DAO подвергся атаке 17 июня 2016 года, когда злоумышленник похитил эфиры на сумму около 50 миллионов долларов США , используя уязвимость рекурсивного вызова в коде контракта DAO.

Злоумышленник слил украденные эфиры в несколько дочерних DAO, а группа Робин Гуда слила оставшиеся средства в другие дочерние DAO.

Для блока № 1 920 000 запланирован хард-форк (примерно через 24 часа, ~ 23:26 20 июля 2016 г. по восточному стандартному времени Австралии), чтобы перевести эфиры из контракта DAO и его дочерних DAO в контракт на вывод средств.

После того, как хард-форк пройдет, как мне конвертировать свои токены The DAO в эфиры?



Возврат средств DAO



Обновление 13:31 20 июля 2016 UTC

Баланс контракта на снятие средств составляет 11 597 664,781027947 эфира (145 318 739,71 долларов США).

Успешный хардфорк. Всем счастливого хардфорка! Хорошая работа разработчиков и других участников.

Обновление 22:31 20 июля 2016 UTC

Баланс контракта на вывод средств теперь составляет 6 369 298,685677664 эфира (79 807 312,53 долларов США). Около 45% DAO были конвертированы в ETH, более 1506 транзакций.

Обновление 18:04 23 июля 2016 UTC

Баланс контракта на вывод средств теперь составляет 4 595 418,245476871 эфира (65 944 251,82 долларов США). В настоящее время около 60% DAO конвертированы в ETH, что составляет более 3887 транзакций.

Вот диаграмма с https://slacknation.github.io/medium/11/11.html :введите описание изображения здесь

Обновление 23:18 1 августа 2016 UTC

введите описание изображения здесь

Обновление 14:58 6 сен 2016 UTC

Остаток 13,55%.

введите описание изображения здесь

Можете ли вы дать ссылку на «отдельный процесс для покупателей, которые заплатили более 1 ETH за 100 DAO, чтобы получить возмещение дополнительной уплаченной суммы»
См. Как мне получить возмещение суммы, которую я заплатил сверх 1 эфира на 100 токенов DAO , которая, как ожидается, будет уточнена в начале следующей недели.

Ответы (2)

Обновление от 29 марта 2017 г.

Последние инструкции можно найти на сайте The DAO Refunds .



Заметки

  • Этот контракт на вывод средств позволяет конвертировать только токены DAO (DAO) в эфиры (ETH) по курсу 100 DAO = 1 ETH.
  • То, как был закодирован контракт на снятие средств, означает, что вы ДОЛЖНЫ одобрить передачу ВСЕХ DAO в своей учетной записи, поскольку контракт на снятие средств будет передавать ВСЕ ваши DAO за один раз. Если вы не одобрите передачу всех ваших DAO, withdraw()функция выдаст ошибку, потребляющую весь газ, указанный в транзакции.
  • Любой, кто купил DAO в течение последних двух недель этапа краудфандинга The DAO, заплатил более 1 ETH за 100 DAO. Сумма, превышающая 1 ETH на 100 DAO, хранилась на счету ExtraBalance DAO . Баланс учетной записи extraBalance переведен в мультиподписной кошелек куратора.

    Для покупателей, заплативших более 1 ETH за 100 DAO, предусмотрен отдельный процесс возврата дополнительной уплаченной суммы (свыше 1 ETH за 100 DAO). Этот процесс не рассматривается в этом ответе, но будьте уверены, что разработчики изо всех сил стараются справедливо распределить избыточные средства между первоначальными покупателями DAO.

    См. Как мне получить возмещение за сумму, которую я заплатил сверх 1 эфира за 100 токенов DAO , которые будут обновлены, когда будут объявлены дополнительные подробности.

  • Если вы выполнили законное отделение от The DAO, ваш баланс DAO был перемещен в дочерний DAO, а ваш баланс DAO в The DAO обнулен. Поскольку ваш баланс DAO в The DAO равен нулю, вы не сможете конвертировать свои DAO в ETH, используя процедуру, описанную в этом разделе вопросов и ответов.

    См. Как получить возмещение за мои токены The DAO, которые были разделены на дочерний DAO? так как вам нужно будет связаться с TheDAOCurator, чтобы они организовали возврат средств.

  • Подождите некоторое время после хардфорка, прежде чем пытаться конвертировать ваши DAO в ETH. Крайнего срока для снятия средств нет. Безопаснее всего ждать.

Обновление 06:33, 26 октября 2016 г. Некоторые транзакции DAO -> ETH не выполняются из-за ошибок округления. См. Почему не удается вернуть средства с DAO на ETH? .



Способ вывода 1 - MyEtherWallet

  1. Перейдите на http://www.myetherwallet.com/#the-dao.

  2. Загрузите/вставьте файл хранилища ключей/закрытый ключ, чтобы получить доступ к кошельку.

  3. Нажмите большую красную кнопку.

  4. Подтвердите, что вы уверены, что хотите выйти.

  5. Подождите пару секунд, и появятся 2 ссылки на транзакции. Подождите еще около 30 секунд и проверьте баланс своего счета на Etherscan. У вас должно быть больше ETH и 0 DAO. Я (@tayvano) подтвердил, что это сработало в 6:43 утра по тихоокеанскому времени, используя учетную запись для пожертвований MyEtherWallet: http://etherscan.io/address/0x7cb57b5a97eabe94205c07890be4c1ad31e486a8 .



Метод вывода средств 2 — кошелек Ethereum

В статье Гриффа Грина «Как использовать контракт на снятие средств с Mist » (с циркулярной ссылкой) представлено пошаговое руководство, напечатанное на экране, аналогичное приведенным ниже инструкциям.

Убедитесь, что вы загрузили Ethereum Wallet 0.8.1 или более позднюю версию.

При первом запуске Ethereum Wallet 0.8.1 выберите «Да» на вопрос «Хотите ли вы активировать цепочку, в которой средства, связанные с эксплойтом, восстанавливаются в контракт, где они могут быть сняты держателями токенов The DAO?» . Теперь вы сделали выбор в пользу использования хард-форка Ethereum.

Если Ethereum Wallet зависает, см. ОБНОВЛЕНИЕ от 23 июля 2016 г. в разделе Как удалить контракт DAO из списка наблюдения Ethereum Wallet (Mist), поскольку он зависает? .

Если вы еще не добавили часы на контракт The DAO, см. The DAO — Как добавить и посмотреть контракт DAO . Этот шаг даст вам доступ для утверждения перевода DAO в контракт на снятие средств.

Если вы не можете найти функцию « Утвердить », как требуется ниже, перезагрузите интерфейс JSON для контракта DAO, выполнив действия, описанные непосредственно выше. Если у вас возникли проблемы с использованием кошелька Ethereum с зависанием дисплея, попробуйте удалить контракт DAO из кошелька Ethereum ( Как удалить контракт DAO из списка наблюдения кошелька Ethereum (Mist), поскольку он зависает? ), затем снова просмотрите контракт DAO. .

Добавьте часы в контракт на вывод средств The DAO. Используйте ту же процедуру, что и в ссылке прямо выше, но установите:

  • Название контракта:The DAO Withdrawal
  • Адрес контракта:0xbf4ed7b27f1d666546e30d74d50d173d20bca754
  • JSON-интерфейс:[{"constant":false,"inputs":[],"name":"trusteeWithdraw","outputs":[],"type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"mainDAO","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"trustee","outputs":[{"name":"","type":"address"}],"type":"function"}]

23:47 20/07/2016 AEST — я подтвердил, что описанный ниже процесс с использованием кошелька Ethereum работает

Одобрите перевод ваших DAO на контракт о снятии средств

  1. Получите адрес учетной записи, с которого вы хотите конвертировать свои DAO в ETH.

    • В меню «Кошелек» выберите учетную запись, из которой вы хотите конвертировать DAO в ETH.
    • Дважды щелкните адрес учетной записи и скопируйте адрес в буфер обмена, используя Control-C в Linux или Windows или Command-C на MacBook.
  2. Получите баланс счета, с которого вы хотите конвертировать свои DAO в ETH.

    • В меню «Контракт» выберите «Контракт DAO».
    • Прокрутите вниз до функции « Баланс» в столбце «Читать из контракта» слева.
    • Вставьте адрес из буфера обмена в поле адреса владельца .
    • Дважды щелкните отображаемый баланс и скопируйте баланс в буфер обмена, используя Control-C в Linux или Windows, или Command-C на MacBook.
  3. Подтвердите перевод баланса DAO вашей учетной записи на адрес контракта на вывод средств.

    • В меню «Контракт» выберите «Контракт DAO».
    • В столбце «Запись в контракт» справа выберите функцию « Утвердить ».
    • Вставьте баланс из буфера обмена в целочисленное поле с 256-битным числом без знака, используя Control-V в Linux или Windows или Command-V на MacBook.
    • Введите адрес контракта 0xbf4ed7b27f1d666546e30d74d50d173d20bca754на вывод средств в поле адрес траты.
    • В поле Execute from выберите учетную запись, из которой вы хотите конвертировать свои DAO в ETH.
    • Оставьте поле « Отправить ETHER» равным 0.
    • Нажмите «Выполнить» и введите пароль своей учетной записи.
    • Вы должны получить сообщение о подтверждении транзакции.

Выполнение функции контракта на вывод средств

  1. Вывод ETH из контракта на вывод средств

    • В меню «Контракт» выберите «Контракт на вывод средств DAO».
    • В столбце Write To Contract справа выберите функцию снятия .
    • В поле Execute from выберите учетную запись, из которой вы хотите конвертировать свои DAO в ETH.
    • Нажмите «Выполнить» и введите пароль своей учетной записи.
    • Вы должны получить сообщение о подтверждении транзакции.
    • Подождите немного, и ваш эфирный баланс должен обновиться. Если нет, перезапустите кошелек Ethereum.



Метод вывода 3 -geth

Убедитесь, что вы используете gethверсию 1.4.10 или более позднюю. И запускайте свои gethкоманды с --support-dao-forkопцией, чтобы вы находились на хард-форке блокчейна. Например:

geth --support-dao-fork console

Параметр --support-dao-forkсохраняется между отдельными запусками geth, поэтому вам нужно указать этот параметр только один раз.

Подтвердите свою gethверсию с помощью

user@Kumquat:~$ geth version
Geth
Version: 1.4.10-stable
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.5.1
OS: linux

Вот процесс, используемый gethдля конвертации ваших DAO в ETH для вашей учетной записи {x}.

00:14 21/07/2016 AEST — я подтвердил, что описанный ниже процесс с использованием gethработает

geth --support-dao-fork --unlock {your account} console
...
Unlocking account {your account}
Passhrase: {enter your passphrase}
// Allow your blockchain to sync

> var account = "{your account}";
undefined

> var theDAOAddress = "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413";
undefined

> var theDAOWithdrawalAddress = "0xbf4ed7b27f1d666546e30d74d50d173d20bca754";
undefined

> var theDAOABIFragment = [{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"type":"function"}, {"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"type":"function"}];
undefined

> var theDAO = web3.eth.contract(theDAOABIFragment).at(theDAOAddress);
undefined

> var approve = theDAO.approve(theDAOWithdrawalAddress, theDAO.balanceOf(account), {from: account});
undefined

> eth.getTransaction(approve);
// Repeat the command above until you see that blockNumber is not null

// Wait a few blocks (~ 15 seconds each) for your approve transaction to get mined

> var theDAOWithdrawalABIFragment = [{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"type":"function"}];
undefined

> var theDAOWithdrawal = web3.eth.contract(theDAOWithdrawalABIFragment).at(theDAOWithdrawalAddress);
undefined

> var withdrawal = theDAOWithdrawal.withdraw({from: account});
undefined

> eth.getTransaction(withdrawal);
// Repeat the command above until you see that blockNumber is not null

// Wait a few blocks (~15 second each) and check your new account balance
web3.fromWei(eth.getBalance(account), "ether")
11.023456789012345678



Метод вывода средств 4 — кошелек Ethereum в режиме браузера Mist

Убедитесь, что вы загрузили Ethereum Wallet 0.8.1 или более позднюю версию.

При первом запуске Ethereum Wallet 0.8.1 выберите «Да» на вопрос «Хотите ли вы активировать цепочку, в которой средства, связанные с эксплойтом, восстанавливаются в контракт, где они могут быть сняты держателями токенов The DAO?» . Теперь вы сделали выбор в пользу использования хард-форка Ethereum. Выход из кошелька Ethereum.

Теперь запустите кошелек Ethereum в режиме браузера Mist, используя следующую команду из подкаталога, в который вы установили программное обеспечение:

  • В Linux и MacBook

    ./Ethereum-Wallet --mode mist & 
    
  • В Windows

    Ethereum-Wallet --mode mist
    

(В качестве альтернативы вы можете загрузить браузер Mist напрямую — см. @johnmardlinответ ниже).

Затем:

  1. Убедитесь, что вы выбрали только ту учетную запись, которую вы использовали для покупки токенов «DAO».
  2. В Mist перейдите по ссылке https://slacknation.github.io/medium/12/12.html.
  3. Нажмите «Подтвердить», дождитесь одного блока
  4. Нажмите «Возврат», подождите один блок

введите описание изображения здесь

(Добавлен метод 4 по просьбе @slacknation в https://www.reddit.com/r/ethereum/comments/4tx13d/how_do_i_withdraw_dao_tokens_eth_after_hf_update/ )



Объяснение процесса вывода средств

Существует двухэтапный процесс конвертации ваших DAO в ETH.

а) Утвердить перевод DAO из DAO в договор о снятии средств

Первый шаг — одобрить перенос DAO из DAO в договор о снятии средств. Это делается путем вызова approve(...)функции DAO, указанной ниже:

Вот определение функции TokenInterface.approve() из исходного кода DAO :

/// @notice `msg.sender` approves `_spender` to spend `_amount` tokens on
/// its behalf
/// @param _spender The address of the account able to transfer the tokens
/// @param _amount The amount of tokens to be approved for transfer
/// @return Whether the approval was successful or not
function approve(address _spender, uint256 _amount) returns (bool success);

Вот функция Token.approve(...), которая реализует функцию, определенную выше:

function approve(address _spender, uint256 _amount) returns (bool success) {
    allowed[msg.sender][_spender] = _amount;
    Approval(msg.sender, _spender, _amount);
    return true;
}

После того, как вы вызвали функцию утверждения (...) DAO, вы создали утверждение для контракта на снятие средств, чтобы перевести ваши DAO в контракт на снятие средств.


б) Конвертируйте свои DAO в ETH с помощью контракта на вывод средств

Второй шаг — вызвать withdraw()функцию контракта на снятие средств для перевода DAO из DAO в контракт на снятие средств, а для контракта на снятие средств отправить на ваш счет эквивалентную сумму в ETH.

Вот исходный код withdraw()функции:

function withdraw(){
    uint balance = mainDAO.balanceOf(msg.sender);

    if (!mainDAO.transferFrom(msg.sender, this, balance) || !msg.sender.send(balance))
        throw;
}



Источник информации

Пользователь @lefteris на thedao.slack.com заявил, что контракт на вывод средств DAO можно найти по адресу 0xbf4ed7b27f1d666546e30d74d50d173d20bca754, а процесс преобразования DAO в ETH следующий:

a) call dao.approve("0xbf4ed7b27f1d666546e30d74d50d173d20bca754", dao.balanceOf(youraccount))
b) call withdrawContract.withdraw()



Исходный код и адрес контракта на вывод средств

Исходный код контракта на снятие средств находится по адресу 0xbf4ed7b27f1d666546e30d74d50d173d20bca754 и выглядит следующим образом:

contract DAO {
    function balanceOf(address addr) returns (uint);
    function transferFrom(address from, address to, uint balance) returns (bool);
    uint public totalSupply;
}

contract WithdrawDAO {
    DAO constant public mainDAO = DAO(0xbb9bc244d798123fde783fcc1c72d3bb8c189413);
    address public trustee = 0xda4a4626d3e16e094de3225a751aab7128e96526;

    function withdraw(){
        uint balance = mainDAO.balanceOf(msg.sender);

        if (!mainDAO.transferFrom(msg.sender, this, balance) || !msg.sender.send(balance))
            throw;
    }

    function trusteeWithdraw() {
        trustee.send((this.balance + mainDAO.balanceOf(this)) - mainDAO.totalSupply());
    }
}

Из исходного кода DAO (упомянутого выше) вот Token.transferFrom(...)функция:

function transferFrom(
    address _from,
    address _to,
    uint256 _amount
) noEther returns (bool success) {

    if (balances[_from] >= _amount
        && allowed[_from][msg.sender] >= _amount
        && _amount > 0) {

        balances[_to] += _amount;
        balances[_from] -= _amount;
        allowed[_from][msg.sender] -= _amount;
        Transfer(_from, _to, _amount);
        return true;
    } else {
        return false;
    }
}



Некоторые дополнительные ссылки

Когда я пытаюсь выполнить функцию вывода по контракту на вывод средств DAO из MIST, у меня возникает проблема с ограниченным газом: предоставленная максимальная комиссия равна 0 газу. Как мы можем выбрать максимальное количество газа, которое будет использоваться при выполнении контрактной функции?
Убедитесь, что ваша цепочка синхронизирована с etherscan.io , и вы можете попробовать перезапустить Mist.
Привет, я проверил, и действительно, последний блок в моем тумане — 1936946, а последний блок на etherscan.io — 1943316. Как заставить туман синхронизироваться? Я перезапустил Mist, но ничего не произошло. Возможно ли, что я не на той цепи? Флаг daoFork установлен в true. Есть ли другой способ подтвердить, что я нахожусь в правильной цепочке?
Вы окажетесь в правильной цепочке, если номер вашего блока совпадает с etherscan.io. Вот сайт, который сообщит вам самый высокий номер блока для разветвленных и неразветвленных цепочек — fork.ethstats.net .
Могу подтвердить, что процесс Ethereum Wallet работает для меня.
Для процесса кошелька Ethereum, когда я пытаюсь «одобрить» контракт DAO, поле «Выполнить из» недоступно для нажатия и не принимает никаких входных данных. Любые идеи?
Убедитесь, что ваш EW синхронизируется правильно. Недавно произошла спам-атака — см. ethereum.stackexchange.com/questions/8782/…
должен ли метод geth по-прежнему работать 1.5.9? я получаю сообщение flag provided but not defined: -support-dao-forkоб ошибке
См. theethereum.wiki/w/index.php/The_DAO_Refunds для получения последней информации.

Это довольно простой метод с использованием Mist .

  1. Убедитесь, что вы выбрали только ту учетную запись, которую вы использовали для покупки токенов «DAO».
  2. В Mist перейдите по ссылке https://slacknation.github.io/medium/12/12.html.
  3. Нажмите « Подтвердить », подождите один блок
  4. Нажмите « Возврат », подождите один блок
Я следую инструкциям по выводу из последней версии кошелька тумана. Проблема в том, что когда я пытаюсь выбрать функцию «одобрить», мои единственные варианты — «создать токен-прокси» и «голосовать». Любая идея, почему я не могу использовать функцию «одобрить»? Спасибо
Перезагрузите интерфейс The DAO JSON, как показано на странице daowiki.atlassian.net/wiki/display/DAO/… . Модератор, не могли бы вы преобразовать ответ выше в комментарий. Спасибо.
Я добавил Метод 4 — Туман в основной ответ по запросу на reddit.com/r/ethereum/comments/4tx13d/… . Хорошо сделано!
Для общего блага... i.imgur.com/XHFzY39.png
Но я не согласен с просьбой преобразовать в комментарий.
@johnmardlin, первый комментарий выше был изначально отправлен как отдельный ответ, потому что у пользователя не было очков репутации, чтобы добавить комментарий. Второй комментарий выше должен был преобразовать ответ пользователя в комментарий, но оба эти утверждения были случайно добавлены к вашему ответу.
Наибольшее преимущество программных ошибок состоит в том, что они делают субъективную природу реальности неоспоримой.
Если Ethereum хочет добиться успеха, ему придется научиться быть удобным для пользователя. Я наткнулся на токены DAO в кошельке, который у меня был, никогда не было так много проблем с Crypto. MyEtherWallet удалил их возврат, реализация версии с выводом dao, размещенной на EtherScan, нарушена (ошибки JS), возврат кошелька Jaxx нарушен, и ваши инструкции для Mist больше не актуальны, упомянутые функции не отображаются существуют в договоре.