Skip to content

Instantly share code, notes, and snippets.

@IstoraMandiri
Last active March 9, 2016 15:21
Show Gist options
  • Save IstoraMandiri/49503c09d719d8adca0e to your computer and use it in GitHub Desktop.
Save IstoraMandiri/49503c09d719d8adca0e to your computer and use it in GitHub Desktop.
Modified mining script with transactions + 2 blocks
// Adapted from Iuri Matias' Embark framework
// https://github.com/iurimatias/embark-framework
// Modified by ryepdx to mine at regular intervals.
// modified by CTH to mine extra blocks for dapple
// usage:
// geth --datadir="/tmp/embark" --logfile="/tmp/embark.log" --port 30303 --rpc --rpcport 8545 --rpcaddr localhost --networkid 58554 --rpccorsdomain "*" --genesis="embark-config/genesis/dev_genesis.json" --rpcapi "eth,web3" --maxpeers 4 --password embark-config/password --unlock b7bbac2171acf6b2792ab6d43adcfe8987212dac js /Users/chris/Desktop/miner.js
(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 (typeof(config) === "undefined") {
config = {};
console.log("== config is undefined, proceeding with defaults");
}
In the meantime, just set an empty config object.
*/
config = {}
defaults = {
interval_ms: 6000,
initial_ether: 15000000000000000000,
mine_pending_txns: true,
mine_periodically: false,
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.stopWatching();
miner_obj.stop();
cb();
}
});
};
var pendingTransactions = function() {
if (web3.eth.pendingTransactions === undefined || web3.eth.pendingTransactions === null) {
return txpool.status.pending || txpool.status.queued;
}
else if (typeof web3.eth.pendingTransactions === "function") {
return web3.eth.pendingTransactions().length > 0;
}
else {
return web3.eth.pendingTransactions.length > 0 || web3.eth.getBlock('pending').transactions.length > 0;
}
};
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) {
var waitedBlocks = 0;
web3.eth.filter("pending").watch(function () {
if (miner_obj.hashrate > 0) return;
waitedBlocks = 0;
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()) {
if(waitedBlocks === 0){
console.log("== No transactions left. Stopping miner after a couple of blocks...");
}
if(waitedBlocks > 2){
console.log("== Miner stopped.");
miner_obj.stop();
} else {
waitedBlocks = waitedBlocks + 1;
}
}
});
};
main();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment