Go-Ethereum

挖礦交易但不廣播

  • February 2, 2019

我有四個交易,我想將它們包含在同一個區塊中,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。

如果執行專用網路,您可以編輯這些方法

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