No se puede definir el contrato de recepción en el tutorial de recepción. ¡Cambio de última hora en Solidity 0.4.9!

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: {}
      }
    }
  }
}
Consulte ethereum.stackexchange.com/questions/2751/… para obtener una guía paso a paso para implementar Greeter.
¡Gracias @BokkyPooBah! Estaba siguiendo esta guía y lo hice una vez más para evitar el efecto de demostración. Pero como antes, recibo el mismo error. Cuando se compila la fuente, tiene este bloque <stdin> antes de los atributos de saludador y mortal. No estoy seguro de si ese es el problema, pero de nuevo recibo el error No se puede acceder a la 'información' del miembro de undefined y la única diferencia que puedo encontrar con respecto a la guía paso a paso es el bloque <stdin>.
Puedo reproducir tu problema. Lo más probable es que se deba a la nueva versión de Solidity. Voy a investigar y me pondré en contacto contigo.
El nuevo Solidity 0.4.9 3 días habla de "cuidar los prefijos de archivos": 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. Intentaré encontrar una solución alternativa y te responderé.

Respuestas (2)

Actualización 23 de abril de 2017

geth1.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?



Nota: Solidity 0.4.9 tiene un cambio importante en muchos ejemplos antiguos

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 gethintérprete de línea de comandos.



Detalles

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 greeterCompiledvariable, 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 gethlínea de comandos de JavaScript no funcionará. Así que aquí hay una solución temporal. Puede acceder greeterCompiled.<stdin>:greeter:en gethJavaScript 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);
    }

  }
})
¿Cuál es el paso para greeterContract. me sale el TypeError: Cannot access member 'info' of undefinederror

Todaví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.

copie el nombre del archivo desde aquí

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.

pegue el nombre del archivo aquí

El comando a utilizar es:

greeterCompiled["/tmp/geth-compile-solidity311107485:greeter"].info

en lugar greeterCompiled.greeter.infode