¿Cómo llamar a la función de biblioteca desde un contrato? => [error] El código de contrato no se pudo almacenar, verifique la cantidad de gas. indefinido

Cuando compilé el siguiente código en " https://ethereum.github.io/browser-solidity/ " me da dos códigos de implementación de Web3 para:

var libraryContract  = web3.eth.contract(...); //Web3 deploy code
var contractContract = web3.eth.contract(...); //Web3 deploy code

Luego copié y pegué el código de implementación de Web3 para (libraryContract, contractContract) en geth para extraer mis contratos.

Mi código (he recortado la mayor parte por simplicidad):

library Library {
    function func () constant returns (uint8) {
        return 5;
    }
}

contract Contract {
    uint8 value;
    function call_library_function () {
        value = Library.func();
    }
}

El código de implementación Web3 de "Library" se extrae perfectamente, pero cuando intento extraer el código de implementación Web3 de "Contract", aparece el siguiente error:

> Error: No se pudo almacenar el código de contrato, verifique su cantidad de gas. indefinido

Si elimino la siguiente línea de mi código de enlace de contrato, ¡el código de implementación Web3 de "Contrato" recién generado mina! Sin ningún problema:

value = Library.func();

[P] Mi pregunta es, ¿cómo podría solucionar este problema que tengo? ¿Qué debo hacer para llamar a mi función dentro de una Biblioteca desde un Contrato, que me permitirá minarla?

Cómo configuré mi Ethereum Blockchain privado: consulte el siguiente enlace: ¿Cómo podría actualizar el valor predeterminado de homesteadBlock en mi Ethereum blockchain privado?

Gracias por su valiosa ayuda y tiempo.

Respuestas (1)

Del método de contrato de la biblioteca que falla # 2831 :

¿Probablemente ejecute geth con la opción --dev para crear una red privada? En ese caso, use el subcomando init para crear una cadena privada. Las instrucciones se pueden encontrar en la wiki. O usa la red de prueba.

El problema es que este código usa la llamada delegada que se agrega en la versión de Homestead . La bandera --dev usa el número de bloque de la propiedad principal de la red principal que es 1150000 . Cualquier transacción anterior a este bloque encontrará un código de operación no válido, consumirá todo el combustible y se revertirán todos los cambios de estado.

Para solucionar este problema:

...

El archivo de configuración de génesis admite una sección de configuración. Actualmente lo único que puede configurar es el número de bloque de la propiedad . Si no lo especifica, se establecerá de forma predeterminada en el número de red principal, que es 1150000. Básicamente, su contrato funcionará después de este bloque.

Pruebe el siguiente archivo de génesis:

{
  "config":{
     "homesteadBlock":"5"
  },
  "nonce":"0x0000000000000042",
  "timestamp":"0x0",
  "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData":"0x0",
  "gasLimit":"0x8000000",
  "difficulty":"0x400",
  "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase":"0x3333333333333333333333333333333333333333",
  "alloc":{

  }

}

Si el contrato se despliega en el bloque <5, dará el problema del límite de gas.

Implementado en bloque >= 5, debería funcionar según lo previsto.

Se puede encontrar más información sobre el uso del archivo genesis en geth init, ¿cuáles son los argumentos? .



Actualización 10:33 14 de octubre de 2016

He configurado mi cadena de bloques privada utilizando los siguientes procedimientos:


1. Configurar genesis.json

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": {}
}


2. Archivo de contraseñas

Creé un archivo de contraseña que testpasswordcontiene la contraseña de mi cuenta


3. Script de inicialización de Blockchain

Creé un script para inicializar mi cadena de bloques:

Wocket:ESE bok$ more 02_runGethGenesisInit 
#!/bin/sh

geth --datadir /Users/bok/ESE/gethgenesis init /Users/bok/ESE/genesis.json
geth --datadir /Users/bok/ESE/gethgenesis --password testpassword account new

Y solía chmod 700 02_runGethGenesisInitconfigurar el bit ejecutable.


4. Script de nodo privado

Creé un script para iniciar mi gethnodo privado en modo de minería:

Wocket:ESE bok$ more 02_runGethGenesis 
#!/bin/sh

geth --datadir /Users/bok/ESE/gethgenesis --unlock 0 --password /Users/bok/ESE/testpassword --rpc --rpccorsdomain '*' --mine --minerthreads 1 console

Y solía chmod 700 02_runGethGenesisconfigurar el bit ejecutable.


5. Solidez del navegador

Descargué Browser Solidity de https://github.com/ethereum/browser-solidity/tree/gh-pages .

Descomprimí los archivos y los cargué index.htmlen mi navegador web.


6. Comience todo

Inicialicé mis datos de blockchain usando el siguiente comando:

Wocket:ESE bok$ ./02_runGethGenesisInit 

Inicié mi nodo con el siguiente comando y lo he estado ejecutando durante un tiempo:

