Wie konvertiere ich Hexadezimalwerte in ein lesbares Format?

Ich verwende die Etherscan-API, um die Ereignisprotokolle abzurufen:

http://api-ropsten.etherscan.io/api?module=logs&action=getLogs&fromBlock=3147081&toBlock=latest&address=0x8685ab734df053d736164f5c07e22335ba7dda29&topic0=0xcded53d631ce4a38a1f90d59e5f2f9c023cd28c64aa66488e9462cc4a64a032f&apikey=YourApiKeyToken

Das Ergebnis ist ein Objekt mit hexadezimalen Werten:

{
  "status": "1",
  "message": "OK",
  "result": [
    {
      "address": "0x8685ab734df053d736164f5c07e22335ba7dda29",
      "topics": [
        "0xcded53d631ce4a38a1f90d59e5f2f9c023cd28c64aa66488e9462cc4a64a032f"
      ],
      "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b579d4f1546d51980499aa96a2e411be3e449197000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000001",
      "blockNumber": "0x30054a",
      "timeStamp": "0x5ae8016c",
      "gasPrice": "0x12a05f200",
      "gasUsed": "0x23aea",
      "logIndex": "0x8",
      "transactionHash": "0xb010aa74f66b00a9827044a3bfe4720bb1e057f243e5cae52307bafe2c2bb5d8",
      "transactionIndex": "0xf"
    }
  ]
}

Ich rufe die API von meinem NodeJS-Server auf und habe versucht , web3.toAscii()die Hexadezimalwerte in ein lesbares Format zu konvertieren - keiner von ihnen funktioniert.ethjs.toAscii()ethjs.toUtf8()

Das einzige, was ich umwandeln kann, sind Hexadezimalzahlen in lesbare Zahlen wie blocknumber usingparseInt()

Hier ist eine grundlegende Struktur meines Vertragscodes:

contract EtherBlock {
    uint256 public nonce;
    event eOpenPosition(uint256 indexed PositionKey, address indexed Opener, uint256 EtherTossed, uint8 OddEven);
    function OpenPosition (uint8 OddEven) public {
        emit eOpenPosition(nonce, msg.sender, msg.value, OddEven);
    }
}

Wo fehlt es mir? Wie kann ich die Ereignisdatenprotokolle in ein lesbares Format konvertieren? Was ist die 'Decode'-Funktion in Javascript?

Antworten (2)

Versuche dies:

let EVENT = [
    {name: "PositionKey", size: 256, indexed: true },
    {name: "Opener"     , size: 160, indexed: true },
    {name: "EtherTossed", size: 256, indexed: false},
    {name: "OddEven"    , size:   8, indexed: false},
];

function decode(data) {
    let event = {};
    let index = "0x".length;
    for (let i = 0; i < EVENT.length; i++) {
        if (!EVENT[i].indexed) {
            let name = EVENT[i].name;
            let size = Math.floor(EVENT[i].size / 4);
            event[name] = web3.toBigNumber("0x" + data.substr(index, size));
            index += size;
        }
    }
    return event;
}
Ich habe das Hexfeld "Daten" und das Ergebnis dekodiert und es wurde eine sehr lange Zahl zurückgegeben. Wie kann ich die Ereignisprotokolldaten von dieser Nummer lesen?
@SowmayJain: Sie sollten es entsprechend den Parametern, die Sie in Ihrem Ereignis übergeben, in Teile aufteilen. Ich habe eine 'Decodier'-Funktion in Javascript, wenn Sie interessiert sind, aber Sie müssen die Frage umformulieren, damit sie eine angemessene Antwort gibt.
Frage geändert. Wie kann ich also diese lange Dezimalzahl entschlüsseln?
@SowmayJain: Bitte geben Sie Ihren Solidity-Code oder zumindest die Struktur des Ereignisses an, das Sie in Ihrem Vertrag ausgeben.
Die Frage wird mit dem Basiscode aktualisiert. Vielen Dank :)
@SowmayJain: Die Antwort wird entsprechend aktualisiert.
Können Sie einen genauen Artikel oder Kurs vorschlagen, der das gesamte Konzept von Hexa zu Big Number zu was auch immer erklärt?

Du solltest benutzenweb3.toDecimal(hexString)

Ich hoffe das hilft.

Ich habe das Feld "Daten" hex dekodiert und das Ergebnis ist: 1.552518092300709e+231. Wie kann ich die Ereignisprotokolle in lesbarem Format erhalten?
Sie müssen klären, was Ihre Datenvariable darstellt. es ist in der Tat eine große Zahl, wenn man sich nur die hexadezimale Darstellung ansieht, was erwarten Sie zu sehen?
Ich erwarte, die Parameter in dem von Smart Contract ausgegebenen Ereignis zu sehen. Wie kann ich es erreichen?
Sie müssen Ihren Code und die Definition des Ereignisses zeigen, das diese Daten erzeugt
Die Frage wird mit dem Basiscode aktualisiert. Danke Jaime.
Die Antwort von @goodvibration scheint richtig zu sein, lassen Sie mich wissen, ob es für Sie funktioniert
Können Sie einen genauen Artikel oder Kurs vorschlagen, der das gesamte Konzept von Hexa zu Big Number zu was auch immer erklärt?
Alles in digitalen Systemen, wie Computern, ist im Binärsystem gespeichert und sonst nichts. Der Grund dafür ist, dass es zwei Symbole hat, die in Form von physikalischen Größen wie Spannung, 0 oder 5 Volt in den elektronischen Schaltungen dargestellt werden können. Alles, was Sie sehen: Hex, Dezimal, ASCII usw. ist nur eine Möglichkeit, einige Binärzahlen zu visualisieren. Die Konvertierung von binär zu einem anderen System erfolgt nur aus Gründen der Bequemlichkeit. Zum Beispiel weisen ASCII einem Buchstaben eine Zahl zu, dann können wir Buchstaben speichern, indem wir die diesem Buchstaben zugewiesene Binärzahl speichern.
Wir verwenden keine Binärzahl, weil "für Menschen" nicht praktikabel ist, zum Beispiel ist 8 "1000" in Binärform, also ist die Dezimalzahl kompakter. Dezimal ist jedoch auch für große Zahlen unpraktisch und Hexadezimal ist kompakter, zum Beispiel ist 65535 FFFF in Hexadezimal. Jetzt die Funktionen zum Konvertieren, um Ihnen die Daten in dem für Sie bequemeren Format zu geben. Aber denken Sie daran, dass weder im Computer noch Ethereum in Hexadezimal, Accii, Dezimal usw. gespeichert ist. Alles ist in einer binären Darstellung, was eigentlich bedeutet, dass Transistoren geöffnet oder geschlossen sind und an einigen ihrer Anschlüsse 0 oder 5 V haben
Wie kann ich diese Zahl in eine vollständige Zahlenfolge umwandeln - 1.552518092300709e+231? Ich habe dies mit BigNumber() versucht, aber es zeigt eine ungültige Zahl zurück.
Wenn dies eine große Zahl ist, sagen wir, in x gespeichert, können Sie x.toString (10) tun.