Web3js

你如何處理帶有合約事件的鏈重組?

  • October 11, 2020

鑑於每當交易包含在新探勘的塊中時都會觸發事件,當包含該交易的探勘塊被孤立時,您如何處理這種情況?

假設我有一個數據庫,每次Deposit發生事件時都會插入數據:

myContract.on("Deposit", depositInfo => myDatabase.insert(depositInfo))

但隨後包含進行存款的交易的區塊在 4 個區塊後被孤立。現在我正在儲存無效數據。然後 10 個區塊後,原來在其中探勘原始交易的鏈現在是最長的鏈。所以現在數據庫又準確了。

每次事件因鏈重組而再次失效/驗證時,如何通知我?

然後我可以做這樣的事情;如果該事件無效,則從我的數據庫中刪除該事件,如果有效則將其插入:

myContract.on("Deposit", (depositInfo, isValid) => {
   if (isValid) {
       myDatabase.insert(depositInfo)
   } else {
       myDatabase.findAndRemove(depositInfo);
   }
});

事實證明,這在 web3js 中是微不足道的,但 ethersjs 不提供任何功能來做到這一點。

在 web3js 中:

myContract.events.MyEvent()
   .on("data", async (error, event) => {
       myDatabase.insert(event);
   })
   .on("changed", async (error, event) => { // Called when event is no longer valid
       myDatabase.findAndRemove(event);
   });

引用自:https://ethereum.stackexchange.com/questions/88183