El contrato DAO fue atacado el 17 de junio de 2016, donde el atacante drenó alrededor de USD 50 millones en éteres utilizando una vulnerabilidad de llamada recursiva en el código del contrato DAO.
El atacante vació los éteres robados en unos pocos DAO infantiles y el Grupo Robin Hood vació los fondos restantes en otros DAO infantiles.
Una bifurcación dura está programada para el bloque #1,920,000 (en aproximadamente 24 horas, ~ 23:26 20/07/2016 hora estándar del este de Australia) para transferir los éteres del contrato DAO y sus DAO secundarios a un contrato de retiro.
Una vez que ha pasado la bifurcación dura, ¿cómo convierto mis tokens The DAO en éteres?
El contrato de Retiro tiene un saldo de 11.597.664,781027947 Ether ($145.318.739,71).
Una bifurcación dura exitosa. ¡Feliz bifurcación dura a todos! Buen trabajo Devs y otros involucrados.
El contrato de Retiro ahora tiene un saldo de 6,369,298.685677664 Ether ($79,807,312.53). Alrededor del 45% de los DAO ahora se han convertido en ETH, más de 1506 transacciones.
El contrato de Retiro ahora tiene un saldo de 4,595,418.245476871 Ether ($65,944,251.82). Alrededor del 60% de los DAO ahora se han convertido en ETH, más de 3887 transacciones.
Aquí hay un gráfico de https://slacknation.github.io/medium/11/11.html :
13.55% saldo restante.
Las instrucciones más recientes se pueden encontrar en The DAO Refunds .
withdraw()
función generará un error y consumirá todo el gas especificado con la transacción.Cualquiera que haya comprado DAO en las últimas dos semanas de la fase de financiación colectiva de DAO pagó más de 1 ETH por cada 100 DAO. La cantidad superior a 1 ETH por cada 100 DAO se almacenó en la cuenta extraBalance de la DAO . El saldo de la cuenta extraBalance ahora se ha transferido a la billetera multisig del curador.
Existe un proceso separado para los compradores que pagaron más de 1 ETH por 100 DAO para que se les reembolse el monto adicional pagado (más de 1 ETH por 100 DAO). Este proceso no está cubierto en esta respuesta, pero tenga la seguridad de que los desarrolladores están haciendo todo lo posible para distribuir de manera justa el exceso de fondos a los compradores originales de DAO.
Consulte ¿Cómo obtengo un reembolso por el monto que pagué en exceso de 1 éter a 100 tokens DAO?, que se actualizará cuando se anuncien más detalles.
Si ha ejecutado una división legítima de The DAO, su saldo de DAO se ha movido al DAO secundario y su saldo de DAO en The DAO se pone a cero. Como su saldo de DAO en The DAO es cero, no podrá convertir sus DAO en ETH utilizando el procedimiento de esta sección de preguntas y respuestas.
Consulte ¿Cómo obtengo un reembolso por mis tokens The DAO que se dividieron en un DAO secundario? ya que deberá ponerse en contacto con TheDAOCurator para que organicen su reembolso.
Espere un tiempo después de la bifurcación dura antes de intentar convertir sus DAO en ETH. No hay fecha límite para los retiros. Lo más seguro es esperar.
Actualización 06:33 Oct 26 2016 Algunas transacciones DAO -> ETH están fallando debido a errores de redondeo. Consulte ¿Por qué fallan mis reembolsos de DAO a ETH? .
Cargue / pegue su archivo Keystore / Clave privada para acceder a su billetera.
Pulse el botón rojo grande.
Confirme que está seguro de que desea retirarse.
Espere un par de segundos y aparecerán 2 enlaces de transacción. Espere unos 30 segundos más y verifique el saldo de su cuenta en Etherscan. Deberías tener más ETH y 0 DAO. Yo (@tayvano) confirmé que funcionó a las 6:43 p .
El artículo (referenciado circularmente) Cómo usar el contrato de retiro con niebla de Griff Green proporciona una guía serigrafiada paso a paso similar a las instrucciones a continuación.
Asegúrese de haber descargado Ethereum Wallet 0.8.1 o posterior.
La primera vez que inicie Ethereum Wallet 0.8.1, seleccione "Sí" a la pregunta "¿Desea activar la cadena en la que los fondos vinculados al exploit se restauran a un contrato donde los titulares de tokens DAO pueden retirarlos?" . Ahora ha tomado la decisión de utilizar la cadena Ethereum bifurcada.
Si Ethereum Wallet se está congelando, consulte la ACTUALIZACIÓN del 23 de julio de 2016 en ¿Cómo eliminar el contrato DAO de la lista de vigilancia de Ethereum Wallet (Mist) ya que se está congelando? .
Si aún no ha agregado un reloj en el contrato DAO, consulte The DAO: cómo agregar y ver el contrato DAO . Este paso te dará acceso para aprobar la transferencia de DAOs al contrato de Retiro.
Si no puede encontrar la función Aprobar como se requiere a continuación, vuelva a cargar la interfaz JSON para el contrato DAO siguiendo los pasos inmediatamente anteriores. Si tiene problemas para usar la billetera Ethereum con una pantalla congelada, intente eliminar el contrato DAO de la billetera Ethereum ( ¿Cómo eliminar el contrato DAO de la lista de observación de la billetera Ethereum (Mist) ya que se está congelando? ), luego mire el contrato DAO nuevamente .
Agregue un reloj en el contrato de retiro de DAO. Use el mismo procedimiento que en el enlace directamente arriba, pero configure:
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 - He confirmado que el siguiente proceso con Ethereum Wallet funciona
Obtenga la dirección de la cuenta desde la que desea convertir sus DAO en ETH
Obtenga el saldo de la cuenta desde la que desea convertir sus DAO en ETH
Aprobar la transferencia del saldo DAO de tu cuenta a la dirección del contrato de Retiro
0xbf4ed7b27f1d666546e30d74d50d173d20bca754
en el campo de dirección del gasto .Retirar ETH del contrato de Retiro
geth
Asegúrese de estar ejecutando la geth
versión 1.4.10 o posterior. Y ejecute sus geth
comandos con la --support-dao-fork
opción para que esté en la cadena de bloques bifurcada. Por ejemplo:
geth --support-dao-fork console
La --support-dao-fork
configuración persiste entre ejecuciones separadas de geth
, por lo que solo tiene que especificar este parámetro una vez.
Confirme su geth
versión usando
user@Kumquat:~$ geth version
Geth
Version: 1.4.10-stable
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.5.1
OS: linux
Este es el proceso que se utiliza geth
para convertir sus DAO en ETH para su cuenta {x}
.
00:14 21/07/2016 AEST - He confirmado que el siguiente proceso geth
funciona
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
Asegúrese de haber descargado Ethereum Wallet 0.8.1 o posterior.
La primera vez que inicie Ethereum Wallet 0.8.1, seleccione "Sí" a la pregunta "¿Desea activar la cadena en la que los fondos vinculados al exploit se restauran a un contrato donde los titulares de tokens DAO pueden retirarlos?" . Ahora ha tomado la decisión de utilizar la cadena Ethereum bifurcada. Salga de Ethereum Wallet.
Ahora ejecute Ethereum Wallet en el modo de navegador Mist usando el siguiente comando del subdirectorio en el que instaló el software:
En Linux y MacBook
./Ethereum-Wallet --mode mist &
en ventanas
Ethereum-Wallet --mode mist
(Alternativamente, puede descargar el navegador Mist directamente ; vea la @johnmardlin
respuesta a continuación).
Después:
(Método 4 agregado según lo solicitado por @slacknation en https://www.reddit.com/r/ethereum/comments/4tx13d/how_do_i_withdraw_dao_tokens_eth_after_hf_update/ )
Hay un proceso de dos pasos para convertir sus DAO en ETH.
El primer paso es aprobar la transferencia de DAO de The DAO al contrato de retiro. Esto se hace llamando a la approve(...)
función de DAO, que se detalla a continuación:
Desde el código fuente de DAO , aquí está la definición de la función 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);
Aquí está la función Token.approve(...) que implementa la función definida anteriormente:
function approve(address _spender, uint256 _amount) returns (bool success) {
allowed[msg.sender][_spender] = _amount;
Approval(msg.sender, _spender, _amount);
return true;
}
Una vez que haya llamado a la función de aprobación (...) de la DAO, habrá creado una aprobación para el contrato de Retiro para transferir sus DAO al contrato de Retiro.
El segundo paso es llamar a la withdraw()
función del contrato de Retiro para transferir los DAO desde el DAO al contrato de Retiro, y para que el contrato de Retiro envíe a su cuenta la cantidad equivalente en ETH.
Aquí está el código fuente de la withdraw()
función:
function withdraw(){
uint balance = mainDAO.balanceOf(msg.sender);
if (!mainDAO.transferFrom(msg.sender, this, balance) || !msg.sender.send(balance))
throw;
}
El usuario @lefteris en thedao.slack.com declaró que el contrato de retiro de DAO se puede encontrar en 0xbf4ed7b27f1d666546e30d74d50d173d20bca754 y el proceso para convertir DAO en ETH es el siguiente:
a) call dao.approve("0xbf4ed7b27f1d666546e30d74d50d173d20bca754", dao.balanceOf(youraccount)) b) call withdrawContract.withdraw()
El código fuente del contrato de retiro se puede encontrar en 0xbf4ed7b27f1d666546e30d74d50d173d20bca754 y es el siguiente:
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());
}
}
Desde el código fuente de DAO (mencionado anteriormente), aquí está la Token.transferFrom(...)
función:
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
? estoy recibiendo un flag provided but not defined: -support-dao-fork
errorEste es un método bastante sencillo usando Mist .
mazzydan
privacidadisahumanright.eth