web3 如何處理新的最長鏈?
我有一個使用 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])
在選項中設置fromBlock
和toBlock
參數的位置。為此,您可以將toBlock
結果設置為web3.eth.getBlockNumber()
減去您認為鏈需要“解決”的塊數。`