Necesito ayuda con la implementación de la biblioteca de solidez

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.

  1. Compruebo el recibo de la transacción y veo que se ha consumido todo el gas.
  2. Aumento el gas a 10000000 y lo intento de nuevo. Nuevamente se consume todo el gas.
  3. Entonces me pregunto qué está pasando con esta simple función. entonces llamo
> B.increase.estimateGas()
4712388      <-- this is the block gas limit !!!
  1. Entonces digo, ejecutemos la depuración para ver dónde hay un bucle en el código evm
> 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.

Respuestas (1)

Debe inicializar su cadena de bloques privada con un genesis.jsonque especifique que homesteadBlockcomienza 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?

Gracias. Leí muchas cosas hasta ahora, pero no elegí que la implementación de la biblioteca fuera solo para la versión Homestead de la cadena de bloques. Ahora también entiendo que Ethereum es Homestead solo desde el bloque 1500000. Con todos estos cambios/bifurcaciones en Ethereum (DAO, cambio futuro a PoS) estoy empezando a perder la confianza en la estabilidad de Ethereum :-(
Es difícil mantenerse al día, pero el ecosistema Ethereum es simplemente hermoso y sigue evolucionando a un ritmo acelerado.
¿Es lo que se espera de una cadena de bloques? Necesito una confiabilidad a largo plazo de mi parte. Pero deja que madure primero. Todavía no es un entorno de producción comercial real, sino más bien un patio de recreo.
Bueno, recrear mi blockchain privado con este homesteadBlock solucionó el problema. Gracias.