Devolver el byte [64] de una función funciona en TestRPC no en Geth

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?

Respuestas (2)

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 realidad, lo estoy probando en Geth of Quorum, no en Vanilla Ethereum. Entonces, en el quórum, obtengo bytes vacíos.
En un nivel alto, la versión de Geth de Quorum realmente no es tan diferente de Geth estándar: todavía expone exactamente la misma interfaz JSON RPC, tiene casi la misma estructura de bloques, funciona con web3, etc. Sigo pensando que la causa de su tema es algo más fundamental.
Acabo de probar en Geth de Vanilla Etherum y está funcionando. Todavía no funciona en el geth de Quorum.
¿Puedes probarlo en Quorum?
En la consola de Quorum veo este error:VM returned with error err="invalid opcode 0xfd"

En str_to_bytesfunción cambia byte[64] final_str;a byte[64] memory final_str;y funciona en Quorum también.