Error: no se pudo decodificar bytes32 de ABI: 0x El tamaño no coincide

Soy queryingun a mappingtravés de un web3 callcomo este:

var Web3 = require('web3'); 
const web3 = new Web3(new Web3.providers.HttpProvider('https://kovan.infura.io/key...'));
var contractABI = new web3.eth.Contract([...abi...], contractAddress);
var orderValue = '15';
contractABI.methods.orders(web3.utils.toHex(orderValue)).call(function(err, result) {
        if (!err) {
            callback(result);
        } else {
            callback(err);
        }
    });

Si orderValuees > 15, aparece el siguiente error:

Error: no se pudieron decodificar bytes32 de ABI: 0x El tamaño no coincide.

Si orderValuees <= 15 (por ejemplo, 10), aparece el siguiente error:

throw new Error('Los bytes de parámetro dados tienen una longitud no válida: "'+ valor + '"');

Error: los bytes de parámetros dados tienen una longitud no válida: "0xa"

el mapeo en el contrato inteligente se ve así:

struct Order {
    bytes32 orderId;
    uint32 orderAmount;
}
mapping(bytes32 => Order) public orders;

Si consulta orderscon Parityestoy recuperando algunos valores. ¿Qué estoy haciendo mal?

Intenta pasar 0x0a
0x0ame da el mismo error:Couldn't decode bytes32 from ABI: 0x The size doesn't match.
Simplemente pase orderValueen lugar de web3.utils.toHex(orderValue). Eso debería aclarar los errores de "longitud no válida". Después de eso, presumiblemente obtendrá el error "No se pudieron decodificar bytes32 de ABI" cada orderValuevez que pase. Lo más probable es que esto se deba a que la ABI o la dirección del contrato son incorrectas. Necesitaría compartir los valores que está usando para que alguien lo ayude a investigar eso.
Si acabo de pasar una string"prueba", por ejemplo, obtengo:Given parameter is not bytes: "test"

Respuestas (2)

La respuesta aquí es que el contrato se implementó, ¡pero vacío !

La Sección 7.1 del documento amarillo establece que "mientras se ejecuta el código de inicialización, la dirección recién creada existe pero sin un código de cuerpo intrínseco. Para un código de PARADA normal, o si el código devuelto está vacío, entonces el estado queda con una cuenta zombie, y cualquier saldo restante se bloqueará en la cuenta para siempre" (Gracias al usuario Thomas Clowes)

Lo que me confundía era que Paritypodía hacer consultas sobre él, aunque devolvía 0x000valores ( web3no devolvía nada más que errores). ¡Así que pensé que el contrato no estaba vacío!

Le estás dando bytes, (byte[]), no bytes32. Debe dejarse rellenado con 0 para que el contrato lo acepte.

Editar: fromAsciino usartoHex

fromAscii es cadena -> bytes

toHex es cualquier cosa -> bytes

Sigue siendo el mismo error:Couldn't decode bytes32 from ABI: 0x The size doesn't match.
¿Incluso después del relleno izquierdo para tener un elemento de 32 bytes?