diff --git a/boilerplate/config/genesis/dev_genesis.json b/boilerplate/config/genesis/dev_genesis.json index 9f60d776e..9f2d15625 100644 --- a/boilerplate/config/genesis/dev_genesis.json +++ b/boilerplate/config/genesis/dev_genesis.json @@ -1,10 +1,11 @@ { "nonce": "0x0000000000000042", - "difficulty": "0x40000", + "difficulty": "0x0", "alloc": { + "0x3333333333333333333333333333333333333333": {"balance": "15000000000000000000"} }, "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "coinbase": "0x0000000000000000000000000000000000000000", + "coinbase": "0x3333333333333333333333333333333333333333", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x", diff --git a/js/mine.js b/js/mine.js index c03fe5ec2..643491b73 100644 --- a/js/mine.js +++ b/js/mine.js @@ -1,16 +1,75 @@ -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, + initial_ether: 15000000000000000000, + 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(); + + fundAccount(config, miner_obj, function () { + if (config.mine_periodically) start_periodic_mining(config, miner_obj); + if (config.mine_pending_txns) start_transaction_mining(config, miner_obj); + }); + }; + + var fundAccount = function (config, miner_obj, cb) { + var accountFunded = function () { + return (eth.getBalance(eth.coinbase) >= config.initial_ether); + } + + if (accountFunded()) { + return cb(); + } + + console.log("== Funding account"); + miner_obj.start(); + + var blockWatcher = web3.eth.filter("latest").watch(function () { + if (accountFunded()) { + console.log("== Account funded"); + + blockWatcher.stop(); + miner_obj.stop(); + cb(); + } + }); + }; -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 +80,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(); +})();