He escrito algo de código de Solidity, con un método setter createId
para escribir un par nombre-valor para contratar el almacenamiento y un método getter getPermissions
para obtener el valor asociado con un nombre en particular. Funciona correctamente en la solidez del navegador (en la captura de pantalla a continuación, createId
se llamó antes getPermissions
).
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_getCode
solicitud 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_getCode
no funciona correctamente, utilicé la API JSON RPC eth_call
para 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_getCode
devolvió 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_call
la 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;
}
}
Este problema está resuelto. Resultó que el IdMgmt
contrato 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 test
contrato 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.
niksmac
Ajoy Bhatia
eth_getCode
no 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
niksmac
Ajoy Bhatia
eth_getCode
devolver 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.niksmac
Ajoy Bhatia
Ajoy Bhatia
q9f
eth_getCode
llamada. Quiero intentar reproducir esto.