¿Cómo convierto mis tokens The DAO en ethers usando el contrato de retiro después de la bifurcación dura?

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?



Los reembolsos de DAO



Actualización 13:31 20 de julio de 2016 UTC

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.

Actualización 22:31 20 de julio de 2016 UTC

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.

Actualización 18:04 23 de julio de 2016 UTC

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 :ingrese la descripción de la imagen aquí

Actualización 23:18 1 de agosto de 2016 UTC

ingrese la descripción de la imagen aquí

Actualización 14:58 6 de septiembre de 2016 UTC

13.55% saldo restante.

ingrese la descripción de la imagen aquí

¿Puede vincular al "proceso separado para compradores que pagaron más de 1 ETH por 100 DAO para que se les reembolse el monto adicional pagado"?
Consulte ¿Cómo obtengo un reembolso por el monto que pagué en exceso de 1 ether a 100? Los tokens DAO que se espera que se aclaren a principios de la próxima semana.

Respuestas (2)

Actualización 29 de marzo de 2017

Las instrucciones más recientes se pueden encontrar en The DAO Refunds .



notas

  • Este contrato de Retiro solo permite la conversión de tokens The DAO (DAO) en ethers (ETH) a razón de 100 DAOs = 1 ETH.
  • La forma en que se ha codificado el contrato de retiro significa que DEBE aprobar la transferencia de TODOS los DAO en su cuenta, ya que el contrato de retiro solo transferirá TODOS sus DAO de una sola vez. Si no aprueba la transferencia de todos sus DAO, la 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? .



Método de retiro 1 - MyEtherWallet

  1. Vaya a http://www.myetherwallet.com/#the-dao

  2. Cargue / pegue su archivo Keystore / Clave privada para acceder a su billetera.

  3. Pulse el botón rojo grande.

  4. Confirme que está seguro de que desea retirarse.

  5. 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 .



Método de retiro 2 - Ethereum Wallet

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:

  • Nombre del contrato:The DAO Withdrawal
  • Dirección del contrato:0xbf4ed7b27f1d666546e30d74d50d173d20bca754
  • Interfaz 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 - He confirmado que el siguiente proceso con Ethereum Wallet funciona

Aprueba la Transferencia de tus DAOs al Contrato de Retiro

  1. Obtenga la dirección de la cuenta desde la que desea convertir sus DAO en ETH

    • En el menú Monedero, seleccione la cuenta desde la que desea convertir DAO en ETH.
    • Haga doble clic en la dirección de la cuenta y copie la dirección en su portapapeles usando Control-C en Linux o Windows, o Command-C en una MacBook.
  2. Obtenga el saldo de la cuenta desde la que desea convertir sus DAO en ETH

    • En el menú Contrato, seleccione El contrato DAO.
    • Desplácese hacia abajo hasta el Saldo de la función en la columna Leer del contrato a la izquierda.
    • Pegue la dirección en su portapapeles en el campo de dirección del propietario .
    • Haga doble clic en el Saldo que se muestra y copie el saldo en su portapapeles usando Control-C en Linux o Windows, o Comando-C en una MacBook.
  3. Aprobar la transferencia del saldo DAO de tu cuenta a la dirección del contrato de Retiro

    • En el menú Contrato, seleccione El contrato DAO.
    • En la columna Escribir para contrato a la derecha, seleccione la función Aprobar .
    • Pegue el saldo de su portapapeles en el campo entero sin signo de 256 bits usando Control-V en Linux o Windows, o Command-V en una MacBook.
    • Ingrese la dirección del contrato de retiro 0xbf4ed7b27f1d666546e30d74d50d173d20bca754en el campo de dirección del gasto .
    • En el campo Ejecutar desde , seleccione la cuenta desde la que desea convertir sus DAO en ETH.
    • Deje el campo Enviar ETHER como 0.
    • Haga clic en Ejecutar e ingrese la contraseña de su cuenta.
    • Debería recibir un mensaje de confirmación de la transacción.

Ejecutar la función de contrato de retiro

  1. Retirar ETH del contrato de Retiro

    • En el menú Contrato, seleccione El contrato de Retiro DAO
    • En la columna Escribir para contrato a la derecha, seleccione la función Retirar .
    • En el campo Ejecutar desde , seleccione la cuenta desde la que desea convertir sus DAO en ETH.
    • Haga clic en Ejecutar e ingrese la contraseña de su cuenta.
    • Debería recibir un mensaje de confirmación de la transacción.
    • Espere un momento y su saldo de éter debería actualizarse. De lo contrario, reinicie Ethereum Wallet.



Método de retiro 3 -geth

Asegúrese de estar ejecutando la gethversión 1.4.10 o posterior. Y ejecute sus gethcomandos con la --support-dao-forkopción para que esté en la cadena de bloques bifurcada. Por ejemplo:

geth --support-dao-fork console

