Moonbase Alpha v2: Neue Vertragsereignisse und Pub / Sub

(Alberto Viera) (13. Oktober 2020)

Mit der -Version von Moonbase Alpha v2 , die gerade von PureStake angekündigt wurde, fügen wir einige neue und aufregende Funktionen hinzu, die Moonbeam dabei helfen, seinem primären Ziel näher zu kommen Bereitstellung einer nahtlosen Erfahrung für Projekte von Ethereum im Polkadot-Ökosystem. Eine der Hauptfunktionen, die hinzugefügt werden, ist die Möglichkeit, Ethereum-Smart-Contracts-Ereignisse und andere Blockchain-Informationen zu abonnieren.

Vertragsereignisse sind ein sehr wichtiger Bestandteil von dApps in Ethereum, da sie die Kommunikation zwischen Smart-Verträgen und erleichtern ihre Benutzeroberflächen. Ereignisse können als asynchrone Trigger mit Daten betrachtet werden. Wenn ein Vertrag ein Ereignis ausgibt, kann dies anschließend zu einer Aktion auf der Front-End-Seite führen.

Anwendungsfälle für Ereignisse

Ein einfaches Beispiel für ein Ereignis, das Sie verfolgen können, ist a Transfer. Angenommen, eine Übertragung wird von einem Benutzer über das Front-End einer dApp initiiert, wobei ein Transaktions-Hash abgerufen wird, sobald dieser gesendet wurde. Um dem Benutzer jedoch zu versichern, dass die Zahlung gesendet wurde, kann die dApp auf ein Ereignis (vom Vertrag ausgegeben) warten, wenn die Transaktion in die Blockchain übernommen wird. Dies kann folglich eine Anzeigemeldung an den Benutzer auslösen, die ihn darüber informiert, dass seine Aktion erfolgreich war.

Ein weiterer leistungsfähiger Anwendungsfall von Ereignissen ist die billigere Speicherung. Im Durchschnitt kosten Protokolle 8 Gas pro Byte, während die Vertragsspeicherung 20.000 Gas pro 32 Byte kostet. Daher können Ereignisse als Werkzeug zum Speichern und Abrufen erforderlicher Informationen wie z. B. Übertragungsprotokolle dienen. Sie können jedoch nicht für alle Anwendungsfälle als Speicher verwendet werden, da sie beispielsweise nicht von anderen intelligenten Verträgen aufgerufen werden können.

Die Bedeutung von Pub / Sub

In diesem Kontext sind wir jetzt bereit, über Pub / Sub zu sprechen.

Publish-Subscribe oder kurz Pub / Sub ist ein asynchroner Messaging-Dienst, der als Middleware zwischen den Herausgebern von Nachrichten fungiert. und Leute, die sie abonnieren. Im Allgemeinen kategorisieren Publisher diese Nachrichten in Klassen und veröffentlichen sie, ohne wirklich zu wissen, wer sie abonniert hat. In ähnlicher Weise melden sich Abonnenten in den interessierenden Klassen an und empfangen nur Nachrichten, die dieser Klasse zugeordnet sind, ohne zu wissen, wer ihr Herausgeber ist.

Mit der Veröffentlichung von Moonbase Alpha v2 , ein Pub / Sub-Dienst, der mit Ereignissen im Ethereum-Stil kompatibel ist, ist jetzt verfügbar.

Tutorial: Verwenden von Pub / Sub auf Moonbeam

Seit einem Bild sagt mehr als tausend Worte, um zu zeigen, wie Pub / Sub auf Moonbeam funktioniert.

Um dieser Demo zu folgen, benötigen Sie Folgendes:

Abonnieren von Ereignisprotokollen in Moonbase Alpha v2

Jeder Vertrag, der dem ERC-20-Token-Standard folgt, gibt ein Ereignis aus, das sich auf eine Übertragung von Token bezieht, dh event Transfer(address indexed from, address indexed to, uint256 value). In diesem Beispiel abonnieren wir die Protokolle solcher Ereignisse. Bei Verwendung der Web3 JS-Bibliothek benötigen wir den folgenden Code:

const Web3 = require("web3");
const web3 = new Web3("wss://wss.testnet.moonbeam.network");

