eth.getPastLogs () erfordert eine exakte Übereinstimmung des 32-Byte-Werts. Wie kann man Bignumber zum Ausgeben bringen?

Die API eth.getPastLogs() erfordert 4 Themen, um mit den Protokollindizierungsfunktionen der EVM übereinzustimmen. Es scheint eine vollständige 32-Byte-Zahl zu erfordern, damit die Übereinstimmung funktioniert. dh

eth.getPastLogs((fromBlock:0, toBlock: 'latest', address '0xabc',
    topics: [ null, '0x25', null, null ] })

wird kein Thema finden, das hat

`0x0000000000000000000000000000000000000000000000000000000000000025`

drin

aber das passt zum besagten Thema:

eth.getPastLogs((fromBlock:0, toBlock: 'latest', address '0xabc',
    topics: [ null,'0x0000000000000000000000000000000000000000000000000000000000000025', null, null ] })

Also erste Frage - ist das ein Fehler, und zweite Frage, wie bekomme ich bignumber.js dazu, eine Ausgabe aller 32 Bytes zu erzwingen? toString(16) gibt mir keine führenden Nullen oder das '0x'. Muss ich eine spezielle Funktion schreiben oder gibt es schon eine in web3.js und ich kann sie einfach nicht finden?

Antworten (3)

Ich habe die obige Antwort positiv bewertet, aber sie wird bald veraltet sein, da web3.js in v1.0 die Padding- Funktionen verfügbar macht. Es ist besser, das Rad nicht neu zu erfinden.

Also mein Code sieht so aus:

topic = '0x' + web3.utils.padLeft(new BigNumber(someNumber).toString(16), 64);

Ist es ein Fehler? Möglich, aber wenn ja, wird es nicht behoben: https://github.com/ethereum/web3.js/issues/431

Wie bekomme ich die entsprechende 32-Byte-Auffüllung für eine BigNumber? Wie Sie vorschlagen, sollte es in web3.js eine Funktion dafür geben, aber die einfache Lösung besteht darin, einfach so etwas zu tun:

function bigNumberToPaddedBytes32(num) {
    var n = num.toString(16).replace(/^0x/, '');
    while (n.length < 64) {
        n = "0" + n;
    }
    return "0x" + n;
}
also ohne ABI (wie bei getPastLogs) wird alles als bytes32 behandelt... gut zu wissen...

Die BigNumber- BN.jBibliothek hat auch lengthein Argument in toString(base, length)der Methode:

topic = '0x' + new web3.utils.BN(someNumber).toString(16, 64);