Ich bin querying
ein mapping
via a web3
call
wie folgt:
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);
}
});
Wenn orderValue
> 15 ist, erhalte ich die folgende Fehlermeldung:
Fehler: Konnte bytes32 nicht von ABI entschlüsseln: 0x Die Größe stimmt nicht überein.
Wenn orderValue
<= 15 (z. B. 10) ist, erhalte ich die folgende Fehlermeldung:
throw new Error('Angegebene Parameterbytes haben eine ungültige Länge: "'+ value + '"');
Fehler: Angegebene Parameterbytes haben eine ungültige Länge: "0xa"
die Abbildung im Smart Contract sieht wie folgt aus:
struct Order {
bytes32 orderId;
uint32 orderAmount;
}
mapping(bytes32 => Order) public orders;
Bei einer Abfrage orders
mit erhalte Parity
ich einige Werte zurück. Was mache ich falsch?
Die Antwort hier ist, dass der Vertrag bereitgestellt wurde, aber leer ist !
In Abschnitt 7.1 des gelben Papiers heißt es: „Während der Initialisierungscode ausgeführt wird, existiert die neu erstellte Adresse, jedoch ohne intrinsischen Körpercode. Bei einem normalen STOP-Code oder wenn der zurückgegebene Code ansonsten leer ist, wird der Zustand belassen ein Zombie-Konto, und das verbleibende Guthaben wird für immer auf dem Konto gesperrt" (Dank an Benutzer Thomas Clowes)
Was mich verwirrte, war, dass Parity
Abfragen darauf durchgeführt werden konnten, obwohl es 0x000
Werte zurückgab ( web3
nichts als Fehler zurückgab). Also dachte ich, der Vertrag sei nicht leer!
Sie geben ihm Bytes (Byte[]), nicht Bytes32. Es muss mit 0 aufgefüllt bleiben, damit der Vertrag es akzeptiert.
Bearbeiten: Verwenden Sie fromAscii
nichttoHex
fromAscii ist String -> Bytes
toHex ist alles -> Bytes
Couldn't decode bytes32 from ABI: 0x The size doesn't match.
Raghav Sood
sunwarr10r
0x0a
gibt mir den gleichen Fehler:Couldn't decode bytes32 from ABI: 0x The size doesn't match.
Benutzer19510
orderValue
statt aufweb3.utils.toHex(orderValue)
. Das sollte die Fehler "ungültige Länge" beseitigen. Danach erhalten Sie vermutlich den Fehler "Bytes32 konnten nicht von ABI dekodiert werden" für jedenorderValue
Durchgang. Dies liegt höchstwahrscheinlich daran, dass die ABI- oder Vertragsadresse falsch ist. Sie müssten die Werte, die Sie verwenden, mit jemandem teilen, der Ihnen bei der Untersuchung hilft.sunwarr10r
string
z. B. nur einen "Test" bestehe, bekomme ich:Given parameter is not bytes: "test"