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.
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? .
He configurado mi cadena de bloques privada utilizando los siguientes procedimientos:
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": {}
}
Creé un archivo de contraseña que testpassword
contiene la contraseña de mi cuenta
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_runGethGenesisInit
configurar el bit ejecutable.
Creé un script para iniciar mi geth
nodo 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_runGethGenesis
configurar el bit ejecutable.
Descargué Browser Solidity de https://github.com/ethereum/browser-solidity/tree/gh-pages .
Descomprimí los archivos y los cargué index.html
en mi navegador web.
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
Cargué el script de prueba @TjadenHess
desde ¿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.
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 :
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.
Modifiqué ligeramente el código fuente de la llamada a la biblioteca para hacer value
pú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:
El mensaje Transaction cost: 41914 gas.
y el valor de value
muestra que la llamada a la función de biblioteca tuvo éxito.
Conecté Browser Solidity con una cadena de geth --dev
bloques:
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 --dev
cadena de bloques no está en modo Homestead:
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 :
alper
privacidadisahumanright.eth
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ándologeth
directamente. Debería poder conectar Browser Solidity a sugeth
instancia 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 .alper
privacidadisahumanright.eth
geth
de , 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.alper
alper
privacidadisahumanright.eth
alper
privacidadisahumanright.eth
alper
alper
alper
solc
? @BokkyPooBahprivacidadisahumanright.eth
alper