MetaMask 和它的“加速交易功能”——沒有回調
我正在使用 MetaMask 從我的網站進行乙太坊交易,如下所述:https ://metamask.github.io/metamask-docs/Main_Concepts/Sending_Transactions
它完美地工作。我在回調中擷取交易雜湊,然後用它來跟踪交易。
但我只是注意到了一些事情;metamask 可以選擇“加速”交易。我不確定它到底是如何工作的,但這基本上會創建一個具有更高gas價格的新交易。但是回調不會再次呼叫。
我不確定它到底在做什麼。當我在資源管理器上搜尋原始交易雜湊時,它不存在。所以他們以某種方式取消了它?
我想我的問題是;我的網站如何知道原始 txhash 已失效並接收新的 txhash?人們如何處理這個問題?
我還考慮過從區塊鏈端跟踪使用者交易,使用 web3 中的訂閱“待處理交易”功能,但是這個呼叫無法被過濾,所以我得到了所有待處理的交易,而不僅僅是我的智能合約的交易。如果我執行自己的節點,這可能沒問題,但我使用的是 Infura。我需要致電 Infura 以獲取有關每筆待處理交易的詳細資訊,如果我這樣做,他們可能會禁止我。
有沒有人有任何見解?
要“加速交易”,只有一個可能的選擇:發送一個具有更高 gas 價格但具有相同隨機數的新交易。這樣,如果節點看到兩筆交易,他們很可能會選擇 gas 價格較高的交易,一旦開採,另一筆交易將變得無效(具有該 nonce 的 tx 已被開採)並被忽略並丟棄。
為什麼你看不到第二筆交易的交易雜湊是我無法理解的。這是一個新交易,應該有一個新的交易雜湊。
關於該主題的一些進一步閱讀:https ://kb.myetherwallet.com/en/transactions/checking-or-replacing-a-tx-after-sending/
回答@Peter Prographo,是的,每個 dApp 都應該支持使用者在 MetaMask 等客戶端中加速 tx 的時間。
現在,當使用者加速 tx 時發生的事情是 MetaMask 將創建一個新的 tx。如果首先開採具有更高 gas 的新 tx,則舊 tx 不返回任何收據對象。前端正在監聽那個特定的收據對象。永遠不會返回,所以前端不知道已經處理了一個新的 tx。
該問題似乎涉及所有 WEB3 API 客戶端,例如 web3.js、ethers.js 等。此問題尚未解決,但有一個 EIP。這裡:https ://eips.ethereum.org/EIPS/eip-2831
到目前為止,我發現的唯一解決方案是使用自 05.2021 起在“某些”情況下支持這些情況的 ethers.js。
這是有關 ethers.js 更新的更新
https://blog.ricmoo.com/highlights-ethers-js-may-2021-2826e858277d
轉到文章並向下滾動到“檢測替換交易”。那裡有範常式式碼。
這裡是 ethers.js github 執行緒的額外連結 https://github.com/ethers-io/ethers.js/issues/1477
我一直在嘗試將這個功能實現到我的前端,但問題是當你故意放慢交易速度然後替換它時,它並不能真正在 BSC 或 POLYGON 上工作。因為這是您有時間創建替換交易的唯一方法。否則礦工幾乎會立即選擇 tx。
如果有人找到了對所有 EVM 鏈進行測試的方法,請分享。