Fehler: Konnte bytes32 nicht von ABI entschlüsseln: 0x Die Größe stimmt nicht überein

Ich bin queryingein mappingvia a web3 callwie 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 ordersmit erhalte Parityich einige Werte zurück. Was mache ich falsch?

Versuchen Sie, 0x0a zu übergeben
0x0agibt mir den gleichen Fehler:Couldn't decode bytes32 from ABI: 0x The size doesn't match.
Pass einfach orderValuestatt auf web3.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 jeden orderValueDurchgang. 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.
Wenn ich stringz. B. nur einen "Test" bestehe, bekomme ich:Given parameter is not bytes: "test"

Antworten (2)

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 ParityAbfragen darauf durchgeführt werden konnten, obwohl es 0x000Werte zurückgab ( web3nichts 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 fromAsciinichttoHex

fromAscii ist String -> Bytes

toHex ist alles -> Bytes

Immer noch der gleiche Fehler:Couldn't decode bytes32 from ABI: 0x The size doesn't match.
Auch nach dem Auffüllen nach links, um ein 32-Byte-Element zu haben?