Requerimiento de gas de una función: desconocido o no constante

Esta es una función en mi contrato. Hay una observación compleja sobre esto, muestra una advertencia de que el requerimiento de gas es grande remix. Especulo que esta podría ser una de las razones por las que tuve problemas con el gas al intentar implementar usando truffle.

En primer lugar, necesito entender el problema.

function sendEther(string data) payable {
  address sender = msg.sender;
  uint value = msg.value;
  voter[sender].data = data;
  voter[sender].amount = value;
  voterIndex[voter_count] = sender;
  voter_count = voter_count + 1;
  Deposit(sender, value);
}

Nota: Encontré un problema similar en el que el usuario intentaba enviar una transacción que podría ser una dirección normal o un contrato y, por lo tanto, tenía el problema. Ni idea de por qué me pasa a mí.

EDITAR: La constantpalabra clave era un error tipográfico. Pero la pregunta real fue respondida precisamente a continuación.

Respuestas (1)

Dos cosas.

Primero, el uso de payabley constantjuntos es contradictorio. En segundo lugar, el uso de un stringsignifica que el tamaño de la carga útil de la transacción y el costo de almacenamiento son impredecibles, debido a la longitud variable del archivo string.

Lo desarrollé hasta que se compilara, reproduje el error de advertencia de gas y eliminé la advertencia con un cambio a good'ol bytes32. Otra ventaja de la interfaz de tamaño fijo es que se puede llamar desde otros contratos.

Actualizar:

Puede pasar cadenas entre contratos con los nuevos compiladores de Solidity.

pragma solidity ^0.4.15;

contract X {

    struct Voter {
        bytes32 data;
        uint amount;
    }
    mapping(address => Voter) voter;
    address[] voterIndex;
    uint voter_count;

    event Deposit(address a, uint b);

    function sendEther(bytes32 data) public payable  {
      address sender = msg.sender;
      uint value = msg.value;
      voter[sender].data = data;
      voter[sender].amount = value;
      voterIndex[voter_count] = sender;
      voter_count = voter_count + 1;
      Deposit(sender, value);
    }

}

Espero eso ayude.

Muchas gracias. Lo explica todo. Perdón por constanteso que no fue intencional. Por cierto, ¿puedes también explicar o dar un enlace donde pueda aprender cómo depurar el error en el depurador de remezclas o dentro de etherscan? Gracias de nuevo.
Me alegro de que haya ayudado. Gracias por aceptar". Tal vez alguien intervenga con un buen enlace si publica la pregunta de depuración como otra pregunta.