Go-Ethereum

如何讓礦工只有在有待處理交易時才能挖礦?

  • December 2, 2019

到目前為止,在我的系統上執行的 geth 礦工甚至可以探勘空塊。我想要的只是礦工只有在有交易時才應該開採,開採後礦工應該立即睡覺。

如何做到這一點?

您可以將此腳本載入到您的 geth 控制台

僅在有交易時才開採!

var mining_threads = 1

function checkWork() {
   if (eth.getBlock("pending").transactions.length > 0) {
       if (eth.mining) return;
       console.log("== Pending transactions! Mining...");
       miner.start(mining_threads);
   } else {
       miner.stop();
       console.log("== No transactions! Mining stopped.");
   }
}

eth.filter("latest", function(err, block) { checkWork(); });
eth.filter("pending", function(err, block) { checkWork(); });

checkWork();

在此處查看其他有用的片段

挖礦直到獲得 x 次確認

這個問題與私有鏈特別相關,因為私有鏈的交易可能比公共鏈更零星。在某些應用程序中,在最近的交易之後繼續探勘一定數量的區塊可能是有益的,以確保在探勘停止之前達到足夠的確認,並避免最近的交易只收到一個確認(例如,當在私有網路上使用霧時,它希望看到12 次確認):

var mining_threads = 1
var txBlock = 0

function checkWork() {
if (eth.getBlock("pending").transactions.length > 0) {
   txBlock = eth.getBlock("pending").number
   if (eth.mining) return;
   console.log("  Transactions pending. Mining...");
   miner.start(mining_threads)
   while (eth.getBlock("latest").number < txBlock + 12) {
     if (eth.getBlock("pending").transactions.length > 0) txBlock = eth.getBlock("pending").number;
       }
   console.log("  12 confirmations achieved; mining stopped.");
   miner.stop()
}
else {
   miner.stop()
    }
}

eth.filter("latest", function(err, block) { checkWork(); });
eth.filter("pending", function(err, block) { checkWork(); });

checkWork();

這也可以保存為 .js 腳本,並在啟動 geth 時使用 –preload 函式預載入:

geth --preload "/path/to/mineWhenNeeded.js"

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