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

Договор DAO был атакован 17 июня 2016 года, когда атакующий слил около стоимостью в 50 миллионов долларов США , используя рекурсивная уязвимость вызова в коде контракта DAO.

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

A жесткий вилка запланировано на блок № 1920 000 (примерно в течение 24 часов, ~ 23:26 20/07/2016 Australian Eastern Time), чтобы перенести эфиры из контракта DAO, а это дочерние DAO в контракт на снятие средств.

Как только жесткая вилка прошла, как мне преобразовать токены DAO в простые эфиры?



Возврат DAO



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

контракт на снятие средств имеет баланс в 11 597 664,781027947 эфира ($ 145 318 739,71).

Успешная жесткая вилка. Happy Hard Fork Everyone! Хорошая работа Разработчики и другие участники.

Обновление 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

 введите описание изображения здесь>> </a> </p>

<h3> Обновление 14:58 6 сен 2016 UTC </h3>

Осталось <p> 13.55%. </p>

<p> <a href= введите описание изображения здесь>> </a> </p></body></html>

35 голосов | спросил The Officious BokkyPooBah 19 J000000Tuesday16 2016, 17:06:25

2 ответа


35

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

Последние инструкции можно найти на странице Возвраты DAO .



Примечания

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

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

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

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

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

  • Подождите некоторое время после жесткой вилки, прежде чем пытаться преобразовать DAO в ETH. Окончательного срока снятия нет. Самое безопасное занятие - подождать.

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



Метод вывода 1 - MyEtherWallet

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

  2. Загрузка /Вставка файла Keystore /Private Key для доступа к вашему кошельку.

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

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

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



Метод снятия 2 - Кошелек Ethereum

Статья (с круговой ссылкой) Ethereum Wallet 0.8.1 или позже.

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

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

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

Добавьте часы на договор о выводе 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».
    • Прокрутите вниз до функции Баланс в столбце Read From Contract слева.
    • Вставьте адрес в буфер обмена в поле владельца-адреса .
    • Дважды щелкните мышью на Баланс и скопируйте баланс в буфер обмена с помощью Control-C в Linux или Windows или Command-C на MacBook.
  3. Одобрить перевод баланса DAO вашей учетной записи на адрес контракта на снятие средств

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

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

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

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



Метод снятия 3 - geth

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

geth --support-dao-fork console

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

Подтвердите свою версию geth, используя

[email protected]:~$ 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 - Эфирный бумажник в режиме браузера Mist

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

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

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

  • В Linux & MacBook

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

    Ethereum-Wallet --mode mist
    

(Кроме того, вы можете загрузить Mist browser - см. @johnmardlin ниже).

Тогда:

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

 введите описание изображения здесь>> </a> </p>

<p> (Добавлен метод 4 по запросу @slacknation в <a href= https: //www.reddit.com/r/ethereum/comments/4tx13d/how_do_i_withdraw_dao_tokens_eth_after_hf_update/)



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

Существует два этапа для преобразования ваших DAO в ETH.

a) Одобрить передачу DAO из DAO в контракт на снятие средств

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

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

/// @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 в контракт на снятие средств.


b) Преобразуйте свои 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 в ETHs следующий:

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;
    }
}



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

ответил The Officious BokkyPooBah 19 J000000Tuesday16 2016, 17:06:25
3

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

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

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132