Tengo un problema con una configuración de biblioteca simple y necesito un consejo para resolverlo.
Contexto: cadena de bloques privada local
Versión:
> web3.version
{
api: "0.18.1",
ethereum: "0x3f",
network: "260674",
node: "Geth/v1.5.8-stable-f58fb322/darwin/go1.7.5",
}
Código de solidez:
pragma solidity ^0.4.9;
library BasicLib {
function add(uint into, uint val) returns(uint) {
return into + val;
}
}
contract Basic {
uint public data;
function increase() {
data = BasicLib.add(data, 10);
}
}
Luego, uso javascript web3 para compilar. Publico BasicLib con un contract.new ({data: code, gas: 1000000}) y obtengo una dirección correcta después de la extracción.
Tomo esta dirección, elimino el "0x" y reemplazo el marcador de posición __BasicLib____ del código de contrato básico y el resultado se ve bien
BasicLib.address: "0x8de8e5f4b91b67915a07279f9095155fa0ed5114"
Basic.code: "0x6060604052341561000c57fe5b5b6101048061001c6000396000f300606060405263ffffffff60e060020a60003504166373d4a13a8114602a578063e8927fbc146049575bfe5b3415603157fe5b60376058565b60408051918252519081900360200190f35b3415605057fe5b6056605e565b005b60005481565b738de8e5f4b91b67915a07279f9095155fa0ed511463771602f7600054600a6000604051602001526040518363ffffffff1660e060020a028152600401808381526020018281526020019250505060206040518083038186803b151560bf57fe5b60325a03f4151560cb57fe5b505060405151600055505b5600a165627a7a72305820e35203973e69040bc9a24c63526485e87946e2f2b688172fcda1e89f2beb09060029"
Luego implemento el contrato básico, se extrae y obtengo una dirección. Hasta ahora tan bueno. Pruebo la función de aumento () y se extrae, pero el campo de datos no aumenta.
Ahora, empiezo a investigar el problema.
> B.increase.estimateGas()
4712388 <-- this is the block gas limit !!!
> var deb = debug.traceTransaction("0x233b27c9a7ad577b0860261b23bd9ab544df1513839fce2b7800fd286eab8a51")
> deb.structLogs.length
90 <- so nothing extraordinary here
> deb
{
gas: 1000000, <-- ok, i passed a good amount of gas
returnValue: "",
structLogs: [{
depth: 1,
error: null,
gas: 978725,
gasCost: 3,
memory: null,
op: "PUSH1",
pc: 0,
stack: [],
storage: {}
}, {
depth: 1,
error: null,
gas: 978722,
gasCost: 3,
memory: null,
op: "PUSH1",
pc: 2,
stack: ["0000000000000000000000000000000000000000000000000000000000000060"],
storage: {}
}, { ... I CUT THE DETAILS HERE .... }, {
depth: 1,
error: {},
gas: 7,
gasCost: 978317,
memory: ["0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000060", "771602f700000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000000", "0000000a00000000000000000000000000000000000000000000000000000000"],
op: "DELEGATECALL", <-- This is the last OP code called
pc: 196,
stack: ["00000000000000000000000000000000000000000000000000000000e8927fbc", "0000000000000000000000000000000000000000000000000000000000000056", "0000000000000000000000008de8e5f4b91b67915a07279f9095155fa0ed5114", "00000000000000000000000000000000000000000000000000000000771602f7", "00000000000000000000000000000000000000000000000000000000000000a4", "0000000000000000000000000000000000000000000000000000000000000020", "0000000000000000000000000000000000000000000000000000000000000060", "0000000000000000000000000000000000000000000000000000000000000044", "0000000000000000000000000000000000000000000000000000000000000060", "0000000000000000000000008de8e5f4b91b67915a07279f9095155fa0ed5114", "00000000000000000000000000000000000000000000000000000000000eed65"],
storage: {} }]
Entonces concluyo que el código no está en bucle, solo se detiene en DELEGATECALL y se detiene sin error.
¿Qué diablos... estoy haciendo mal aquí? Debe ser el enlace de la lib, pero cuando uso Remix Solidity Browser conectado a mi cadena de bloques y dejo que implemente la lib antes del contrato, se comporta de la misma manera.
Por favor aconseje.
Debe inicializar su cadena de bloques privada con un genesis.json
que especifique que homesteadBlock
comienza en un bloque anterior:
Wocket:ESE bok$ more genesis.json
{
"config": {
"homesteadBlock": 10
},
"nonce": "0",
"difficulty": "0x400",
"mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x",
"gasLimit": "0x3B4A1B44",
"alloc": {}
}
Luego inicialice su cadena de bloques usando los siguientes comandos:
Wocket:ESE bok$ geth --datadir mydatadir init genesis.json
Wocket:ESE bok$ geth --datadir mydatadir --mine --minerthreads 1 console
Más detalles en ¿Cómo puedo actualizar el valor predeterminado de homesteadBlock en mi cadena de bloques privada de Ethereum?
Guénole de Cadoudal
privacidadisahumanright.eth
Guénole de Cadoudal
Guénole de Cadoudal