web3.eth.subscribe("logs", {
address: "ContractAddress",
topics: ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}, (error, result) => {
if (error)
console.error(error);
})
.on("connected", function (subscriptionId) {
console.log(subscriptionId);
})
.on("data", function (log) {
console.log(log);
});

Beachten Sie, dass wir eine Verbindung zum WebSocket-Endpunkt von Moonbase Alpha herstellen. Wir verwenden die Methode web3.eth.subscribe("logs", options [, callback]), um die Protokolle zu abonnieren, die nach den angegebenen Optionen gefiltert werden. In unserem Fall sind die Optionen die Adresse des Vertrags, von der die Ereignisse gesendet werden, und die Themen, die zur Beschreibung des Ereignisses verwendet werden. Weitere Informationen zu Themen finden Sie in (diesem mittleren Beitrag). Wenn keine Themen enthalten sind, abonnieren Sie Um nur das Übertragungsereignis zu filtern, müssen wir jedoch die Signatur des Ereignisses einschließen, die wie folgt berechnet wird:

EventSignature = keccak256(Transfer(address,address,uint256))

Das Ergebnis der vorherigen Berechnung ist das, was zuvor im Code-Snippet gezeigt wurde. Wir werden später wieder nach Themen filtern. Der Rest des Codes übernimmt die Rückruffunktion.Sobald wir diesen Code ausführen, erhalten wir eine Abonnement-ID und das Terminal wartet über dieses Abonnement auf ein Ereignis:

Als Nächstes wird eine ERC20-Tokenübertragung mit den folgenden Parametern gesendet:

  • Von Adresse: 0x6Be02d1d3665660d22FF9624b7BE0551ee1Ac91b
  • An Adresse: 0xfcB0B397BB28046C01be6A3d66c7Eda99Fb0f344
  • Wert (Token): 10000000000000000000 – das sind 10 mit 18 mit 18

Sobald wir die Transaktion gesendet haben, wird das Protokoll des von der Transaktion ausgegebenen Ereignisses im Terminal angezeigt:

In den Protokollen sind viele Informationen enthalten, aber Sie könnten sich fragen: Wo sind die Informationen im ausgegebenen Ereignis? Und die Antwort lautet: In den Protokollen!

Unser Zielereignis sendet zwei indizierte Informationen, die „Von“ – und „Bis“ -Adressen (in dieser Reihenfolge), die wie Themen behandelt werden. Das andere Datenelement, das von unserer Veranstaltung geteilt wird, ist die Anzahl der Token, die nicht indiziert sind. Daher gibt es insgesamt drei Themen (maximal vier), die dem Opcode LOG3 entsprechen:

Folglich können Sie sehen, dass die Adressen „von“ und „bis“ in den von den Protokollen zurückgegebenen Themen enthalten sind. Ethereum-Adressen sind 40 Hex-Zeichen lang (1 Hex-Zeichen ist 4 Bit, daher 160 Bit oder H160-Format). Daher werden die zusätzlichen 24 Nullen benötigt, um die Lücke zu H256 zu füllen, die 64 Hex-Zeichen lang ist.

Was ist mit der Anzahl der Token? Nicht indizierte Daten werden im Feld „Daten“ der Protokolle zurückgegeben, diese werden jedoch in Bytes32 / Hex codiert. Um es zu dekodieren, können wir beispielsweise dieses Online-Tool verwenden und überprüfen, ob die „Daten“ tatsächlich 10 (plus 18 Nullen) sind.

Wenn das Ereignis mehrere nicht indizierte Werte zurückgibt, werden diese nacheinander in derselben Reihenfolge angehängt, in der das Ereignis sie ausgibt. Daher wird jeder Wert dann erhalten, indem Daten in separate 32-Byte-Teile (oder 64 hexadezimale Zeichen) zerlegt werden.

Dieses Beispiel zeigte, wie wir nur Ereignisprotokolle eines bestimmten Vertrags abonnieren konnten. Die Web3 JS-Bibliothek bietet jedoch andere Abonnementtypen, die in den folgenden Abschnitten behandelt werden.

