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: {}
}
}
}
}
geth
1.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**?
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 geth
Kommandozeileninterpreter verursacht.
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 geth
JavaScript-Befehlszeile funktioniert nicht. Hier ist also eine vorübergehende Problemumgehung. Sie können greeterCompiled.<stdin>:greeter:
in geth
JavaScript 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);
}
}
})
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.9
letzten Commit zu beheben.
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.
Der zu verwendende Befehl lautet:
greeterCompiled["/tmp/geth-compile-solidity311107485:greeter"].info
statt greeterCompiled.greeter.info
.
Datenschutz ist ein Menschenrecht.eth
Henrik
Datenschutz ist ein Menschenrecht.eth
Datenschutz ist ein Menschenrecht.eth
<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.