Estaba siguiendo el tutorial de Greeter en la wiki de Go Ethereum y me quedé atascado en la fase "var greetingerContract = web3.eth.contract(greeterCompiled.greeter.info.abiDefinition)" que devolvía TypeError: Cannot access member 'info' of undefined. Tengo solC instalado y vinculado - (eth.getCompilers() devuelve ["Solidity"]) y código fuente compilado.
La única diferencia que vi con el tutorial y otras publicaciones en el foro es que la visualización de greetingerCompiled tiene un bloque "stdin" antes de los atributos de saludador y mortal. ¿Alguna idea de qué causa el error / stdin-block?
Versión Geth: 1.5.8-stable-f58fb322 y versión solC: 0.4.9+commit.364da425.Linux.g++
{
<stdin>:greeter: {
code: "0x6060604052341561000c57fe5b6040516102f03803806102f0833981016040528051015b5b60008054600160a060020a03191633600160a060020a03161790555b805161005390600190602084019061005b565b505b506100fb565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061009c57805160ff19168380011785556100c9565b828001600101855582156100c9579182015b828111156100c95782518255916020019190600101906100ae565b5b506100d69291506100da565b5090565b6100f891905b808211156100d657600081556001016100e0565b5090565b90565b6101e68061010a6000396000f300606060405263ffffffff60e060020a60003504166341c0e1b5811461002c578063cfae32171461003e575bfe5b341561003457fe5b61003c6100ce565b005b341561004657fe5b61004e610110565b604080516020808252835181830152835191928392908301918501908083838215610094575b80518252602083111561009457601f199092019160209182019101610074565b505050905090810190601f1680156100c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000543373ffffffffffffffffffffffffffffffffffffffff9081169116141561010d5760005473ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b6101186101a8565b60018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561019d5780601f106101725761010080835404028352916020019161019d565b820191906000526020600020905b81548152906001019060200180831161018057829003601f168201915b505050505090505b90565b604080516020810190915260008152905600a165627a7a723058202c65e52fe69886136391b3ad7b56f7b9b5ab3474a50940ab214964258d3133000029",
info: {
abiDefinition: [{...}, {...}, {...}],
compilerOptions: "--combined-json bin,abi,userdoc,devdoc --add-std --optimize",
compilerVersion: "0.4.9",
developerDoc: {
methods: {}
},
language: "Solidity",
languageVersion: "0.4.9",
source: "contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }",
userDoc: {
methods: {}
}
}
},
<stdin>:mortal: {
code: "0x6060604052341561000c57fe5b5b60008054600160a060020a03191633600160a060020a03161790555b5b609c806100386000396000f300606060405263ffffffff60e060020a60003504166341c0e1b581146020575bfe5b3415602757fe5b602d602f565b005b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161415606d5760005473ffffffffffffffffffffffffffffffffffffffff16ff5b5b5600a165627a7a72305820eca3dc2bc8d6fa1918006106610ba8497fc2dbc338fbd528482ddd442ab88be50029",
info: {
abiDefinition: [{...}, {...}],
compilerOptions: "--combined-json bin,abi,userdoc,devdoc --add-std --optimize",
compilerVersion: "0.4.9",
developerDoc: {
methods: {}
},
language: "Solidity",
languageVersion: "0.4.9",
source: "contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }",
userDoc: {
methods: {}
}
}
}
}
geth
1.6.0 tiene un cambio importante para eliminar el acceso al compilador de Solidity desde dentro geth
.
La solución alternativa se detalla en ¿Cómo compilar contratos de Solidity dentro de geth con **CAMBIO IMPORTANTE** v1.6.0?
El nuevo Solidity 0.4.9 hace 3 días menciona que debe estar "observando los prefijos de archivos": https://github.com/ethereum/solidity/releases/tag/v0.4.9 . <stdin>
es el prefijo de archivo para "entrada estándar", cuando no se especifica ningún prefijo de archivo.
La solución es usar:
greeterCompiled["<stdin>:greeter"]
en vez de:
greeterCompiled.<stdin>:greeter
ya que el <
carácter causará problemas en el geth
intérprete de línea de comandos.
Para compilar el ejemplo de saludo usando Solidity 0.4.9, tendrá que modificar ligeramente sus instrucciones.
Las siguientes son las instrucciones para solucionar el ejemplo estándar de Greeter .
Compila tu contrato:
var greeterSource = 'contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }';
var greeterCompiled = web3.eth.compile.solidity(greeterSource);
Si ahora observa su greeterCompiled
variable, verá que algunos miembros tienen el prefijo <stdin>
, como se menciona en la Pregunta anterior.
> greeterCompiled
{
<stdin>:greeter: {
code: "0x6060604052341561000c57fe5b6040516102f03803806102f0833981016040528051015b5b60008054600160a060020a03191633600160a060020a03161790555b805161005390600190602084019061005b565b505b506100fb565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061009c57805160ff19168380011785556100c9565b828001600101855582156100c9579182015b828111156100c95782518255916020019190600101906100ae565b5b506100d69291506100da565b5090565b6100f891905b808211156100d657600081556001016100e0565b5090565b90565b6101e68061010a6000396000f300606060405263ffffffff60e060020a60003504166341c0e1b5811461002c578063cfae32171461003e575bfe5b341561003457fe5b61003c6100ce565b005b341561004657fe5b61004e610110565b604080516020808252835181830152835191928392908301918501908083838215610094575b80518252602083111561009457601f199092019160209182019101610074565b505050905090810190601f1680156100c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000543373ffffffffffffffffffffffffffffffffffffffff9081169116141561010d5760005473ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b6101186101a8565b60018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561019d5780601f106101725761010080835404028352916020019161019d565b820191906000526020600020905b81548152906001019060200180831161018057829003601f168201915b505050505090505b90565b604080516020810190915260008152905600a165627a7a723058202c65e52fe69886136391b3ad7b56f7b9b5ab3474a50940ab214964258d3133000029",
info: {
abiDefinition: [{...}, {...}, {...}],
compilerOptions: "--combined-json bin,abi,userdoc,devdoc --add-std --optimize",
compilerVersion: "0.4.9",
developerDoc: {
methods: {}
},
language: "Solidity",
languageVersion: "0.4.9",
source: "contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }",
userDoc: {
methods: {}
}
}
},
<stdin>:mortal: {
code: "0x6060604052341561000c57fe5b5b60008054600160a060020a03191633600160a060020a03161790555b5b609c806100386000396000f300606060405263ffffffff60e060020a60003504166341c0e1b581146020575bfe5b3415602757fe5b602d602f565b005b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161415606d5760005473ffffffffffffffffffffffffffffffffffffffff16ff5b5b5600a165627a7a72305820eca3dc2bc8d6fa1918006106610ba8497fc2dbc338fbd528482ddd442ab88be50029",
info: {
abiDefinition: [{...}, {...}],
compilerOptions: "--combined-json bin,abi,userdoc,devdoc --add-std --optimize",
compilerVersion: "0.4.9",
developerDoc: {
methods: {}
},
language: "Solidity",
languageVersion: "0.4.9",
source: "contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) suicide(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }",
userDoc: {
methods: {}
}
}
}
}
El uso <
de su geth
línea de comandos de JavaScript no funcionará. Así que aquí hay una solución temporal. Puede acceder greeterCompiled.<stdin>:greeter:
en geth
JavaScript usando la siguiente sintaxis:
greeterCompiled["<stdin>:greeter"]
Así que para ejecutar el resto del ejemplo:
var greeter = greeterContract.new(_greeting,{from:web3.eth.accounts[0],
data: greeterCompiled["<stdin>:greeter"].code, gas: 1000000}, function(e, contract) {
if (!e) {
if (!contract.address) {
console.log("Contract transaction send: TransactionHash: " +
contract.transactionHash + " waiting to be mined...");
} else {
console.log("Contract mined! Address: " + contract.address);
console.log(contract);
}
}
})
greeterContract
. me sale el TypeError: Cannot access member 'info' of undefined
errorTodavía hay más cambios importantes en el nuevo Solidity. Utilicé lo siguiente para corregir mi error en la 0.4.9
última confirmación.
Debe copiar el nombre del archivo del código compilado. En mi ejemplo, esto es /tmp/geth-compile-solidity311107485
. Luego use esto en el siguiente paso. Ver capturas de pantalla.
El comando a utilizar es:
greeterCompiled["/tmp/geth-compile-solidity311107485:greeter"].info
en lugar greeterCompiled.greeter.info
de
privacidadisahumanright.eth
henrik
privacidadisahumanright.eth
privacidadisahumanright.eth
<stdin>
es el prefijo de archivo para "entrada estándar", cuando no se especifica ningún prefijo de archivo. Intentaré encontrar una solución alternativa y te responderé.