La --support-dao-forkconfiguración persiste entre ejecuciones separadas de geth, por lo que solo tiene que especificar este parámetro una vez.

Confirme su gethversió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 gethpara convertir sus DAO en ETH para su cuenta {x}.

00:14 21/07/2016 AEST - He confirmado que el siguiente proceso gethfunciona

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



Método de retiro 4: billetera Ethereum en modo navegador Mist

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 @johnmardlinrespuesta a continuación).

Después:

  1. Asegúrese de haber seleccionado solo la cuenta que utilizó para comprar tokens "The DAO".
  2. En Mist, vaya a https://slacknation.github.io/medium/12/12.html
  3. Haga clic en "Aprobar", espere un bloque
  4. Haga clic en "Reembolso", espere un bloque

ingrese la descripción de la imagen aquí

(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/ )



Explicación del proceso de retiro

Hay un proceso de dos pasos para convertir sus DAO en ETH.

a) Aprobar La Transferencia De DAOs De La DAO Al Contrato De Retiro

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.


b) Convierta sus DAO en ETH con el 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;
}



Fuente de información

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()



Código fuente y dirección del contrato de retiro

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



Algunas referencias adicionales

Cuando trato de ejecutar la función de retiro en el contrato de retiro de DAO de MIST, tengo un problema con el gas limitado: la tarifa máxima provista es de 0 gas. ¿Cómo podemos elegir la cantidad máxima de gas a utilizar al ejecutar una función de contrato?
Verifique que su cadena esté sincronizada con etherscan.io y puede intentar reiniciar Mist.
Hola, verifiqué y, de hecho, el último bloque en mi niebla es 1936946, mientras que el último bloque en etherscan.io es 1943316. ¿Cómo se fuerza la niebla para sincronizar? Reinicié Mist pero no pasó nada. ¿Es posible que no esté en la cadena correcta? El indicador daoFork se establece en verdadero. ¿Hay alguna otra forma de confirmar que estoy en la cadena correcta?
Estará en la cadena correcta si su número de bloque coincide con etherscan.io. Aquí hay un sitio que le dirá el número de bloque más alto para cadenas bifurcadas y no bifurcadas: fork.ethstats.net .
Puedo confirmar que el proceso de Ethereum Wallet funciona para mí.
Para el proceso de Ethereum Wallet, cuando trato de "Aprobar" en el contrato DAO, no se puede hacer clic en el campo "Ejecutar desde" y no aceptará ninguna entrada. ¿Algunas ideas?
Verifique que su EW se esté sincronizando correctamente. Recientemente ha habido un ataque de spam: consulte ethereum.stackexchange.com/questions/8782/…
¿Debería seguir funcionando el método geth 1.5.9? estoy recibiendo un flag provided but not defined: -support-dao-forkerror
Consulte theethereum.wiki/w/index.php/The_DAO_Refunds para obtener la información más reciente.

Este es un método bastante sencillo usando Mist .

  1. Asegúrese de haber seleccionado solo la cuenta que utilizó para comprar tokens "The DAO".
  2. En Mist, vaya a https://slacknation.github.io/medium/12/12.html
  3. Haga clic en " Aprobar ", espere un bloque
  4. Haga clic en " Reembolso ", espere un bloque
Estoy siguiendo las instrucciones para retirarme de la última versión de la billetera de niebla. El problema es que cuando trato de elegir la función "aprobar", mis únicas opciones son "crear proxy de token" y "votar". ¿Alguna idea de por qué no puedo usar la función "aprobar"? Gracias
Vuelva a cargar su interfaz The DAO JSON como se muestra en daowiki.atlassian.net/wiki/display/DAO/… . Moderador, ¿podría convertir la respuesta anterior en un comentario? Gracias.
Agregué el Método 4 - Niebla en la respuesta principal según lo solicitado en reddit.com/r/ethereum/comments/4tx13d/… . ¡Buen trabajo!
Por el bien mayor... i.imgur.com/XHFzY39.png
Pero no estoy de acuerdo con la solicitud de convertir a un comentario.
@johnmardlin, el primer comentario anterior se envió originalmente como una respuesta separada porque el usuario no tenía los puntos de reputación para agregar un comentario. El segundo comentario anterior fue para convertir la respuesta del usuario en un comentario, pero ambas declaraciones se agregaron accidentalmente a su respuesta.
El mayor beneficio de los errores de software es hacer innegable la naturaleza subjetiva de la realidad.
Si Ethereum quiere tener éxito, tendrá que aprender a ser fácil de usar. Encontré tokens DAO en una billetera que tenía, nunca tuve tantos problemas con Crypto. MyEtherWallet eliminó su reembolso, la implementación de la versión que tiene el retiro de dao alojado en EtherScan está rota (errores de JS), el reembolso de la billetera Jaxx está roto y sus instrucciones para Mist ya no parecen ser relevantes, las funciones a las que se hace referencia no parecen existen en el contrato.