Compilando el código de solidez con geth+testrpc - Error: respuesta JSON RPC no válida

Estoy intentando compilar el siguiente contrato usando la consola geth adjunta a una instancia de testrpc:

contract UnitCounter {
    mapping (address => uint256) public UnitsFrom;
    uint256 public TotalUnits;

    function submitUnits(uint256 Units) {
        UnitsFrom[msg.sender] = Units;
        TotalUnits += Units;
    }
}

Después de ejecutar testrpc y conectar:

testrpc -a 1000

Adjunté una cosole geth

geth attach rpc:http://localhost:8545

e hizo lo siguiente:

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

Lo que da este error:

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  

¿Qué significa este error? ¿Qué pasos debo seguir para depurar?

Esto huele a error geth, ya que las llamadas JSON-RPC deberían convertir todo a JSON antes de regresar. Intente usar solcla versión de línea de comando para compilar su contrato localmente. Aquí hay algunos ejemplos: tokenmarket.net/blog/…

Respuestas (1)

Puede utilizar tcpdumppara interceptar la comunicación entre gethy testrpc.

Esto volcará todos los paquetes que pasan por la interfaz loopback lodesde/hacia el puerto 8545:

$ sudo tcpdump -A -i lo port 8545

Ahora puede ejecutar el eth.compile.solidity(..)comando en la consola geth y obtener una solicitud y respuesta JSON-RPC:

solicitud

{
  "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;}}"
  ]
}

respuesta

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

Formulario aquí se puede ver que:

  • falta el error real pragma solidity ^0.4.4;en su código
  • testrpcdevuelve una respuesta mal formada ( error.messagedebe ser una cadena pero se proporciona una matriz, consulte la especificación JSON-RPC )
    • esto está arreglado en proveedor-motor@8.1.18