¿Qué significa "gas intrínseco demasiado bajo"?

Estoy ejecutando la billetera Mist y he implementado este contrato en testnet (desde https://ethereum.stackexchange.com/a/179/520 ):

contract Notary{
    struct Document {
        uint timestamp;
        bytes ipfs_hash;
        address[] signatures;
    }
    mapping(address => bytes[]) public users; //maps addresses to ipfs document hashes
    mapping(bytes32 => Document) public documents; //maps sha3(ipfs) hashes to documents

    function addDocument(bytes ipfs) public {
        users[msg.sender].push(ipfs); //Add document to users's "signed" list
        address[] memory sender;
        sender[0] = msg.sender;
        documents[sha3(ipfs)] = Document(block.timestamp, ipfs, sender);
    }

    function signDocument(bytes ipfs) public {
        users[msg.sender].push(ipfs);
        documents[sha3(ipfs)].signatures.push(msg.sender);
    }

}

Sin embargo, cuando trato de ejecutar la función addDocument, obtengo "gas intrínseco demasiado bajo". ¿Qué significa esto? Además, antes de confirmar la ejecución, dice: "Los datos no se pueden ejecutar, por lo que utilizará todo el gas proporcionado".

Respuestas (3)

El gas intrínseco para una transacción es la cantidad de gas que la transacción usa antes de que se ejecute cualquier código. Es una "tarifa de transacción" constante (actualmente 21000 gas) más una tarifa por cada byte de datos suministrado con la transacción (4 gas para un byte cero, 68 gas para un byte distinto de cero). Todas estas constantes están definidas actualmente para geth en params/protocol_params.go. Presumiblemente, también están codificados en la fuente para las otras implementaciones de nodo/cliente.

Estoy tratando de enviar un tx con Metamask en Ropsten con 2204bytes, así que usé: 2204 * 64 + 21000 gas pero aún obtengo Intrinsic gas too low. ¿No debería incluso requerir menos gas debido a los cero bytes?
@AndiGiga: espero que esto no suene como una pregunta tonta, pero: ¿quisiste decir "2204 * 68 + 21000"?
Gracias, ese es el punto en el que estaba demasiado ciego para ver el 8.

Debe asignar más gasolina a su transacción con la función addDocument. Mist mira hacia el futuro y puede decir que la transacción fallará porque no le ha dado suficiente gas para ejecutarla.

La palabra clave payablees necesaria en una función. Ver documentos de solidez:

Pagadero por funciones: Permite recibir Ether junto con una llamada.

Entonces, esto no funciona:

function transfer(address _to, uint256 _value) {

Esto funciona:

function transfer(address _to, uint256 _value) payable {
¿Por qué esta no es la respuesta a la pregunta? me salvó la vida solo agrega una palabra clave.
Estoy rechazando esta respuesta, porque esto es de hecho incorrecto. payableLa palabra clave solo es necesaria cuando la función recibe ETH. El uso incorrecto de payablela palabra clave puede hacer que los usuarios pierdan el éter.