Wie konvertiere ich Transaktionseingaben in lesbare Werte?

Ich habe die Eingabe der folgenden Transaktion:

{
    name: 'trade',
    types: [
        'address',
        'uint256',
        'address',
        'uint256',
        'uint256',
        'uint256',
        'address',
        'uint8',
        'bytes32',
        'bytes32',
        'uint256'
    ],
    inputs: ['ac709fcb44a43c35f0da4e3163b117a17f3770f5',
        <BN: 878678326eac900000>,
        '0000000000000000000000000000000000000000', 
        <BN: bf2aa18455018000>, 
        <BN: 302bdf>,
        <BN: dc51da3a>,
        'd8eeda4ee2657bb267bc35c1d60babdc5aedd269', 
        <BN: 1c>,
        <Buffer b4 bf 0 d cd 37 ca 73 bd 5 a bc e9 53 2 b 03 3 d cc 64 27 be 16 06 83 de 11 3e fc a4 13 20 c2 7 f 3e>, 
        <Buffer 78 79 9 d 84 04 0e 5 c 24 58 28 b1 b5 31 ef 97 e1 af 12 49 46 f4 dc 1 d b5 a2 0 c f2 8 a 70 73 b2 69>, 
        <BN: 275dcc081d0c2351e0>
    ]
}

Diese Daten stammen aus rohen Transaktionseingaben

0x0a19b14a000000000000000000000000ac709fcb44a43c35f0da4e3163b117a17f3770f50000000000000000000000000000000000000000000000878678326eac9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf2aa184550180000000000000000000000000000000000000000000000000000000000000302bdf00000000000000000000000000000000000000000000000000000000dc51da3a000000000000000000000000d8eeda4ee2657bb267bc35c1d60babdc5aedd269000000000000000000000000000000000000000000000000000000000000001cb4bf0dcd37ca73bd5abce9532b033dcc6427be160683de113efca41320c27f3e78799d84040e5c245828b1b531ef97e1af124946f4dc1db5a20cf28a7073b2690000000000000000000000000000000000000000000000275dcc081d0c2351e0

Wie kann ich Eingaben in lesbare Zeichenfolgenwerte konvertieren?

PS: Damit readable string valuesmeine ich konvertierte Werte von BNund Buffer-Typen in utf8-Strings.

Können Sie erklären, woher diese Daten stammen und was Sie herausbekommen wollen? (Wie würden "lesbare Zeichenfolgenwerte" aussehen?)
@smarx Ich habe meine Frage aktualisiert, hoffe, das macht jetzt mehr Sinn :)
Ich bin immer noch nicht sicher, was du meinst. Tut .toString()auf dem BNs und .toString('hex')auf dem Bufferswas du willst?
Lass mich bitte einmal nachsehen

Antworten (4)

Das Tool ethereum-input-data-decoder , mit dem Sie die codierten Eingabedaten decodiert haben, gibt uintTypen als Big Numbers und byte32Typen als Buffers zurück .

Um in ein lesbares Format zu konvertieren, rufen Sie einfach die toStringMethode auf.

Beispiele

// big number to decimal string
myBN.toString(10) 

// buffer to hex string
myBuffer.toString(16) 

Hier ist eine der vielen Möglichkeiten, dies zu tun. Für diese Methode benötigen Sie Quellcode und Vertragsadresse.

  1. Verwenden Sie entweder Metamaske oder geben Sie Ihren benutzerdefinierten web3-Anbieter auf der Online-IDE ein
  2. Kompilieren Sie Ihren Quellcode
  3. Geben Sie die Adresse des bereitgestellten Vertrags ein, der auf ide geladen werden soll
  4. Aktivieren Sie die Optionsschaltfläche zum Anhören des Netzwerks
  5. Sie können die Eingabe der übermittelten Transaktionen lesen

Das sind Ihre Daten,

Die ersten 4 Bytes kodieren die Funktion. 0x0a19b14a

Im Folgenden werden die Parameter codiert. Jede Zeile hat 32 Bytes. Sie haben 12 Zeilen, da Sie 12 Parameter haben (für dynamische Variablen ist dies komplizierter und eine Variable kann mehr als eine Zeile einnehmen und die Reihenfolge nicht beibehalten (sie wird auf ihren Wert "zeigen").

000000000000000000000000ac709fcb44a43c35f0da4e3163b117a17f3770f5 0000000000000000000000000000000000000000000000878678326eac900000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000bf2aa18455018000 0000000000000000000000000000000000000000000000000000000000302bdf 00000000000000000000000000000000000000000000000000000000dc51da3a 000000000000000000000000d8eeda4ee2657bb267bc35c1d60babdc5aedd269 000000000000000000000000000000000000000000000000000000000000001c b4bf0dcd37ca73bd5abce9532b033dcc6427be160683de113efca41320c27f3e 78799d84040e5c245828b1b531ef97e1af124946f4dc1db5a20cf28a7073b269 0000000000000000000000000000000000000000000000275dcc081d0c2351e0

Beachten Sie, dass die erste Zeile die Adresse ist. die zweite ist ein uint256, in hexadezimal: 00000000000000000000000000000000000000000000878678326eac900000

Sie müssen es in Dezimalzahlen umwandeln. Das Ergebnis ist 2500000000000000000000.

Ich weiß nicht, ob die bytes32 eine Zeichenfolge ist. Wenn dies der Fall ist, können Sie von hexadezimal nach utf-8 decodieren. Sie können es über die Website https://onlineutf8tools.com/convert-hexadecimal-to-utf8 versuchen .

Sie können es mit ethersjs entschlüsseln . Sie müssen jedoch den Funktionsselektor in den Daten entfernen.

const inputTypes = [
        'address',
        'uint256',
        'address',
        'uint256',
        'uint256',
        'uint256',
        'address',
        'uint8',
        'bytes32',
        'bytes32',
        'uint256'
    ]
const input = '0x' + '0x0a19b14a000000000000000000000000ac709fcb44a43c35f0da4e3163b117a17f3770f50000000000000000000000000000000000000000000000878678326eac9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf2aa184550180000000000000000000000000000000000000000000000000000000000000302bdf00000000000000000000000000000000000000000000000000000000dc51da3a000000000000000000000000d8eeda4ee2657bb267bc35c1d60babdc5aedd269000000000000000000000000000000000000000000000000000000000000001cb4bf0dcd37ca73bd5abce9532b033dcc6427be160683de113efca41320c27f3e78799d84040e5c245828b1b531ef97e1af124946f4dc1db5a20cf28a7073b2690000000000000000000000000000000000000000000000275dcc081d0c2351e0'.slice(10)
const decoded = ethers.utils.defaultAbiCoder.decode(inputTypes, input)
decoded.forEach((data, i) => console.log(inputTypes[i], data.toString()))
address 0xAc709FcB44a43c35F0DA4e3163b117A17F3770f5
uint256 2500000000000000000000
address 0x0000000000000000000000000000000000000000
uint256 13775000000000000000
uint256 3156959
uint256 3696351802
address 0xD8eeda4ee2657Bb267bc35C1d60babdc5aEdD269
uint8 28
bytes32 0xb4bf0dcd37ca73bd5abce9532b033dcc6427be160683de113efca41320c27f3e
bytes32 0x78799d84040e5c245828b1b531ef97e1af124946f4dc1db5a20cf28a7073b269
uint256 726181804936299500000