Контракт DAO подвергся атаке 17 июня 2016 года, когда злоумышленник похитил эфиры на сумму около 50 миллионов долларов США , используя уязвимость рекурсивного вызова в коде контракта DAO.
Злоумышленник слил украденные эфиры в несколько дочерних DAO, а группа Робин Гуда слила оставшиеся средства в другие дочерние DAO.
Для блока № 1 920 000 запланирован хард-форк (примерно через 24 часа, ~ 23:26 20 июля 2016 г. по восточному стандартному времени Австралии), чтобы перевести эфиры из контракта DAO и его дочерних DAO в контракт на вывод средств.
После того, как хард-форк пройдет, как мне конвертировать свои токены The DAO в эфиры?
Баланс контракта на снятие средств составляет 11 597 664,781027947 эфира (145 318 739,71 долларов США).
Успешный хардфорк. Всем счастливого хардфорка! Хорошая работа разработчиков и других участников.
Баланс контракта на вывод средств теперь составляет 6 369 298,685677664 эфира (79 807 312,53 долларов США). Около 45% DAO были конвертированы в ETH, более 1506 транзакций.
Баланс контракта на вывод средств теперь составляет 4 595 418,245476871 эфира (65 944 251,82 долларов США). В настоящее время около 60% DAO конвертированы в ETH, что составляет более 3887 транзакций.
Вот диаграмма с https://slacknation.github.io/medium/11/11.html :
Остаток 13,55%.
Последние инструкции можно найти на сайте The DAO Refunds .
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? .
Перейдите на http://www.myetherwallet.com/#the-dao.
Загрузите/вставьте файл хранилища ключей/закрытый ключ, чтобы получить доступ к кошельку.
Нажмите большую красную кнопку.
Подтвердите, что вы уверены, что хотите выйти.
Подождите пару секунд, и появятся 2 ссылки на транзакции. Подождите еще около 30 секунд и проверьте баланс своего счета на Etherscan. У вас должно быть больше ETH и 0 DAO. Я (@tayvano) подтвердил, что это сработало в 6:43 утра по тихоокеанскому времени, используя учетную запись для пожертвований MyEtherWallet: http://etherscan.io/address/0x7cb57b5a97eabe94205c07890be4c1ad31e486a8 .
В статье Гриффа Грина «Как использовать контракт на снятие средств с 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
[{"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 в ETH.
Получите баланс счета, с которого вы хотите конвертировать свои DAO в ETH.
Подтвердите перевод баланса DAO вашей учетной записи на адрес контракта на вывод средств.
0xbf4ed7b27f1d666546e30d74d50d173d20bca754
на вывод средств в поле адрес траты.Вывод ETH из контракта на вывод средств
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
Убедитесь, что вы загрузили 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
ответ ниже).
Затем:
(Добавлен метод 4 по просьбе @slacknation в https://www.reddit.com/r/ethereum/comments/4tx13d/how_do_i_withdraw_dao_tokens_eth_after_hf_update/ )
Существует двухэтапный процесс конвертации ваших DAO в ETH.
Первый шаг — одобрить перенос 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 в контракт на снятие средств.
Второй шаг — вызвать 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;
}
}
1.5.9
? я получаю сообщение flag provided but not defined: -support-dao-fork
об ошибкеЭто довольно простой метод с использованием Mist .
маззидан
конфиденциальностьisahumanright.eth