Ethcore no implementa contrato a través de web3 Javascript API

He escrito algo de código de Solidity, con un método setter createIdpara escribir un par nombre-valor para contratar el almacenamiento y un método getter getPermissionspara obtener el valor asociado con un nombre en particular. Funciona correctamente en la solidez del navegador (en la captura de pantalla a continuación, createIdse llamó antes getPermissions).(captura de pantalla adjunta)

Luego, utilicé la API de Javascript web3 de una aplicación NodeJS para enviar una transacción de implementación de contrato a un nodo Parity (Ethcore), conectado a una cadena privada. Esa transacción se extrae. Usando la API JSON RPC eth_getTransactionReceipt, puedo obtener el recibo de la transacción, que tiene la dirección del contrato. Sin embargo, cuando envío una eth_getCodesolicitud API JSON RPC con la dirección del contrato, todo lo que obtengo es:{ "jsonrpc": "2.0", "result": "0x", "id": 1 }

Para probar si simplemente eth_getCodeno funciona correctamente, utilicé la API JSON RPC eth_callpara llamar al setter (que no tiene valor de retorno) para establecer un valor, pero llamar al getter también devuelve un resultado vacío. La captura de pantalla muestra que el captador devolvió el valor correcto en la solidez del navegador.

¿Hay algo que este olvidando? Muchas gracias por tu ayuda.

EDITAR: Alguna información adicional. Compilé e implementé el siguiente código de Solidity:

contract test { function double(int a) returns(int) { return 2*a; } }

En este caso, eth_getCodedevolvió el código compilado, dada la dirección del contrato. Además, invoqué el double(int)método dos veces (con 2 valores de entrada diferentes) usando eth_callla API JSON RPC y obtuve el valor de retorno correcto en ambos casos.

¿Eso significa que hay algún problema con el código del otro contrato (que es más complejo que este contrato de prueba), aunque funciona correctamente en la solidez del navegador? ¿Hay algún problema conocido en la solidez del navegador que pueda causar esto? ¿Esto da una pista sobre qué problema podría haber en ese contrato?

La fuente de Solidity, que funciona correctamente en browser-solidity:

pragma solidity ^0.4.7;

contract owned {
  address owner;
  function owned() {
    owner = msg.sender;
  }
}

contract mortal is owned {
  function kill() {
    if (msg.sender == owner) selfdestruct(owner);
  }
}

contract IdMgmt is mortal {

  struct acl {
    string dataType;
    string permissions;
  }

  mapping (address => acl) public aclOf;

  function IdMgmt() { }

  function createId(address _user, string _dataType, string _permissions) {
    aclOf[_user].dataType = _dataType;
    aclOf[_user].permissions = _permissions;
  }

  function getPermissions(address _user, string _dataType) constant
    returns (string userPermissions) {

    if (stringsEqual(aclOf[_user].dataType, _dataType)) {
      userPermissions = aclOf[_user].permissions;
    }
    else {
      userPermissions = "NO DATA";
    }
  }

  function stringsEqual(string _a, string _b) internal returns (bool) {
    bytes memory a = bytes(_a);
    bytes memory b = bytes(_b);
    if (a.length != b.length) {
      return false;
    }
    for (uint i = 0; i < a.length; i ++) {
      if (a[i] != b[i]) return false;
    }
    return true;
  }
}
Por favor vea mi EDICIÓN posterior. El tema es que eth_getCodeno devuelve ningún código en la dirección del contrato. Sin embargo, cuando se implementó un contrato mucho más simple, eth_getCode devuelve el código implementado. Por lo tanto, posiblemente haya algún problema en el código del contrato, aunque la transacción de implementación se extrae y el recibo muestra una dirección de contrato. La causa raíz no está relacionada coneth_call
Si sospecha que hay un problema en la fuente de solidez, ¿por qué no publica la fuente? stackoverflow.com/help/mcve
Se agregó el código. Fue solo después de que vi eth_getCodedevolver el código implementado correctamente para un contrato mucho más simple que pensé que el problema podría estar en el código de Solidity.
Ahora, su pregunta se envió para volver a abrir y estará disponible pronto.
@niksmac: ¿por qué mi pregunta aún muestra un banner en la parte superior con el mensaje: "Es posible que esta pregunta ya tenga una respuesta aquí: cómo..."? Pensé que después de agregar el código y la pregunta se activa, ese mensaje desaparecería.
@AjoyBhatia, comparta la dirección del contrato y el comando completo que usa para hacer una eth_getCodellamada. Quiero intentar reproducir esto.

Respuestas (1)

Este problema está resuelto. Resultó que el IdMgmtcontrato en realidad no se implementó debido a la insuficiencia de gas. El contrato se implementó y los métodos funcionaron cuando suministré más gas.

El testcontrato más simple con solo una función para devolver el doble de su entrada entera necesitaba menos gas, por lo que funcionó.

Tiene sentido, pero sería bueno si los registros hubieran mostrado eso, pero los registros solo mostraron que se extrajo con éxito. Además, en la interfaz de usuario del navegador Parity, mostraba el contrato como implementado y se mostraba la dirección. Así que todo se veía bien.