Ich versuche, den folgenden Vertrag mit einer an eine testrpc-Instanz angehängten Geth-Konsole zu kompilieren:
contract UnitCounter {
mapping (address => uint256) public UnitsFrom;
uint256 public TotalUnits;
function submitUnits(uint256 Units) {
UnitsFrom[msg.sender] = Units;
TotalUnits += Units;
}
}
Nach dem Ausführen von testrpc und dem Verbinden:
testrpc -a 1000
Ich habe eine Geth-Cosole angehängt
geth attach rpc:http://localhost:8545
und folgendes gemacht:
> eth.getCompilers()
["solidity"]
> co=eth.compile.solidity("contract UnitCounter {mapping (address => uint256) public UnitsFrom;uint256 public TotalUnits;function SubmitUnits(uint256 Units) {UnitsFrom[msg.sender] = Units;TotalUnits += Units;}}")
Was diesen Fehler gibt:
Error: Invalid JSON RPC response: {"error":{"code":-32603,"json: cannot unmarshal array into Go value of type string":"json: cannot unmarshal array into Go value of type string"},"id":11,"version":"2.0"}
at web3.js:3119:20
at web3.js:6023:15
at web3.js:4995:36
at <anonymous>:1:4
Was bedeutet dieser Fehler? Welche Schritte sollte ich zum Debuggen unternehmen?
Sie können verwenden tcpdump
, um die Kommunikation zwischen geth
und abzufangen testrpc
.
Dadurch werden alle Pakete, die durch die Loopback-Schnittstelle lo
von/zu Port 8545 gehen, ausgegeben:
$ sudo tcpdump -A -i lo port 8545
Jetzt können Sie eth.compile.solidity(..)
den Befehl in der Geth-Konsole ausführen und JSON-RPC-Anforderung und -Antwort erhalten:
Anfrage
{
"jsonrpc": "2.0",
"id": 14,
"method": "eth_compileSolidity",
"params": [
"contract UnitCounter {mapping (address => uint256) public UnitsFrom;uint256 public TotalUnits;function SubmitUnits(uint256 Units) {UnitsFrom[msg.sender] = Units;TotalUnits += Units;}}"
]
}
Antwort
{
"id": 14,
"jsonrpc": "2.0",
"error": {
"message": [
":1:1: Warning: Source file does not specify required compiler version!Consider adding \"pragma solidity ^0.4.4\ncontract UnitCounter {mapping (address => uint256) public UnitsFrom;uint256 public TotalUnits;function SubmitUnits(uint256 Units) {UnitsFrom[msg.sender] = Units;TotalUnits += Units;}}\n^-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------^\n"
],
"code": -32000
}
}
Hier können Sie sehen, dass:
pragma solidity ^0.4.4;
in Ihrem Codetestrpc
gibt eine falsch formatierte Antwort zurück ( error.message
muss eine Zeichenfolge sein, aber ein Array wird bereitgestellt, siehe JSON-RPC-Spezifikation )
Mikko Ohtamaa
solc
Befehlszeilenversion zu verwenden, um Ihren Vertrag lokal zu kompilieren. Hier sind einige Beispiele: tokenmarket.net/blog/…