Tengo un contrato inteligente que devuelve una matriz de bytes [64]. En testrpc obtengo la matriz correcta, pero en Geth obtengo una matriz con todos los "0x".
Aquí está el código del contrato inteligente:
pragma solidity ^0.4.18;
contract DataStore
{
function stringToBytes32(string memory source) returns (bytes32 result) {
assembly {
result := mload(add(source, 32))
}
}
function DataStore()
{
}
function str_to_bytes(string str) constant returns (byte[64]){
bytes memory b = bytes(str);
byte[64] final_str;
for(uint i; i<b.length; i++){
final_str[i] = b[i];
}
return final_str;
}
function getValue() public returns (byte[64])
{
return str_to_bytes("sasdasdasdasdasdasd");
}
}
La salida de la getValue()
función es incorrecta en Geth pero es correcta en TestRPC.
¿Alguna idea de por qué sucede esto?
Sospecho que su nodo Geth no está completamente sincronizado, está apuntando a la dirección incorrecta o el contrato no está implementado correctamente en la red a la que apunta Geth.
He implementado el contrato en Rinkeby y cuando llamo a la función getValue veo el resultado esperado:
bytes1[64]: 0x73, 0x61, 0x73, 0x64, 0x61, 0x73, 0x64, 0x61, 0x73, 0x64, 0x61, 0x73, 0x64, 0x61, 0x73, 0x64, 0x61, 0x73, 0x6, 0x0, 0x0, 0x0 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
Un comentario sobre el código, le sugiero que modifique la función getValue a la constante o vista para evitar que se tenga que extraer la transacción para ver el resultado de la función:
function getValue() public view returns (byte[64])
{
return str_to_bytes("sasdasdasdasdasdasd");
}
En str_to_bytes
función cambia byte[64] final_str;
a byte[64] memory final_str;
y funciona en Quorum también.
prusty narayan
stevejaxon
prusty narayan
prusty narayan
prusty narayan
VM returned with error err="invalid opcode 0xfd"