Events (Ereignisse)
Ereignisse sind unveränderliche, überprüfbare Objekte, die von den Smart Contracts emittiert, von der Alephium-Full-Node gespeichert und bereitgestellt werden. Sie spielen eine entscheidende Rolle bei der effizienten und transparenten Kommunikation zwischen Smart Contracts und Off-Chain-Anwendungen.
Es gibt viele Anwendungsfälle für Ereignisse: Eine dezentrale Börse kann Ereignisse verwenden, um alle Swap-Vorgänge in einem Token-Paar zu verfolgen. Ein NFT-Marktplatz kann Ereignisse verwenden, um alle NFT-Angebote zu speichern. Ein Oracle kann Ereignisse verwenden, um Anfragen nach bestimmten Off-Chain-Informationen von Smart Contracts zu signalisieren. Eine Bridge kann Ereignisse verwenden, um bestimmte Aktionen darzustellen, die die Zustimmung aller Bridge-Betreiber erfordern, usw.
Ereignisobjekt
Ein Ereignisobjekt in Alephium besteht aus den folgenden Attributen:
txId : Transaktions ID
blockHash : Block Hash
contractAddress : Adresse des Vertrags, in dem das Ereignis ausgelöst wird / Spezielle Adresse für Systemereignisse
eventIndex : Index des Ereignisses, das vom Vertrag ausgelöst wird / Spezieller Index für Systemereignisse
fields : Felder, die im Ereignis enthalten sind
Es gibt zwei Arten von Ereignissen in Alephium: Vertragsereignisse and
Systemereignisse. Die folgenden Abschnitte behandeln sie jeweils mit weiteren
Details zu den Attributen contractAddress
, eventIndex
und fields
attributes.
Vertragsereignisse
Wie der Name schon sagt, handelt es sich bei Vertragsereignissen um benutzerdefinierte Ereignisse, die von den Verträgen emittiert werden:
Event/AdminUpdated
In diesem Beispiel wird jedes Mal, wenn admin
aktualisiert wird, ein AdminUpdated
-Ereignis ausgelöst.
Diese Informationen können von Off-Chain-Anwendungen abgehört werden, um ihre Benutzeroberflächen zu
aktualisieren oder für Überprüfungszwecke.
Sie können alle von einem Vertrag ausgesendeten Ereignisse abonnieren oder ein bestimmtes Ereignis, das von einem Vertrag ausgesendet wird, mit dems Web3 SDK von Alephium abonnieren:
Event/AdminUpdatedEvent
// `adminInstance` ist eine Vertragsinstanz des Admin-Vertrags.
adminInstance.subscribeAdminUpdatedEvent({
pollingInterval: 500,
messageCallback: (event: AdminTypes.AdminUpdatedEvent): Promise<void> => {
console.log('got admin updated event:', event)
return Promise.resolve()
},
errorCallback: (error: any, subscription): Promise<void> => {
console.log(error)
subscription.unsubscribe()
return Promise.resolve()
}
})
Im Ereignisobjekt von AdminisUpdated
repräsentiert
contractAddress
die Vertragsadresse von adminInstance
,
eventIndex
ist 0
da AdminUpdated
idas erste definierte Ereignis im Admin
contract (0-based index). fields
enthält zwei Adressen: eine für den vorherigen
Administrator und eine für den neuen Administrator.
Systemereignisse
Im Vergleich zu den Vertragsereignissen, die explizit von den Verträgen emittiert werden, werden Systemereignisse automatisch von der Alephium-Full-Node emittiert. Derzeit gibt es zwei Systemereignisse:
ContractCreatedEvent
ContractCreatedEvent
wird ausgelöst, wenn ein neuer Vertrag erstellt wird:
TxScript Deploy(fooByteCode: ByteVec) {
createContract!{callerAddress!() -> ALPH: 1 ALPH}(fooByteCode, #00, #00)
}
Im obigen Beispiel erstellt das Deploy
-Transaktionsskript einen neuen
Foo
-Vertrag aus seinem Vertrags-Bytecode. Der Foo
-Vertrag hat keine Vertragsfelder, weshalb #00
als Argumente an die
createContract-Funktion übergeben werden.
EinContractCreatedEvent
Systemereignis wird ausgelöst, nachdem der Foo
-Vertrag erstellt wurde.
Alephium's Web3 SDK bietet eine Hilfsfunktion zum Abonnieren des Ereignisses ContractCreatedEvent
:
ContractCreatedEvent
subscribeContractCreatedEvent({
pollingInterval: 500,
messageCallback: (event: ContractCreatedEvent): Promise<void> => {
console.log('got contract created event:', event)
return Promise.resolve()
},
errorCallback: (error: any, subscription): Promise<void> => {
console.log(error)
subscription.unsubscribe()
return Promise.resolve()
}
})
Im Ereignisobjekt von ContractCreatedEvent
, ist
eventIndex
auf -1
gesetzt, ein Wert, der speziell für das Ereignis
ContractCreatedEvent
reserviert ist. contractAddress
ist auf einen
speziellen Wert gesetzt, der basierend auf dem eventIndex
und der
Vertragsgruppe berechnet wird. fields
enthält die Adresse des neu erstellten
Vertrags sowie dessen übergeordnete Vertrags-ID, sofern vorhanden.
ContractDestroyedEvent
ContractDestroyedEvent
wird ausgelöst, wenn ein Vertrag zerstört wird:
Contract Foo() {
@using(assetsInContract = true)
pub fn destroy() -> () {
destroySelf!(callerAddress!())
}
}
Im obigen Beispiel, nachdem die destroy
-Funktion aufgerufen wurde, wird der
Foo
-Vertrag zerstört und ein ContractDestroyedEvent
-Systemereignis wird vom
Alephium-Fullknoten ausgelöst.
Alephium's Web3 SDK bietet eine Hilfsfunktion zum Abonnieren
des Ereignisses ContractDestroyedEvent
:
ContractDestroyedEvent
subscribeContractDestroyedEvent({
pollingInterval: 500,
messageCallback: (event: ContractDestroyedEvent): Promise<void> => {
console.log('got contract destroyed event:', event)
return Promise.resolve()
},
errorCallback: (error: any, subscription): Promise<void> => {
console.log(error)
subscription.unsubscribe()
return Promise.resolve()
}
})
Im Ereignisobjekt von ContractDestroyedEvent
ist,
eventIndex
ist -2
, festgelegt, ein Wert, der speziell für das Ereignis
ContractDestroyedEvent
reserviert ist. contractAddress
ist auf einen speziellen
Wert festgelegt, der basierend auf dem eventIndex
und der Vertragsgruppe berechnet wird.
fields
enthält die Adresse des zerstörten Vertrags.
Konfiguration
Alephiums Full Node ermöglicht eine flexible Konfiguration, wie Ereignisse gespeichert und indiziert werden sollen. Standardmäßig werden Ereignisse nicht gespeichert, um den Full Node schlank zu halten.
Sie können das Speichern von Ereignissen mithilfe des folgenden Flags aktivieren:
Dies ermöglicht es uns, Vertragsereignisse und Systemereignisse basierend auf der Vertragsadresse abzufragen.
Um die Abfrage von Ereignissen basierend auf Transaktions-ID und Block-Hash zu ermöglichen, müssen Sie die folgenden Flags aktivieren:
alephium.node.event-log.index-by-tx-id = true
alephium.node.event-log.index-by-block-hash = true
Standardmäßig werden Ereignisse, die von allen Verträgen ausgegeben werden, gespeichert. Wenn Sie jedoch wissen, für welche Verträge Sie Ereignisse erhalten möchten, können Sie die folgende Konfiguration verwenden:
Auf diese Weise sparen Sie Speicherplatz, da Ihr Full Node nur die Ereignisse speichert, die von den hier angegebenen Verträgen ausgegeben wurden.
Weiterführende Literatur
Die Ereignisabonnementfunktionen im Web3 SDK abasieren auf den APIs des Alephium-Full-Nodes. Weitere Details zu den APIs finden Sie in der OpenAPI Dokumentation.
Neben ContractEvent
und SystemEvent
, gibt es tatsächlich ein weiteres (spezielles) Systemereignis namens DebugEvent
. Bitte beachten Sie
Debugging für weitere Informationen.