Go-Ethereum
挖礦交易但不廣播
我有四個交易,我想將它們包含在同一個區塊中,T1、T2、T3、T4。
有一個競爭條件,所以我不想廣播這些交易,除非我可以確定它們會一起並按順序解決。這需要執行一個礦工來做出這種保證。
執行 geth,我如何按順序將四個交易添加到我的池中,以便在我探勘一個塊時將它們包括在內,但否則它們不會從我的機器廣播?
在我看來,這聽起來行不通。
在現實世界中,你不能使用挖礦來有利地訂購交易。但是,您確實有一些選擇。
您可以通過包裝在另一個函式中以原子方式對操作進行分組。此外,您可以放心,從同一個 EOA 發出的交易將以 nonce 順序進行探勘。這種保證並不意味著其他人不能在狀態未確定時插入操作,因此避免競爭條件仍然很重要。
您可以使用 Mutex 等模式來對抗競爭條件,但我還沒有遇到過不使用此類措施就無法解決的情況。
希望能幫助到你。
作為一種解決方法,您可以預載入一個 js 文件,該文件在某些事務中查找模式,並且僅在所有四個都存在時才開始探勘。例如,如果您知道所有交易都來自同一個地址:
var mining_threads = 4; var txBlock = 0; var target_address = "0x83c88dbd0059edb45a3e57b9cc50e9ee0fda7190"; var batch = []; var target_batch = 4; function waitBatch() { if ( eth.getBlock( "pending" ).transactions.length > 0 ) { txBlock = eth.getBlock( "pending" ).number if ( eth.mining ) return; console.log( " Transactions pending. Search for target" ); for ( var i = 0; i < eth.getBlock( "pending" ).transactions.length; i++ ) { if ( eth.getBlock( "pending" ).transactions[ i ].from == target_address ) { batch.push( eth.getBlock( "pending" ).transactions[ i ] ); } } if ( batch.length == target_batch ) { batch = []; miner.start( mining_threads ) } while ( eth.getBlock( "latest" ).number < txBlock + 1 ) { if ( eth.getBlock( "pending" ).transactions.length > 0 ) txBlock = eth.getBlock( "pending" ).number; } console.log( "1 confirmations achieved; mining stopped." ); miner.stop() } else { miner.stop() } } waitBatch();
這沒有經過測試,肯定有問題,但這就是想法。
或者,如果執行私有區塊鏈,你可以在你的 geth 中編輯你的密封器,但這幾乎總是一個壞主意。
編輯
我注意到你想讓它們保持有序。你不能。對於普通的 Geth 實現,worker.go 中的 commitNewWork() 函式按以下方式排序:
//approach 2 transactions := self.eth.TxPool().GetTransactions() <--- fetch from pool types.SortByPriceAndNonce(transactions) <---------- order
即按gas價格和nonce值排序
程式碼中還有另外兩種方法都被註釋掉了,但可能會為以前的想法提供線索(或為想要使用自己實現的礦工提供範例)。他們是:
方法 1:僅按 nonce 排序方法 3:按所有者排序(不同地處理單所有者和多所有者交易),然後按價格和 nonce。
如果執行專用網路,您可以編輯這些方法