Как сделать шахтер для шахт только тогда, когда есть ожидающие транзакции?

На данный момент geth miner, работающий на моей системе, запускает даже пустые блоки. Все, что я хотел, это шахтер, который должен работать только тогда, когда есть Транзакции на мой, после добычи шахтер должен немедленно заснуть.

Как достичь этого?

18 голосов | спросил Subhod I 18 AMpMon, 18 Apr 2016 09:05:12 +030005Monday 2016, 09:05:12

4 ответа


22

Вы можете загрузить этот скрипт на консоль 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-скрипт и предварительно загрузить с помощью функции -preload при запуске geth:

geth --preload "/path/to/mineWhenNeeded.js"
ответил niksmac 18 AMpMon, 18 Apr 2016 09:08:47 +030008Monday 2016, 09:08:47
1

Вы можете установить eth-mine-when-need . Что запускает клиент web3 и прослушивает события. Когда есть ожидающие подтверждения транзакции или транзакции, которые еще не подтверждены, он начнет добычу, пока не будет подтвержден. Он функционирует так же, как и ответ @niksmac. Но вам не нужно выполнять сценарий каждый раз, когда вы запускаете eth, и он позволяет указать количество потоков для разработки и количество блоков, необходимых для подтверждения транзакции, подтверждается передавая эти значения в качестве аргументов (для деталей вы можете увидеть readme в npm).

ответил Hellow Hi 17 Mayam17 2017, 08:41:22
1

Я использовал ответ @niksmac для разработки до тех пор, пока не будут достигнуты n подтверждений, но цикл while вызвал очень высокий уровень использования ЦП (выше 110%). Я изменил его на интервал, и теперь использование ЦП ниже 5%. Я проверяю каждые 600 мс, но любое число, время блокировки будет работать.

var minimum_confirmations = 3;
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)
        interval = setInterval(function () {
            if (eth.getBlock("latest").number < txBlock + minimum_confirmations) {
                if (eth.getBlock("pending").transactions.length > 0) txBlock = eth.getBlock("pending").number;
            } else {
                console.log(minimum_confirmations + " confirmations achieved; mining stopped.");
                miner.stop()
                clearInterval(interval);
            }
        }, 600)
    }
}

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

checkWork();
ответил facumedica 13 MarpmTue, 13 Mar 2018 16:47:48 +03002018-03-13T16:47:48+03:0004 2018, 16:47:48
0

Если вы используете geth POA, вы можете установить период уплотнения блока на 0 в файле генезиса, это автоматически заставит geth создавать новый блок только при наличии транзакции в сети.

ответил jadd22 7 PM00000060000003431 2018, 18:07:34

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132