Web3js

web3 如何處理新的最長鏈?

  • January 27, 2020

我有一個使用 web3 訂閱事件的 Dapp。我想知道如何檢測到最長的鏈發生了變化,或者更確切地說如何確保我收到的事件是規範的。getPastEvents()對於硬分叉以及兩者和訂閱新事件,can 也應該正常工作。

在我的研究中,我發現了這個問題:當我們有一個鏈的分叉時,是否有可能在乙太坊上獲得日誌事件的副本?. 答案暗示了一個status領域。收據中有一個status,但這只是一個布爾值。此外,status結果中沒有getPastEvents()- 當getPastEvents()接收事件時發生分叉時會發生什麼?

我不確定 web3 如何確保事件在目前實現中是規範的。在對 Geth 的測試中,該事件在大約 10 秒後在 Dapp 中變得可見,這表明它只考慮了最新的塊,而不是等待通常的 6 或 12 個塊使鏈成為規範。

有多種方法可以使用 web3 來解決這個問題——一種使用訂閱,另一種使用getPastEvents()合約。

訂閱

第一個 - 如果您想設置訂閱以持續接收事件,您可以設置包含on("changed").

on(“changed”) 返回 Object:在從區塊鏈中刪除的每個日誌上觸發。日誌將具有附加屬性“removed: true”。

如果刪除了日誌,則意味著它是已取消的塊的一部分。

收到事件後,您可以暫時儲存它,也可以設置訂閱塊頭。一旦發布了適當數量的塊,並且如果您沒有收到“更改”事件 - 您可以接受此事件並終止塊頭偵聽器。

訂閱文件

獲取過去的事件

如果您將在多個實例/時間點呼叫該函式,您還可以使用myContract.getPastEvents(event[, options][, callback])在選項中設置fromBlocktoBlock參數的位置。為此,您可以將toBlock結果設置為 web3.eth.getBlockNumber()減去您認為鏈需要“解決”的塊數。`

getPastEvents 文件

getBlockNumber 文件

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