Wocket:ESE bok$ ./02_runGethGenesis
...
I1015 09:56:14.364062 miner/worker.go:342] 🔨  Mined block (#5210 / f881b1be). Wait 5 blocks for confirmation
I1015 09:56:14.364333 miner/worker.go:539] commit new work on block 5211 with 0 txs & 0 uncles. Took 281.474µs
I1015 09:56:14.364360 miner/worker.go:435] 🔨 🔗  Mined 5 blocks back: block #5205
I1015 09:56:14.364492 miner/worker.go:539] commit new work on block 5211 with 0 txs & 0 uncles. Took 114.592µs
I1015 09:56:16.394886 miner/worker.go:342] 🔨  Mined block (#5211 / 420c7edc). Wait 5 blocks for confirmation
I1015 09:56:16.395189 miner/worker.go:539] commit new work on block 5212 with 0 txs & 0 uncles. Took 262.993µs
I1015 09:56:16.395222 miner/worker.go:435] 🔨 🔗  Mined 5 blocks back: block #5206


7. Prueba para el modo Homestead

Cargué el script de prueba @TjadenHessdesde ¿Cómo podría actualizar el valor predeterminado de homesteadBlock en mi cadena de bloques privada de Ethereum? en el navegador Solidity:

contract TestHomestead{
    function test () returns(bool){
        return address(4).delegatecall(1);
    }
}

Conecté Solidity Browser a mi nodo privado local haciendo clic en el icono de bloque y seleccionando Web3 Provider . Luego hice clic en Crear para implementar el contrato anterior en la cadena de bloques. Hice clic en probar y el mensaje Transaction cost: 21657 gas.muestra que mi blockchain está en modo Homestead.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Nota: si modifico la función para convertirla en una constante function test () constant returns(bool){, obtengo los siguientes resultados para una cadena de bloques en modo Homestead : verdadero :

ingrese la descripción de la imagen aquí

Consulte la sección 9 a continuación para ver el mensaje que se muestra cuando la cadena de bloques no está en modo Homestead.


8. Prueba del código fuente de la llamada a la biblioteca

Modifiqué ligeramente el código fuente de la llamada a la biblioteca para hacer valuepública la variable y cargué esto en Browser Solidity:

library Library {
    function func () constant returns (uint8) {
        return 5;
    }
}

contract Contract {
    uint8 public value;
    function call_library_function () {
        value = Library.func();
    }
}

Hice clic en Crear para implementar el código, call_library_function para ejecutar el método y valor para ver el resultado de la función de llamada de biblioteca:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Éxito

El mensaje Transaction cost: 41914 gas.y el valor de valuemuestra que la llamada a la función de biblioteca tuvo éxito.


9. Qué sucede cuando mi nodo está en modo no residencial

Conecté Browser Solidity con una cadena de geth --devbloques:

geth --dev --datadir /Users/bok/ESE/gethdata --unlock 0 --password /Users/bok/ESE/testpassword --rpc --rpccorsdomain '*' --mine --minerthreads 1 console

Ejecuté el mismo código de prueba de Homestead para producir el mensaje El gas requerido excede el límite: 50000000 que muestra que esta --devcadena de bloques no está en modo Homestead:

ingrese la descripción de la imagen aquí

Nota: Si modifico la función para convertirla en una constante function test () constant returns(bool){, obtengo los siguientes resultados para una cadena de bloques que no es en modo Homestead : falso :

ingrese la descripción de la imagen aquí

Gracias Señor. ¿Funcionó con usted cuando el límite de gas se actualizó como 5000000?
Perdón. My Browser Solidity está fuera de línea en este momento. Reconstruir mi computadora portátil como una actualización de software hizo que dejara de funcionar. Despliega tu contrato sin el list.append("abc","111"); y comprueba cuánto gas consume. Luego agregue un 10% más y vea si esto resuelve su problema. Observo que está escribiendo su código y luego implementándolo gethdirectamente. Debería poder conectar Browser Solidity a su gethinstancia local seleccionando el proveedor Web3 en el tercer ícono desde la izquierda; consulte la imagen de la pantalla en ethereum.stackexchange.com/a/8970/1268 .
Ok, estoy probando tu sugerencia. Estoy ejecutando geth en mi cadena de bloques ethereum privada. He obligado a ejecutar geth -targetgaslimit "994712388". Mi límite de gas aumentó de 470000, ahora mismo a 500000. El navegador Solidity siempre da 470000 para el uso de gas, por lo que estoy actualizando manualmente el valor "gas: <int>" para el contrato. Con suerte encontraré un gas que se extraiga del contrato.
Si desea implementar a través gethde , consulte la guía paso a paso ethereum.stackexchange.com/questions/2751/… para ver un ejemplo sobre cómo especificar el gas para la implementación del contrato.
Actualicé el límite de gas hasta "15529600", sigue siendo el mismo error.
He hecho sugerencia, pero de nuevo parece que no funcionará. Todavía estoy trabajando en ello. Gracias por tu ayuda.
He actualizado mi respuesta con un enlace para usar el archivo de génesis.
Gracias señor, según su orientación, actualicé mi pregunta sobre cómo creé mi cadena de bloques Ethereum privada. Pero aun así me da el mismo error. ¿Hay algún problema con la forma en que creé mi cadena de bloques ethereum privada?
Actualicé mi respuesta con una guía paso a paso para implementar correctamente la llamada a la función de la biblioteca.
Muchas gracias :) Agradezco su valiosa ayuda. Estoy trabajando en ello para que funcione de mi lado.
¡¡Pues funciona!!
¿Es posible hacer su respuesta también usando solc? @BokkyPooBah
¿Sería posible actualizar su respuesta con el nuevo navegador de solidez? La GUI de Solidity-browser ha cambiado y no puedo implementar mi contrato a través de ella :( @BokkyPooBah