GreeterContract kann im Greeter-Tutorial nicht definiert werden. Breaking Change in Solidity 0.4.9!

Ich habe dem Greeter-Tutorial im Go Ethereum-Wiki gefolgt und bin in der Phase „var GreeterContract = web3.eth.contract(greeterCompiled.greeter.info.abiDefinition)“ hängen geblieben , die TypeError zurückgegeben hat: Kann nicht auf das Mitglied „info“ von undefined zugreifen. Ich habe solC installiert und verlinkt - (eth.getCompilers() gibt ["Solidity"] zurück) und den Quellcode kompiliert.

Der einzige Unterschied, den ich gegenüber dem Tutorial und anderen Beiträgen im Forum festgestellt habe, ist, dass das Anzeigen von GreeterCompiled einen "stdin"-Block vor Greeter- und Sterblichkeitsattributen hat. Irgendwelche Ideen, was den Fehler / stdin-Block verursacht?

Geth-Version: 1.5.8-stable-f58fb322 und solC-Version: 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: {}
      }
    }
  }
}
Siehe ethereum.stackexchange.com/questions/2751/… für eine Schritt-für-Schritt-Anleitung zur Bereitstellung von Greeter.
Danke @BokkyPooBah! Ich habe diese Anleitung befolgt und es noch einmal getan, um einen Demo-Effekt zu vermeiden. Aber wie zuvor bekomme ich denselben Fehler. Wenn die Quelle kompiliert ist, hat sie diesen <stdin>-Block vor den Attributen Greeter und Mortal. Ich bin mir nicht sicher, ob das Problem besteht, aber ich erhalte erneut den Fehler Cannot access member 'info' of undefined und der einzige Unterschied, den ich gegenüber der Schritt-für-Schritt-Anleitung finden kann, ist der <stdin> Block.
Ich kann dein Problem reproduzieren. Höchstwahrscheinlich aufgrund der neuen Version von Solidity. Ich werde dem nachgehen und mich bei Ihnen melden.
Das neue Solidity 0.4.9 3 Tage spricht über „auf Dateipräfixe achten“ – github.com/ethereum/solidity/releases/tag/v0.4.9 . <stdin>ist das Dateipräfix für die "Standardeingabe", wenn kein Dateipräfix angegeben ist. Ich werde versuchen, eine Problemumgehung zu finden und mich bei Ihnen melden.

Antworten (2)

Aktualisierung 23. April 2017

geth1.6.0 enthält eine Breaking Change, um den Zugriff auf den Solidity-Compiler von innen heraus zu entfernen geth.

Die Problemumgehung wird in Wie kompiliere ich Solidity-Verträge in Geth mit v1.6.0 **BREAKING CHANGE**?



Hinweis: Solidity 0.4.9 hat eine bahnbrechende Änderung an vielen alten Beispielen

Das neue Solidity 0.4.9 vor 3 Tagen erwähnt, dass Sie "auf Dateipräfixe achten" müssen - https://github.com/ethereum/solidity/releases/tag/v0.4.9 . <stdin>ist das Dateipräfix für die "Standardeingabe", wenn kein Dateipräfix angegeben ist.

Die Problemumgehung besteht darin, Folgendes zu verwenden:

greeterCompiled["<stdin>:greeter"]

Anstatt von:

greeterCompiled.<stdin>:greeter

da das <Zeichen Probleme im gethKommandozeileninterpreter verursacht.



Einzelheiten

Um das Greeter-Beispiel mit Solidity 0.4.9 zu kompilieren, müssen Sie Ihre Anweisungen leicht ändern.

Im Folgenden finden Sie Anweisungen zur Umgehung des Standard- Greeter-Beispiels .

Stellen Sie Ihren Vertrag zusammen:

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);

Wenn Sie sich jetzt Ihre Variable ansehen greeterCompiled, werden Sie sehen, dass einigen Elementen das Präfix vorangestellt <stdin>ist, wie in der obigen Frage erwähnt.

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

Die Verwendung <auf Ihrer gethJavaScript-Befehlszeile funktioniert nicht. Hier ist also eine vorübergehende Problemumgehung. Sie können greeterCompiled.<stdin>:greeter:in gethJavaScript mit der folgenden Syntax zugreifen:

greeterCompiled["<stdin>:greeter"]

Um den Rest des Beispiels auszuführen:

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);
    }

  }
})
Wozu der Schritt greeterContract. Ich bekomme den Fehler TypeError: Cannot access member 'info' of undefined.

Es gibt noch weitere Breaking Changes im neusten Solidity. Ich habe Folgendes verwendet, um meinen Fehler im 0.4.9letzten Commit zu beheben.

Dateinamen von hier kopieren

Sie müssen den Dateinamen aus dem kompilierten Code kopieren. In meinem Beispiel ist dies /tmp/geth-compile-solidity311107485. Verwenden Sie diese dann im nächsten Schritt. Siehe Screenshots.

Dateinamen hier einfügen

Der zu verwendende Befehl lautet:

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

statt greeterCompiled.greeter.info.