Solidity-Code wird mit geth+testrpc kompiliert – Fehler: Ungültige JSON-RPC-Antwort

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?

Das riecht nach Geth-Bug, da JSON-RPC-Aufrufe alles in JSON konvertieren sollten, bevor sie zurückkehren. Versuchen Sie, die solcBefehlszeilenversion zu verwenden, um Ihren Vertrag lokal zu kompilieren. Hier sind einige Beispiele: tokenmarket.net/blog/…

Antworten (1)

Sie können verwenden tcpdump, um die Kommunikation zwischen gethund abzufangen testrpc.

Dadurch werden alle Pakete, die durch die Loopback-Schnittstelle lovon/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:

  • tatsächlicher Fehler fehlt pragma solidity ^0.4.4;in Ihrem Code
  • testrpcgibt eine falsch formatierte Antwort zurück ( error.messagemuss eine Zeichenfolge sein, aber ein Array wird bereitgestellt, siehe JSON-RPC-Spezifikation )
    • Dies ist in provider-engine@8.1.18 behoben