From d23eec1081fe2a1092df99db0611a39cd38242b0 Mon Sep 17 00:00:00 2001 From: Ryan Casey Date: Fri, 21 Aug 2015 09:49:18 -0700 Subject: [PATCH] Change mining script to mine periodically and use filters instead of polling. --- js/mine.js | 123 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 99 insertions(+), 24 deletions(-) diff --git a/js/mine.js b/js/mine.js index c03fe5ec..27f3460d 100644 --- a/js/mine.js +++ b/js/mine.js @@ -1,16 +1,49 @@ -var miner_var; +// Adapted from Iuri Matias' Embark framework +// https://github.com/iurimatias/embark-framework +// Modified by ryepdx to mine at regular intervals. +(function() { + var main = function () { + /* TODO: Find a way to load mining config from YML. + + if (!loadScript("config.js")) { + console.log("== config.js not found"); + } -if (admin.miner === undefined) { - miner_var = miner; -} -else { - miner_var = admin.miner; -} + if (typeof(config) === "undefined") { + config = {}; + console.log("== config is undefined, proceeding with defaults"); + } -miner_var.setEtherbase(web3.eth.accounts[0]); + In the meantime, just set an empty config object. + */ + config = {} + + defaults = { + interval_ms: 15000, + mine_pending_txns: true, + mine_periodically: true, + mine_normally: false, + threads: 1 + } + + for (key in defaults) { + if (config[key] === undefined) { + config[key] = defaults[key]; + } + } + + var miner_obj = (admin.miner === undefined) ? miner : admin.miner; + + if (config.mine_normally) { + miner_obj.start(config.threads); + return; + } + miner_obj.stop(); + + if (config.mine_periodically) start_periodic_mining(config, miner_obj); + if (config.mine_pending_txns) start_transaction_mining(config, miner_obj); + }; -setInterval(function() { - var minimalAmount = (web3.eth.getBalance(web3.eth.coinbase) >= 15000000000000000000); var pendingTransactions = function() { if (web3.eth.pendingTransactions === undefined || web3.eth.pendingTransactions === null) { return txpool.status.pending || txpool.status.queued; @@ -21,19 +54,61 @@ setInterval(function() { else { return web3.eth.pendingTransactions.length > 0 || web3.eth.getBlock('pending').transactions.length > 0; } - } + }; - if(!web3.eth.mining && (!minimalAmount || pendingTransactions())) { - if (!minimalAmount) { console.log("=== minimal ether amount not reached yet") } - if (pendingTransactions()) { console.log("=== there are pending transactions") } - console.log("=== start mining"); - miner_var.start(); - } - else if (web3.eth.mining && minimalAmount && !pendingTransactions()) { - if (minimalAmount) { console.log("=== minimal ether amount reached") } - if (!pendingTransactions()) { console.log("=== no pending transactions") } - console.log("=== stop mining"); - miner_var.stop(); - } -}, 1000) + var start_periodic_mining = function (config, miner_obj) { + var last_mined_ms = Date.now(); + var timeout_set = false; + + miner_obj.start(config.threads); + web3.eth.filter("latest").watch(function () { + if ((config.mine_pending_txns && pendingTransactions()) || timeout_set) { + return; + } + + timeout_set = true; + + var now = Date.now(); + var ms_since_block = now - last_mined_ms; + last_mined_ms = now; + + var next_block_in_ms; + + if (ms_since_block > config.interval_ms) { + next_block_in_ms = 0; + } else { + next_block_in_ms = (config.interval_ms - ms_since_block); + } + + miner_obj.stop(); + console.log("== Looking for next block in " + next_block_in_ms + "ms"); + + setTimeout(function () { + console.log("== Looking for next block"); + timeout_set = false; + miner_obj.start(config.threads); + }, next_block_in_ms); + }); + }; + + var start_transaction_mining = function (config, miner_obj) { + web3.eth.filter("pending").watch(function () { + if (miner_obj.hashrate > 0) return; + + console.log("== Pending transactions! Looking for next block..."); + miner_obj.start(config.threads); + }); + + if (config.mine_periodically) return; + + web3.eth.filter("latest").watch(function () { + if (!pendingTransactions()) { + console.log("== No transactions left. Stopping miner..."); + miner_obj.stop(); + } + }); + }; + + main(); +})();