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".
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.
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 payable
es 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 {
payable
La palabra clave solo es necesaria cuando la función recibe ETH. El uso incorrecto de payable
la palabra clave puede hacer que los usuarios pierdan el éter.
andi giga
2204
bytes, así que usé: 2204 * 64 + 21000 gas pero aún obtengoIntrinsic gas too low
. ¿No debería incluso requerir menos gas debido a los cero bytes?jimkberry
andi giga
8
.