有沒有辦法創建雙花交易並將它們送出到不同的節點?
我正在嘗試創建兩個具有相同隨機數的事務並將這些事務發送到兩個不同的節點。如:
const Web3 = require('web3'); const web3_1 = new Web3(rpcURL1); // node 1 const web3_2 = new Web3(rpcURL2); // node 2 const web3_3 = new Web3(rpcURL3); // node 3 // Let's call tx1 web3_2.eth.sendTransaction( { from: account0, to: account1, value: web3_1.utils.toWei("1", "ether"), nonce: 3 } ); // Let's call tx2 web3_3.eth.sendTransaction( { from: account0, to: account1, value: web3_1.utils.toWei("1", "ether"), nonce: 3 } );
我正在具有 3 個節點的專用網路上對此進行測試。所有節點都相互作為對等節點。
執行上面的程式碼時出現的錯誤:
Error: Returned error: known transaction: [txHash]
根據
web3.js
文件,sendTransaction
方法返回一個回調。由於我不等待解決此回調,因此我假設事務將同時或在非常接近的時間觸發。我的猜測是,由於我使用的是私有網路並且只有三個節點,因此節點之間的事務傳播非常快**(我的假設可能是錯誤的)**。這就是為什麼即使交易在非常接近的時間送出,
tx1
也會傳播到到達node3
之前。我相信這將是了解 tx1 的唯一途徑。tx2``node3``node3
如果你認為是這樣的話,乙太坊有沒有辦法控制交易傳播過程或減慢它?
如果您認為情況並非如此,您對我在不同節點上創建這些雙花交易有何建議?
“已知交易”是指兩筆交易完全相同。您可以嘗試更改值,使它們有所不同。
如果您的所有節點都在同一個區域網路上執行並且所有節點都在它們之間連接,那麼它們很可能會快速傳播事務。一種快速而骯髒的測試方法是保持節點隔離,例如通過更改 p2p 埠使它們無法在它們之間進行通信。
當一個節點接收到兩個具有相同 nonce 和相似 gas 價格的待處理交易時,它將保留第一個並丟棄另一個。
由乙太坊共識規則強制執行的具有相同隨機數的兩個交易不能被探勘並形成同一塊鏈的一部分。
兩個節點可以在兩個獨立的區塊中探勘不同的交易,從而創建一個區塊鏈分叉。最終,所有節點都將遵循其中一個分叉,即在 PoW 情況下工作量最大的一個。
在您的情況下,如果您多次執行執行,您將獲得不同的結果,具體取決於哪個節點更快地接收和處理您的事務。
話雖如此,節點應該準備好達成共識,這意味著丟棄那些會產生雙花的交易,這絕對是積極的。
如果你認為是這樣的話,乙太坊有沒有辦法控制交易傳播過程或減慢它?
不,您無法控制節點在做什麼,除非它們是您的並且您修改了它們的原始碼,但這不是一種實用的方法,因為它在生產環境中不可行。
如果您認為情況並非如此,您對我在不同節點上創建這些雙花交易有何建議?
正如我所提到的,你不應該能夠創建雙花交易。如果你真的想要,你必須修改你的節點的原始碼,以便在你的測試網中交易被延遲、跳過,或者只是節點就雙花交易達成共識。
實際上,類似於您正在尋找的事情最近發生在乙太坊經典 51% 攻擊中。本質上,您需要修改後的節點和 >51% 的網路容量。