Die Transaktionsbestätigung enthält alle Protokolleinträge, aber nur die letzten beiden werden von web3 dekodiert

Ich habe einen Flow, der 4 Ereignisse ergibt.

Wenn ich den Transaktionshash über web3.js erhalte, kann ich sehen, dass alle 4 Ereignisse in den Empfangsprotokollen enthalten sind, aber nur die letzten 2 Ereignisse in den dekodierten Protokollen sind (was bedeutet, dass ich die ersten 2 Ereignisse selbst dekodieren muss):

{
    "receipt": {
        ...
        "logs": [
            {
                "logIndex": 0,
                ...
            },
            {
                "logIndex": 1,
                ...
            },
            {
                "logIndex": 2,
                ...
            },
            {
                "logIndex": 3,
                ...
            }
        ],
        ...
    },
    "logs": [
        {
            "logIndex": 2,
            ...
        },
        {
            "logIndex": 3,
            ...
        }
    ]
}

Was ist der Grund dafür?

Es könnte hilfreich sein, wenn Sie den von Ihnen erwähnten Fluss ausführlicher erklären. Ich vermute, es gibt etwas im Fluss (außerhalb von web3), das dies verursacht, aber ohne Kontext ist es schwer zu sagen. Vielleicht verstehe ich deine Frage aber falsch.
@ThomasJayRush: Ich kann meine On-Chain-Seite (Solidity-Code) hinzufügen, aber ich denke, es wäre nur TMI. Von web3 aus rufe ich eine Vertragsfunktion auf, die eine andere Vertragsfunktion usw. aufruft. Am Ende dieses Ablaufs werden 4 Ereignisse generiert. Der receiptTeil zeigt es deutlich, aber der Teil des decodierten Protokolls enthält nur Teilinformationen. Wenn ich ähnliche Flows mit nur 2 Ereignissen ausführe, werden alle dekodiert. Vielleicht gibt es eine Web3-Beschränkung für die Menge der decodierten Ereignisse, aber es fühlt sich eindeutig wie ein Problem auf der Web3-Seite an. Danke schön!!!
Hast du es mal mit dem Gitterkanal versucht?
@ThomasJayRush: Du meinst, auf GitHub fragen?
@ThomasJayRush: Ich glaube, ich habe die Antwort, siehe unten.

Antworten (1)

OK, ich verstehe den Grund:

Alle Ereignisse, die während der Ausführung der von web3 aufgerufenen Funktion generiert werden, sind in den Empfangsprotokollen enthalten, aber nur die Ereignisse, die im Rahmen des Vertrags, in dem die Funktion implementiert ist, generiert werden , werden in die decodierten Protokolle aufgenommen.

Zum Beispiel bei folgendem On-Chain-Code:

Datei IContract1.sol:

pragma solidity ^0.4.18;

interface IContract1 {
    function func(uint256 x) external returns (uint256);
}

Datei Contract1.sol:

pragma solidity ^0.4.18;
import "./IContract1.sol";

contract Contract1 is IContract1{
    event Event1(uint256 x);
    function func(uint256 x) external returns (uint256) {
        Event1(x);
        return x;
    }
}

Datei Contract2.sol:

pragma solidity ^0.4.18;
import "./IContract1.sol";

contract Contract2 {
    IContract1 private contract1;
    function Contract2(IContract1 _contract1) public {
        contract1 = _contract1;
    }
    event Event2(uint256 x);
    function func(uint256 x) external returns (uint256) {
        Event2(x);
        return contract1.func(x);
    }
}

Wenn ich den folgenden Off-Chain-Code ausführe:

let contract1 = await artifacts.require("Contract1.sol").new();
let contract2 = await artifacts.require("Contract2.sol").new(contract1.address);

let hash = await contract2.func(42);

Dann hash.receipt.logswerden sowohl Event1als auch enthalten sein Event2.

Aber hash.logsbeinhaltet nur Event2.