Wie soll ich das Objekt nennen, das von einem Funktionsaufruf des Truffle-Vertrags zurückgegeben wird?

Wenn ich einen Vertragsfunktionsaufruf über Truffle durchführe und dann das zurückgegebene Versprechen auflöse, erhalte ich etwa Folgendes:

{
    "tx": "0x...",
    "receipt": {
        "transactionHash": "0x...",
        "transactionIndex": 0,
        "blockHash": "0x...",
        "blockNumber": 24,
        "gasUsed": 42860,
        "cumulativeGasUsed": 42860,
        "contractAddress": null,
        "logs": [
            {
                "logIndex": 0,
                "transactionIndex": 0,
                "transactionHash": "0x...",
                "blockHash": "0x...",
                "blockNumber": 24,
                "address": "0x...",
                "data": "0x...",
                "topics": [
                    "0x...",
                    "0x...",
                    "0x..."
                ],
                "type": "mined"
            }
        ],
        "status": "0x1",
        "logsBloom": "0x..."
    },
    "logs": [
        {
            "logIndex": 0,
            "transactionIndex": 0,
            "transactionHash": "0x...",
            "blockHash": "0x...",
            "blockNumber": 24,
            "address": "0x...",
            "type": "mined",
            "event": "Transfer",
            "args": {
                "from": "0x...",
                "to": "0x...",
                "value": "0"
            }
        }
    ]
}

Ich bin mir nicht sicher, wie genau Truffle web3.js umschließt, um Vertragsfunktionen aufzurufen, daher bin ich mir nicht sicher, wo ich in der web3.js-Dokumentation nachsehen soll. Aber ich verwende Truffle v4.1.14, das auf web3.js v0.18.4 basiert, und die Dokumentation für web3.js v0.x ist etwas schwer zu lesen, also habe ich in der Dokumentation stattdessen nach web3.js v1.x gesucht.

Jetzt sollte ich wohl in web3.eth.sendSignedTransaction nachsehen , was Folgendes zurückgibt:

Ein Promise Combined Event Emitter. Wird gelöst, sobald der Transaktionsbeleg verfügbar ist.

Es scheint also, dass Truffle diese Quittung nimmt und sie in ein JSON-Objekt einbettet, das die folgenden zusätzlichen Felder enthält:

  1. tx, was der Transaktionshash ist, nehme ich an
  2. logs, die einige oder alle der receipt.logs, aber entschlüsselt enthält

Also, was genau ist hier los?

Dieses neue Objekt ist sicherlich nicht die in den Dokumenten beschriebene Quittung.

Gibt es dafür eine offizielle Terminologie oder handelt es sich nur um einen „Trüffel-Hack“, der mir das Entschlüsseln von Ereignissen erleichtern soll?

Danke schön.

Antworten (1)

Trüffel gibt eindeutig ein eigenes Objekt zurück. Es wird sicherlich die originale web3-Quittung enthalten, die gekennzeichnet ist, receiptweil Truffle web3 0.x verwendet, wie Sie erwähnt haben. Die hinzugefügten Attribute sind also nichts weiter als ein Versuch von Trüffel, sein Framework zu verbessern und die Schicht über web3 zu halten.

Ich glaube nicht, dass es eine bestimmte Terminologie für dieses Objekt gibt, oder zumindest wird es immer von der transactionReceiptvon Web3 überschattet, daher wird für beide derselbe Name verwendet.

Aber wenn ich versuchen würde, meinen Testcode außerhalb von Truffle kompatibel zu halten (angenommen, ich habe zum Beispiel einige gängige JS-Dienstprogramme, die ich für die "Echtzeit" -Interaktion mit dem Ethereum-Netzwerk verwenden möchte), sollte ich mich wahrscheinlich nicht darauf verlassen zusätzliche Schicht, richtig?
Ja, oder Sie könnten separate Testprogramme für Trüffel und für die Außenseite von Trüffel schreiben. es ist nicht so schwer, wenn man bedenkt, dass es nur ein json-Attribut entfernt ist.
Ich entschied, dass der Name responseangemessen genug wäre. Dann kann ich auf response.tx, response.logs, response.receipt, response.receipt.logs, usw. verweisen.
Übrigens, hätten Sie eine Ahnung, wie Truffle den Veranstaltungsnamen aus der Quittung extrahieren kann? Im obigen Beispiel ist es in response.logs[0].event.