¿Puedo votar más de una vez por cada propuesta de The DAO?

Una persona ha declarado en el hilo del Foro DAO Ha comenzado la votación que ha podido votar más de una vez sobre una propuesta.

¿Puedo votar más de una vez por cada propuesta de The DAO?

Respuestas (1)

La siguiente es la función del código fuentevote() de The DAO .

function vote(
    uint _proposalID,
    bool _supportsProposal
) onlyTokenholders noEther returns (uint _voteID) {

    Proposal p = proposals[_proposalID];
    if (p.votedYes[msg.sender]
        || p.votedNo[msg.sender]
        || now >= p.votingDeadline) {

        throw;
    }

    if (_supportsProposal) {
        p.yea += balances[msg.sender];
        p.votedYes[msg.sender] = true;
    } else {
        p.nay += balances[msg.sender];
        p.votedNo[msg.sender] = true;
    }

    if (blocked[msg.sender] == 0) {
        blocked[msg.sender] = _proposalID;
    } else if (p.votingDeadline > proposals[blocked[msg.sender]].votingDeadline) {
        // this proposal's voting deadline is further into the future than
        // the proposal that blocks the sender so make it the blocker
        blocked[msg.sender] = _proposalID;
    }

    Voted(_proposalID, _supportsProposal, msg.sender);
}

La primera declaración condicional en la vote()función:

if (p.votedYes[msg.sender]
    || p.votedNo[msg.sender]
    || now >= p.votingDeadline) {

    throw;
}

cancelará su transacción ( throw) si su cuenta ya ha votado ( p.votedYes[msg.sender]) o No ( p.votedNo[msg.sender]) en una propuesta.

Su transacción también se cancelará si vota después de la fecha límite de votación de la propuesta ( now >= p.votingDeadline).

Se gastará un poco de gas (éter) cuando se cancele su transacción.



Probando mi hipótesis

Aquí hay dos transacciones que envían votos para la misma propuesta desde la misma cuenta:

Estas dos transacciones son ambas llamadas a la vote()función, ya que la firma que usa web3.sha3('vote(uint256,bool)').substr(0, 10)produce el resultado 0xc9d27afeque coincide con el inicio de los datos de entrada en ambas transacciones.

Y aquí está la segunda transacción que muestra la cancelación de la transacción.ingrese la descripción de la imagen aquí

La tarifa de la primera transacción fue de 0,001489425 éter, y la tarifa de la segunda transacción cancelada fue de 0,00315 éter. Tenga en cuenta que la segunda transacción cancelada costó más que la primera transacción exitosa.



MyEtherWallet Vs Monedero Ethereum (Niebla)

Actualización de resultados de un útil usuario anónimo del foro DAOHub:

  • MyEtherWallet actualmente le permitirá votar más de una vez sobre la misma propuesta desde la misma cuenta.
  • Ethereum Wallet (Mist) le informará después de su primer voto que la cuenta está bloqueada. Si elige continuar, le muestra un mensaje "Los datos no se pueden ejecutar, por lo que utilizará todo el gas proporcionado" antes de ejecutar la transacción.
"MyEtherWallet actualmente le permitirá votar más de una vez sobre la misma propuesta desde la misma cuenta". <- Trabajando en cómo arreglar esto. Es una solución divertida que podría interesarle: llame a la función de voto con la función estimarGas(). Si se usa todo el gas, significa que se lanzará una Excepción, por lo que el usuario ya votó o no se permite al usuario o se llega al final del período de debate.
Tienes razón en que estimateGas()me puede interesar (¿soy tan predecible?). Ahora he creado un script de Perl para listar propuestas, listar el estado de votación de cada cuenta contra las propuestas y votar sobre las propuestas, desde la línea de comando. Uso del estimateGas()método para verificar el estado de la votación. Consulte github.com/bokkypoobah/TheDAOVoter/blob/master/theDAOVoter . Gracias @tayvano.