Soy querying
un a mapping
través de un web3
call
como 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 orderValue
es > 15, aparece el siguiente error:
Error: no se pudieron decodificar bytes32 de ABI: 0x El tamaño no coincide.
Si orderValue
es <= 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 orders
con Parity
estoy recuperando algunos valores. ¿Qué estoy haciendo mal?
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 Parity
podía hacer consultas sobre él, aunque devolvía 0x000
valores ( web3
no 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: fromAscii
no usartoHex
fromAscii es cadena -> bytes
toHex es cualquier cosa -> bytes
Couldn't decode bytes32 from ABI: 0x The size doesn't match.
Raghav Sood
solwarr10r
0x0a
me da el mismo error:Couldn't decode bytes32 from ABI: 0x The size doesn't match.
usuario19510
orderValue
en lugar deweb3.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" cadaorderValue
vez 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.solwarr10r
string
"prueba", por ejemplo, obtengo:Given parameter is not bytes: "test"