Eingehende ausstehende Transaktionen abonnieren

Um ausstehende Transaktionen zu abonnieren, können wir verwenden die Methode web3.eth.subscribe("pendingTransactions", [, callback]), die dieselbe Rückruffunktion implementiert, um nach der Antwort zu suchen. Dies ist viel einfacher als in unserem vorherigen Beispiel und gibt den Transaktions-Hash der ausstehenden Transaktionen zurück.

Wir können überprüfen, ob dieser Transaktions-Hash mit dem in MetaMask (oder Remix) gezeigten identisch ist.

Abonnieren Sie eingehende Blockheader

Ein weiterer in der Web3 JS-Bibliothek verfügbarer Typ ist das Abonnieren neuer Blockheader. Zu diesem Zweck verwenden wir die Methode web3.eth.subscribe("newBlockHeaders" [, callback]) und implementieren dieselbe Rückruffunktion, um nach der Antwort zu suchen. Dieses Abonnement enthält eingehende Blockheader und kann zum Verfolgen von Änderungen in der Blockchain verwendet werden.

Beachten Sie, dass im Bild nur ein Blockheader angezeigt wird. Diese Meldungen werden für jeden erzeugten Block angezeigt, sodass sie das Terminal recht schnell füllen können.

Überprüfen Sie, ob der Knoten mit dem Netzwerk synchronisiert ist.

Mit pub / sub ist dies ebenfalls möglich um zu überprüfen, ob ein bestimmter Knoten, den Sie abonniert haben, derzeit mit dem Netzwerk synchronisiert ist. Dafür können wir die Methode web3.eth.subscribe("syncing" [, callback]) nutzen und dieselbe Rückruffunktion implementieren, um nach der Antwort zu suchen. Dieses Abonnement gibt ein Objekt zurück, wenn der Knoten mit dem Netzwerk synchronisiert ist.

Aktuelle Einschränkungen

Die Pub / Sub-Implementierung in Frontier befindet sich noch in der aktiven Entwicklung. Mit dieser ersten Version können dApp-Entwickler (oder Benutzer im Allgemeinen) bestimmte Ereignistypen abonnieren, es gibt jedoch noch einige Einschränkungen. In den vorherigen Beispielen ist Ihnen möglicherweise aufgefallen, dass in einigen Feldern keine ordnungsgemäßen Informationen angezeigt werden. Dies liegt daran, dass bestimmte Eigenschaften von Frontier noch nicht unterstützt werden.

Eine weitere Einschränkung betrifft die Protokolle des Veranstaltung. In Ethereum können Sie Platzhalter verwenden und mehrere Eingabeadressen übergeben, um beispielsweise bestimmte Protokolle zu filtern. Angenommen, wir möchten alle Ereignisse eines Vertrags abonnieren, die zwei spezifische Adressen im Feld „topic\_1“ haben (denken Sie daran, dass topic\_0 der Ereignissignatur vorbehalten ist).Dann könnten wir das folgende Thema als Eingabe übergeben:

topics: [null, [address1, address2]]

Hier wird der Platzhalter null verwendet Für die Signatur des Ereignisses hören wir uns alle Ereignisse an, die durch den von uns abonnierten Vertrag ausgelöst wurden. Mit dieser Konfiguration können wir jedoch auch ein zweites Eingabefeld verwenden, nämlich topic\_1, um einen Filter nach Adresse zu definieren, wie zuvor erwähnt.

Das aktuelle Frontier unterstützt diese Funktionen nicht. Alternativ können Sie mehrere Abonnements für alle Vertragsereignisse und die verschiedenen Adressen erstellen. Dies erhöht jedoch die Anzahl der auszuführenden Vorgänge. Dies wird jedoch voraussichtlich in zukünftigen Versionen des Moonbase TestNet unterstützt.

Kontaktieren Sie uns

Wenn Sie Feedback zu Moonbase Alpha v2, Pub / Sub oder einem anderen haben Moonbeam-bezogenes Thema, zögern Sie nicht, unsere Website zu besuchen oder über unsere offizielle Entwicklung Discord-Server .

Ursprünglich veröffentlicht unter https://www.purestake.com am 13. Oktober 2020.