From 97b7421ce0f1f2cb65bd6a25a5b1822dec004354 Mon Sep 17 00:00:00 2001 From: Yeastplume Date: Thu, 29 Jun 2017 15:49:11 +0100 Subject: [PATCH] Mining test debug output, fixes to diff. adjustment and start of POW documentation (#69) * Beginning to add a POW description, and some minor changes to mining testing, addition of further debug information to mining output. * Many additions to create first draft of POW documentation * Fixes to difficult adjustments by adding a MINIMUM_DIFFICULTY consensus value. Otherwise never adjusted above 1 due to flooring. --- core/src/consensus.rs | 18 +- core/src/core/block.rs | 5 +- core/src/core/target.rs | 9 +- core/src/genesis.rs | 5 +- core/src/pow/mod.rs | 5 +- doc/pow/images/cuckoo_base.png | Bin 0 -> 30151 bytes doc/pow/images/cuckoo_base_numbered.png | Bin 0 -> 30151 bytes .../images/cuckoo_base_numbered_few_edges.png | Bin 0 -> 13249 bytes .../cuckoo_base_numbered_few_edges_cycle.png | Bin 0 -> 13309 bytes doc/pow/images/cuckoo_base_numbered_many.png | Bin 0 -> 35948 bytes .../cuckoo_base_numbered_many_edges.png | Bin 0 -> 15106 bytes .../images/cuckoo_base_numbered_minimal.png | Bin 0 -> 12305 bytes doc/pow/pow.md | 212 ++++++++++++++++++ grin/src/miner.rs | 60 +++-- grin/src/server.rs | 3 +- grin/src/types.rs | 2 +- grin/tests/framework.rs | 7 +- grin/tests/simulnet.rs | 6 +- 18 files changed, 295 insertions(+), 37 deletions(-) create mode 100644 doc/pow/images/cuckoo_base.png create mode 100644 doc/pow/images/cuckoo_base_numbered.png create mode 100644 doc/pow/images/cuckoo_base_numbered_few_edges.png create mode 100644 doc/pow/images/cuckoo_base_numbered_few_edges_cycle.png create mode 100644 doc/pow/images/cuckoo_base_numbered_many.png create mode 100644 doc/pow/images/cuckoo_base_numbered_many_edges.png create mode 100644 doc/pow/images/cuckoo_base_numbered_minimal.png create mode 100644 doc/pow/pow.md diff --git a/core/src/consensus.rs b/core/src/consensus.rs index d0c35b1a9..a7a474e0e 100644 --- a/core/src/consensus.rs +++ b/core/src/consensus.rs @@ -60,6 +60,10 @@ pub const CUT_THROUGH_HORIZON: u32 = 48 * 3600 / (BLOCK_TIME_SEC as u32); /// peer-to-peer networking layer only for DoS protection. pub const MAX_MSG_LEN: u64 = 20_000_000; +/// The minimum mining difficulty we'll allow + +pub const MINIMUM_DIFFICULTY: u32 = 10; + pub const MEDIAN_TIME_WINDOW: u32 = 11; pub const DIFFICULTY_ADJUST_WINDOW: u32 = 23; @@ -126,7 +130,7 @@ pub fn next_difficulty(cursor: T) -> Result // Check we have enough blocks if window_end.len() < (MEDIAN_TIME_WINDOW as usize) { - return Ok(Difficulty::one()); + return Ok(Difficulty::from_num(MINIMUM_DIFFICULTY)); } // Calculating time medians at the beginning and end of the window. @@ -136,7 +140,7 @@ pub fn next_difficulty(cursor: T) -> Result let end_ts = window_end[window_end.len() / 2]; // Average difficulty and dampened average time - let diff_avg = diff_sum / Difficulty::from_num(DIFFICULTY_ADJUST_WINDOW); + let diff_avg = diff_sum.clone() / Difficulty::from_num(DIFFICULTY_ADJUST_WINDOW); let ts_damp = (3 * BLOCK_TIME_WINDOW + (begin_ts - end_ts)) / 4; // Apply time bounds @@ -148,7 +152,6 @@ pub fn next_difficulty(cursor: T) -> Result ts_damp }; - // Final ratio calculation Ok(diff_avg * Difficulty::from_num(BLOCK_TIME_WINDOW as u32) / Difficulty::from_num(adj_ts as u32)) } @@ -185,13 +188,16 @@ mod test { #[test] fn next_target_adjustment() { // not enough data - assert_eq!(next_difficulty(vec![]).unwrap(), Difficulty::one()); + assert_eq!(next_difficulty(vec![]).unwrap(), Difficulty::from_num(MINIMUM_DIFFICULTY)); + assert_eq!(next_difficulty(vec![Ok((60, Difficulty::one()))]).unwrap(), - Difficulty::one()); + Difficulty::from_num(MINIMUM_DIFFICULTY)); + assert_eq!(next_difficulty(repeat(60, 10, DIFFICULTY_ADJUST_WINDOW)).unwrap(), - Difficulty::one()); + Difficulty::from_num(MINIMUM_DIFFICULTY)); // just enough data, right interval, should stay constant + let just_enough = DIFFICULTY_ADJUST_WINDOW + MEDIAN_TIME_WINDOW; assert_eq!(next_difficulty(repeat(60, 1000, just_enough)).unwrap(), Difficulty::from_num(1000)); diff --git a/core/src/core/block.rs b/core/src/core/block.rs index d954a8a88..4e052ca58 100644 --- a/core/src/core/block.rs +++ b/core/src/core/block.rs @@ -23,6 +23,7 @@ use core::Committed; use core::{Input, Output, Proof, TxKernel, Transaction, COINBASE_KERNEL, COINBASE_OUTPUT}; use core::transaction::merkle_inputs_outputs; use consensus::REWARD; +use consensus::MINIMUM_DIFFICULTY; use core::hash::{Hash, Hashed, ZERO_HASH}; use core::target::Difficulty; use ser::{self, Readable, Reader, Writeable, Writer}; @@ -65,8 +66,8 @@ impl Default for BlockHeader { height: 0, previous: ZERO_HASH, timestamp: time::at_utc(time::Timespec { sec: 0, nsec: 0 }), - difficulty: Difficulty::one(), - total_difficulty: Difficulty::one(), + difficulty: Difficulty::from_num(MINIMUM_DIFFICULTY), + total_difficulty: Difficulty::from_num(MINIMUM_DIFFICULTY), utxo_merkle: ZERO_HASH, tx_merkle: ZERO_HASH, features: DEFAULT_BLOCK, diff --git a/core/src/core/target.rs b/core/src/core/target.rs index bbbb2b6d6..4113c3d2a 100644 --- a/core/src/core/target.rs +++ b/core/src/core/target.rs @@ -17,7 +17,7 @@ //! the related difficulty, defined as the maximum target divided by the hash. use std::fmt; -use std::ops::{Add, Mul, Div}; +use std::ops::{Add, Mul, Div, Sub}; use bigint::BigUint; use serde::{Serialize, Serializer, Deserialize, Deserializer, de}; @@ -86,6 +86,13 @@ impl Add for Difficulty { } } +impl Sub for Difficulty { + type Output = Difficulty; + fn sub(self, other: Difficulty) -> Difficulty { + Difficulty { num: self.num - other.num } + } +} + impl Mul for Difficulty { type Output = Difficulty; fn mul(self, other: Difficulty) -> Difficulty { diff --git a/core/src/genesis.rs b/core/src/genesis.rs index 60fca856a..cd693507f 100644 --- a/core/src/genesis.rs +++ b/core/src/genesis.rs @@ -18,6 +18,7 @@ use time; use core; use consensus::DEFAULT_SIZESHIFT; +use consensus::MINIMUM_DIFFICULTY; use core::hash::Hashed; use core::target::Difficulty; @@ -34,8 +35,8 @@ pub fn genesis() -> core::Block { tm_mday: 4, ..time::empty_tm() }, - difficulty: Difficulty::one(), - total_difficulty: Difficulty::one(), + difficulty: Difficulty::from_num(MINIMUM_DIFFICULTY), + total_difficulty: Difficulty::from_num(MINIMUM_DIFFICULTY), utxo_merkle: [].hash(), tx_merkle: [].hash(), features: core::DEFAULT_BLOCK, diff --git a/core/src/pow/mod.rs b/core/src/pow/mod.rs index 51687fe2e..d79976cce 100644 --- a/core/src/pow/mod.rs +++ b/core/src/pow/mod.rs @@ -28,6 +28,7 @@ pub mod cuckoo; use time; use consensus::EASINESS; +use consensus::MINIMUM_DIFFICULTY; use core::BlockHeader; use core::hash::Hashed; use core::target::Difficulty; @@ -92,9 +93,9 @@ mod test { fn genesis_pow() { let mut b = genesis::genesis(); b.header.nonce = 310; - pow_size(&mut b.header, Difficulty::one(), 12).unwrap(); + pow_size(&mut b.header, Difficulty::from_num(MINIMUM_DIFFICULTY), 12).unwrap(); assert!(b.header.nonce != 310); - assert!(b.header.pow.to_difficulty() >= Difficulty::one()); + assert!(b.header.pow.to_difficulty() >= Difficulty::from_num(MINIMUM_DIFFICULTY)); assert!(verify_size(&b.header, 12)); } } diff --git a/doc/pow/images/cuckoo_base.png b/doc/pow/images/cuckoo_base.png new file mode 100644 index 0000000000000000000000000000000000000000..e74954330c1313aca6fe6c949df981a658920b8f GIT binary patch literal 30151 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

SWP_dF( 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 literal 0 HcmV?d00001 diff --git a/doc/pow/images/cuckoo_base_numbered_few_edges.png b/doc/pow/images/cuckoo_base_numbered_few_edges.png new file mode 100644 index 0000000000000000000000000000000000000000..d1b9c30689e9bcccacb1fbf31663aab33db01f1e GIT binary patch literal 13249 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 Gf&T}2s6bKx literal 0 HcmV?d00001 diff --git a/doc/pow/images/cuckoo_base_numbered_many.png b/doc/pow/images/cuckoo_base_numbered_many.png new file mode 100644 index 0000000000000000000000000000000000000000..8010673d5f005a5d3385c7102f5d08ecc1d771f8 GIT binary patch literal 35948 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 Oqp2(FC{-%hg#AD4S**zb literal 0 HcmV?d00001 diff --git a/doc/pow/pow.md b/doc/pow/pow.md new file mode 100644 index 000000000..9200422a8 --- /dev/null +++ b/doc/pow/pow.md @@ -0,0 +1,212 @@ +Grin's Proof-of-Work +==================== + +[WIP and subject to review, may still contain errors] + +This document is meant to outline, at a level suitable for someone without prior knowledge, +the algorithms and processes currently involved in Grin's Proof-of-Work system. We'll start +with a general overview of cycles in a graph and the Cuckoo Cycle algorithm which forms the +basis of Grin's proof-of-work. We'll then move on to Grin-specific details, which will outline +the other systems that combine with Cuckoo Cycles to form the entirety of mining in Grin. + +Please note that Grin is currently under active development, and any and all of this is subject to +(and will) change before a general release. + +# Graphs and Cuckoo Cycles + +Grin's basic Proof-of-Work algorithm is called Cuckoo Cycle, which is specifically designed +to be resistant to Bitcoin style hardware arms-races. It is primarily a memory bound algorithm, +which, (at least in theory,) means that solution time is limited to the speed of a system's RAM +rather than processor or GPU speed. As such, mining Cuckoo Cycle solutions should be viable on +most commodity hardware, and require far less energy than most other GPU, CPU or ASIC-bound +proof of work algorithms. + +The Cuckoo Cycle POW is the work of John Tromp, and the most up-to-date documentation and implementations +can be found in [his github repository](https://github.com/tromp/cuckoo). The +[white paper](https://github.com/tromp/cuckoo/blob/master/doc/cuckoo.pdf) is the best source of +further technical details. + +## Cycles in a Graph + +Cuckoo Cycles is an algorithm meant to detect cycles in a random bipartite graphs graph of N nodes and M edges. +In plainer terms, a Node is simply an element storing a value, an Edge is a line connecting two nodes, +and a graph is bipartite when it's split into two groupings. The simple +graph below, with values placed at random, denotes just such a graph, with 8 Nodes storing 8 values +divided into 2 groups (one row on top and one row on the bottom,) and zero Edges (i.e. no lines +connecting any nodes.) + +![alt text](images/cuckoo_base_numbered_minimal.png) + +*A graph of 8 Nodes with Zero Edges* + +Let's throw a few Edges into the graph now, randomly: + +![alt text](images/cuckoo_base_numbered_few_edges.png) + +*8 Nodes with 4 Edges* + +We now have a randomly-generated graph with 8 nodes (N) and 4 edges (M), or an NxM graph where +N=8 and M=4. Our basic Proof-of-Work is now concerned with finding 'cycles' of a certain length +within this random graph, or, put simply, a path of connected nodes. So, if we were looking +for a cycle of length 3 (a path connecting 3 nodes), one can be detected in this graph, +i.e. the path running from 5 to 6 to 3: + +![alt text](images/cuckoo_base_numbered_few_edges_cycle.png) + +*Cycle found* + +Adjusting the number of Edges M relative to the number of Nodes N changes the difficulty of the +cycle-finding problem, and the probability that a cycle exists in the current graph. For instance, +if our POW problem were to find a cycle of length 5 in the graph, the current difficulty of 5/8 (M/N) +would mean that all 4 edges would need to be randomly generated in a perfect cycle in order for +there to be a solution. If you increase the number of edges relative to the number of nodes, +you increase the probability that a solution exists: + +![alt text](images/cuckoo_base_numbered_many_edges.png) + +*MxN = 9x8 - Cycle of length 5 found* + +So modifying the ratio M/N changes the number of expected occurrences of a cycle within a randomly +generated graph. + +For a small graph such as the one above, determining whether a cycle of a certain length exists is trivial. +But as the graphs get larger, detecting such cycles becomes more difficult. For instance, does this + graph have a cycle of length 7, i.e. 7 directly connected nodes? + +![alt text](images/cuckoo_base_numbered_many.png) + +*Meat-space Cycle Detection exercise* + +The answer is left as an exercise to the reader, but the overall takeaway is that detecting such cycles becomes +a more difficult exercise as the size of a graph grows. It also becomes easier as M/N becomes larger, i.e. you add more edges relative to the number of nodes in a graph. + +## Cuckoo Cycles + +The Cuckoo Cycles algorithm is a specialised algorithm designed to solve exactly this problem, and it does +so by inserting values into a structure called a 'Cuckoo Hashtable' according to a hash which maps nodes +into possible locations in two separate arrays. This document won't go into detail on the base algorithm, as +it's outlined in plain enough detail in section 5 of the +[white paper](https://github.com/tromp/cuckoo/blob/master/doc/cuckoo.pdf). There are also several +variants on the algorithm that make various speed/memory tradeoffs, again beyond the scope of this document. +However, there are a few details following from the above that we need to keep in mind before going on to more +technical details of Grin's proof-of-work. + +* The 'random' graphs, as detailed above, are not actually random but are generated by putting nodes through a +seeded hashing function, SIPHASH, generating two potential locations (one in each array) for each node in the graph. +The seed will come from a hash of a block header, outlined further below. +* The 'Proof' created by this algorithm is a set of nonces that generate the cycle, which can be trivially validated by other nodes. +* Two main parameters, as explained above, are passed into the Cuckoo Cycle algorithm that affect the probability of a solution, and the +time it takes to search the graph for a solution: + * The M/N ratio outlined above, which controls the number of edges relative to the size of the graph + * The size of the graph itself + +How these parameters interact in practice is looked at in more [detail below](#mining-loop-difficulty-control-and-timing). + +Now, (hopefully) armed with a basic understanding of what the Cuckoo Cycle algorithm is intended to do, as well as the parameters that affect how difficult it is to find a solution, we move on to the other portions of Grin's POW system. + +# Mining in Grin + +The Cuckoo Cycle outlined above forms the basis of Grin's mining process, however Grin uses Cuckoo Cycles in tandem with several other systems to create a Proof-of-Work. + +### Additional Difficulty Control + +In order to provide additional difficulty control in a manner that meets the needs of a network with constantly evolving hashpower +availability, a further Hashcash-based difficulty check is applied to potential solution sets as follows: + +If the SHA256 hash +of a potential set of solution nonces (currently an array of 42 u32s representing the cycle nonces,) +is less than an evolving difficulty target T, then the solution is considered valid. More precisely, +the proof difficulty is calculated as the maximum target hash (2^256) divided by the current hash, +rounded to give an integer. If this integer is larger than the evolving network difficulty, the POW +is considered valid and the block is submit to the chain for validation. + +In other words, a potential proof, as well as containting a valid Cuckoo Cycle, also needs to hash to a value higher than the target difficulty. This difficulty is derived from: + +### Evolving Network Difficulty + +The difficulty target is intended to evolve according to the available network hashpower, with the goal of +keeping the average block solution time within range of a target (currently 60 seconds, though this is subject +to change). + +The difficulty calculation is based on both Digishield and GravityWave family of difficulty computation, +coming to something very close to Zcash. The refence difficulty is an average of the difficulty over a window of +23 blocks (the current consensus value). The corresponding timespan is calculated by using the difference between +the median timestamps at the beginning and the end of the window. If the timespan is higher or lower than a certain +range, (adjusted with a dampening factor to allow for normal variation,) then the difficulty is raised or lowered +to a value aiming for the target block solve time. + +### The Mining Loop + +All of these systems are put together in the mining loop, which attempts to create +valid Proofs-of-Work to create the latest block in the chain. The following is an outline of what the main mining loop does during a single iteration: + +* Get the latest chain state and build a block on top of it, which includes + * A Block Header with new values particular to this mining attempt, which are: + + * The latest target difficulty as selected by the [evolving network difficulty](#evolving-network-difficulty) algorithm + * A set of transactions available for validation selected from the transaction pool + * A coinbase transaction (which we're hoping to give to ourselves) + * The current timestamp + * A randomly generated nonce to add further randomness to the header's hash + * The merkle root of the UTXO set and fees (not yet implemented) + + * Then, a sub-loop runs for a set amount of time, currently configured at 2 seconds, where the following happens: + + * The new block header is hashed to create a hash value + * The cuckoo graph generator is initialised, which accepts as parameters: + * The hash of the potential block header, which is to be used as the key to a SIPHASH function + that will generate pairs of locations for each node in the graph. + * The size of the graph (a consensus value). + * An easiness value, (a consensus value) representing the M/N ratio described above denoting the probability + of a solution appearing in the graph + * The Cuckoo Cycle detection algorithm tries to find a solution (i.e. a cycle of length 42) within the generated + graph. + * If a cycle is found, a SHA256 hash of the proof is created and is compared to the current target + difficulty, as outlined in [Additional Difficulty Control](#additional-difficulty-control) above. + * If the SHA256 Hash difficulty is greater than or equal to the target difficulty, the block is sent to the + transaction pool, propogated amongst peers for validation, and work begins on the next block. + * If the SHA256 Hash difficulty is less than the target difficulty, the proof is thrown out and the timed loop continues. + * If no solution is found, increment the nonce in the header by 1, and update the header's timestamp so the next iteration + hashes a different value for seeding the next loop's graph generation step. + * If the loop times out with no solution found, start over again from the top, collecting new transactions and creating + a new block altogether. + +### Mining Loop Difficulty Control and Timing + +Controlling the overall difficulty of the mining loop requires finding a balance between the three values outlined above: + +* Graph size (currently represented as a bit-shift value n representing a size of 2^n nodes, consensus value + DEFAULT_SIZESHIFT). Smaller graphs can be exhaustively searched more quickly, but will also have fewer + solutions for a given easiness value. A very small graph needs a higher easiness value to have the same + chance to have a solution as a larger graph with a lower easiness value. +* The 'Easiness' consensus value, or the M/N ratio of the graph expressed as a percentage. The higher this value, the more likely + it is a generated graph will contain a solution. In tandem with the above, the larger the graph, the more solutions + it will contain for a given easiness value. +* The evolving network difficulty hash. + +These values need to be carefully tweaked in order for the mining algorithm to find the right balance between the +cuckoo graph size and the evolving difficulty. The POW needs to remain mostly Cuckoo Cycle based, but still allow for +reasonably short block times that allow new transactions to be quickly processed. + +If the graph size is too low and the easiness too high, for instance, then many cuckoo cycle solutions can easily be +found for a given block, and the POW will start to favour those who can hash faster, precisely what Cuckoo Cycles is +trying to avoid. If the graph is too large and easiness too low, however, then it can potentially take any solver a +long time to find a solution in a single graph, well outside a window in which you'd like to stop to collect new +transactions. + +These values are currently set to 2^12 for the graph size and 50% for the easiness value, however they are only +temporary values for testing. The current miner implementation is very unoptimised, and the graph size will need +to be changed as faster and more optimised Cuckoo Cycle algorithms are put in place. + +### Pooling Capability + +[More detail needed here] Note that contrary to some concerns about the ability to effectively pool Cuckoo Cycle mining, pooling Grin's POW +as outlined above is relatively straightforward. Members of the pool are able to prove they're working on a solution +by submitting valid proofs that simply fall under the current network target difficulty. + + + + + + + diff --git a/grin/src/miner.rs b/grin/src/miner.rs index 102f03421..5c9e09985 100644 --- a/grin/src/miner.rs +++ b/grin/src/miner.rs @@ -24,7 +24,9 @@ use time; use adapters::{ChainToPoolAndNetAdapter, PoolToChainAdapter}; use api; use core::consensus; +use core::consensus::*; use core::core; +use core::core::target::*; use core::core::hash::{Hash, Hashed}; use core::pow::cuckoo; use core::ser; @@ -45,6 +47,10 @@ pub struct Miner { /// chain adapter to net chain_adapter: Arc, tx_pool: Arc>>, + + //Just to hold the port we're on, so this miner can be identified + //while watching debug output + debug_output_id: String, } impl Miner { @@ -62,13 +68,23 @@ impl Miner { chain_store: chain_store, chain_adapter: chain_adapter, tx_pool: tx_pool, + debug_output_id: String::from("none"), } } + /// Keeping this optional so setting in a separate funciton + /// instead of in the new function + + pub fn set_debug_output_id(&mut self, debug_output_id: String){ + self.debug_output_id=debug_output_id; + } + + /// Starts the mining loop, building a new block on top of the existing /// chain anytime required and looking for PoW solution. pub fn run_loop(&self) { - info!("Starting miner loop."); + + info!("(Server ID: {}) Starting miner loop.", self.debug_output_id); let mut coinbase = self.get_coinbase(); loop { // get the latest chain state and build a block on top of it @@ -84,21 +100,29 @@ impl Miner { // transactions) and as long as the head hasn't changed let deadline = time::get_time().sec + 2; let mut sol = None; - debug!("Mining at Cuckoo{} for at most 2 secs on block {} at difficulty {}.", + debug!("(Server ID: {}) Mining at Cuckoo{} for at most 2 secs on block {} at difficulty {}.", + self.debug_output_id, self.config.cuckoo_size, latest_hash, b.header.difficulty); let mut iter_count = 0; if self.config.slow_down_in_millis > 0 { - debug!("Artifically slowing down loop by {}ms per iteration.", - self.config.slow_down_in_millis); + debug!("(Server ID: {}) Artificially slowing down loop by {}ms per iteration.", + self.debug_output_id, + self.config.slow_down_in_millis); } while head.hash() == latest_hash && time::get_time().sec < deadline { let pow_hash = b.hash(); let mut miner = cuckoo::Miner::new(&pow_hash[..], consensus::EASINESS, self.config.cuckoo_size); if let Ok(proof) = miner.mine() { - if proof.to_difficulty() >= b.header.difficulty { + let proof_diff=proof.to_difficulty(); + debug!("(Server ID: {}) Header difficulty is: {}, Proof difficulty is: {}", + self.debug_output_id, + b.header.difficulty, + proof_diff); + + if proof_diff >= b.header.difficulty { sol = Some(proof); break; } @@ -109,16 +133,17 @@ impl Miner { } iter_count += 1; - //Artifical slow down + //Artificial slow down if self.config.slow_down_in_millis > 0 { - thread::sleep(std::time::Duration::from_millis(2000)); + thread::sleep(std::time::Duration::from_millis(self.config.slow_down_in_millis)); } } // if we found a solution, push our block out if let Some(proof) = sol { - info!("Found valid proof of work, adding block {}.", b.hash()); - b.header.pow = proof; + info!("(Server ID: {}) Found valid proof of work, adding block {}.", + self.debug_output_id, b.hash()); + b.header.pow = proof; let opts = if self.config.cuckoo_size < consensus::DEFAULT_SIZESHIFT as u32 { chain::EASY_POW } else { @@ -129,7 +154,8 @@ impl Miner { self.chain_adapter.clone(), opts); if let Err(e) = res { - error!("Error validating mined block: {:?}", e); + error!("(Server ID: {}) Error validating mined block: {:?}", + self.debug_output_id, e); } else if let Ok(Some(tip)) = res { let chain_head = self.chain_head.clone(); let mut head = chain_head.lock().unwrap(); @@ -137,8 +163,9 @@ impl Miner { *head = tip; } } else { - debug!("No solution found after {} iterations, continuing...", - iter_count) + debug!("(Server ID: {}) No solution found after {} iterations, continuing...", + self.debug_output_id, + iter_count) } } } @@ -162,9 +189,11 @@ impl Miner { let txs = txs_box.iter().map(|tx| tx.as_ref()).collect(); let (output, kernel) = coinbase; let mut b = core::Block::with_reward(head, txs, output, kernel).unwrap(); - debug!("Built new block with {} inputs and {} outputs", + debug!("(Server ID: {}) Built new block with {} inputs and {} outputs, difficulty: {}", + self.debug_output_id, b.inputs.len(), - b.outputs.len()); + b.outputs.len(), + difficulty); // making sure we're not spending time mining a useless block let secp = secp::Secp256k1::with_caps(secp::ContextFlag::Commit); @@ -189,7 +218,8 @@ impl Miner { let request = WalletReceiveRequest::Coinbase(CbAmount{amount: consensus::REWARD}); let res: CbData = api::client::post(url.as_str(), &request) - .expect("Wallet receiver unreachable, could not claim reward. Is it running?"); + .expect(format!("(Server ID: {}) Wallet receiver unreachable, could not claim reward. Is it running?", + self.debug_output_id.as_str()).as_str()); let out_bin = util::from_hex(res.output).unwrap(); let kern_bin = util::from_hex(res.kernel).unwrap(); let output = ser::deserialize(&mut &out_bin[..]).unwrap(); diff --git a/grin/src/server.rs b/grin/src/server.rs index 16f8d33b2..57467ce62 100644 --- a/grin/src/server.rs +++ b/grin/src/server.rs @@ -153,11 +153,12 @@ impl Server { /// Start mining for blocks on a separate thread. Relies on a toy miner, /// mostly for testing. pub fn start_miner(&self, config: MinerConfig) { - let miner = miner::Miner::new(config, + let mut miner = miner::Miner::new(config, self.chain_head.clone(), self.chain_store.clone(), self.chain_adapter.clone(), self.tx_pool.clone()); + miner.set_debug_output_id(format!("Port {}",self.config.p2p_config.port)); thread::spawn(move || { miner.run_loop(); }); diff --git a/grin/src/types.rs b/grin/src/types.rs index 07e11fb67..98079e196 100644 --- a/grin/src/types.rs +++ b/grin/src/types.rs @@ -137,7 +137,7 @@ impl Default for MinerConfig { wallet_receiver_url: "http://localhost:13416".to_string(), burn_reward: false, slow_down_in_millis: 0, - cuckoo_size: 0, + cuckoo_size: 0 } } } diff --git a/grin/tests/framework.rs b/grin/tests/framework.rs index 00ff95acc..0447bf28c 100644 --- a/grin/tests/framework.rs +++ b/grin/tests/framework.rs @@ -53,7 +53,7 @@ use core::consensus; /// Just removes all results from previous runs pub fn clean_all_output(test_name_dir:&str){ - let target_dir = format!("target/{}", test_name_dir); + let target_dir = format!("target/test_servers/{}", test_name_dir); fs::remove_dir_all(target_dir); } @@ -414,11 +414,10 @@ impl LocalServerContainerPool { //Use self as coinbase wallet - if server_config.coinbase_wallet_address.len()==0 { - server_config.coinbase_wallet_address=String::from(format!("http://{}:{}", + server_config.coinbase_wallet_address=String::from(format!("http://{}:{}", server_config.base_addr, server_config.wallet_port)); - } + self.next_p2p_port+=1; self.next_api_port+=1; diff --git a/grin/tests/simulnet.rs b/grin/tests/simulnet.rs index 303ce0db8..d232cd9af 100644 --- a/grin/tests/simulnet.rs +++ b/grin/tests/simulnet.rs @@ -130,12 +130,12 @@ fn simulate_parallel_mining(){ env_logger::init(); let test_name_dir="simulate_parallel_mining"; - framework::clean_all_output(test_name_dir); + //framework::clean_all_output(test_name_dir); //Create a server pool let mut pool_config = LocalServerContainerPoolConfig::default(); pool_config.base_name = String::from(test_name_dir); - pool_config.run_length_in_seconds = 30; + pool_config.run_length_in_seconds = 60; //have to select different ports because of tests being run in parallel pool_config.base_api_port=30040; @@ -161,7 +161,7 @@ fn simulate_parallel_mining(){ server_config.p2p_server_port)); //And create 4 more, then let them run for a while - for i in 0..4 { + for i in 1..4 { //fudge in some slowdown server_config.miner_slowdown_in_millis = i*2; pool.create_server(&mut server_config);

SWP_dF( zPTG4)+uotFC0B*KVy-b0FGREg(`6j5uW`2Qo|mP!gb5f97)EPxuZ^^lyJWSI>O>mb zglm6*oejW+Vx&@B`vk{fDH?BL@{S6_MVB|0YV$RKM7L7`pz|ya41TnHhCm$kbp8zr z*#{UrcWE=?33qKABLyM?GW8L2rBFAzLpRt~V$%>%aQae~7?@q}(FD@EE!lybiHs$5LcUqngL_JBj zD@z-O!Tv zozNl0+I29laftA^7+eo8Rce;MB_GQhsWA^3k5SUo;hWFbj@C5->%9XcMA3&lxhe-` z3@+tcEQHX;j)tkwOl^M9u43@;-*k}c)vbX9E`ysoit#&|GVO27gZPZ=x07RAzBH`) zNL`*RRh$C6U6D|+k3-8}tPBU;W* zb*X>^NeegkLW2DEmG$~~Fa6D7Hnpag?Unb9GoZ$?qyB}P7JkeVee=-8FbZxa>8`u7 zwHUi`DNtTT=qnnhO09&JI&Nc2+wXjhBlChKK59i>U<_drmY8ow%OAFfV-^yJVZd`i zR^lx;sl>iI*nI%{Z=LyI0lfkQ_YfCIT zF%I;)TQ2uM1XZE&-n9X2bAs#)zT!O83)#~XW<@~3Gkmm_-JbW&y_tQ7e+OT8h?{@h zuMeZ?D*Jr<*K!!yXj#xU;J{f7 z*BDs9h~=N~ggm@POK3N+`~GHz{%0^NL^_-+G-(xoi!q6^^WGgNhQihZVRt>VqD&zF z)YM`&LV|`z@SfgpsK1k+8UPYVxQc1J4$Y2~yMosc@<>3w3xN?zYT~UBD=`>K5>qSq z`spXANHpj@Xk^9FXapd1BH~<$B}Mmg{sUGWsFL%nwwX}8bq~JN-2Y{`9+^!?(EcGt zbR*XS{~S~^p43M?d+gobB{c1*Ll;l$d5ZJ)dG&2tG5q6n6~Xmo+No+-kB%5@e*Em$ zakB-dlE*03t_HWS zx2tp82q=Gu+u89T#|7`V?H^G1{K2RhKwQ{mk4{9803p7%)k zsRMn=eQRz%gS`ZNk%;j&iw&-o)}^~8pfIIrkz-1tR$a;j)eQnnkHDOsM>EgWuceeyB7@Z>jcqehbQQEJ$=(=X+*%@O zC1$X%1z|d)F*Ee=AWns-d#Bt(zI@P%0n_Ns(4f1Uw)kSaR%aGZYB~u2k#(VM|7zMMs z3RLcW=KcK|JNtujCy7=6@Hyh8C0Af-@$utDLmxH4m{{CLcCM=_BJ}gIKk_FMgkH zmT-sL*XVC5pp$DtZs6~X<02)j`3dUu*Z8<1mQ$qYxfm0=)8=HO9iWB%rwzSpUX@B!ys=EK2_1nGdKdin2Rd&uxMZ+cCG1*I&Ugv_7p-USbhDPFtpTL!3QCmhvKi+;eCA@xu3)qya zjp&Ar<)Yr{E?$x-e;B&qWtIW_d}|RrHCH(#0o5s(Ii(S zF7t-ejphyhbAwVk7w657$~RNjyn{7}^BKFBPbQ4wg?Ox@>K`l`8siE7^3E8;bs0&# zT?pck?8#qmC))|YwNh`k5tH%7UndX)rX{1sy{Kd-Ft&T%SI&JA%I$BS{S;ywipfq!O z3yGaiY>D~at4pE1Q*WsbieU3Rts?p<6+To({6JJs@mpQd=5iCbq=@k$0+Aj!Y+pA^ z!AAzn)}KJE$RrNSC(ZMKtFyUrWnb{Es2U}-!+$DMa0e?^6}X6_idfglb-VCN`b|CF z-OVOasV|=6qcu`pg4VtkBVrs9H0Y`Q0wLLTqUjq$=FnM``+&YSb&G6JPZj?pe35 zB`D&WLh}lV61(}V-hE9|LCv6RKjs_!WrY{_44Uo;ix9?Q_aIY;IbW#iS+qK+UjpjgG9pvEZv4S_Y{3$Q#^S)6`BoD&SR~Fb2)t9ihjF z{4@(<49>}f-1>`XmCFt>^bDGz9Jpx7(>04V{{F9N!|Gz3?dNiZI>Ay~y@o1pUgO5_ z_dm#JH0Uf#4^}5I8%>x1^a{!8sw8#jA07HLJgh-<~!^4?$K$VFT4Kr>=fyL!c zv7B|7Xuz@G+}YE;>KY-eQm!9ZAQOx4=2)|`lYqhcZ7;>oENI5<+aT=0+CK8KJ@?-2 z_Sc?;e#j2)mu0p6?YbTR@)rx5_lm^3Qy$`ct_Xl8d3wIJ9oMcjgEFPP6BJ^TLuU-> zpxiq#4kWvu1<|Sk(KfrX8!?T`9qxD6T+^9_l)^=_08n5{{Jr~$)7N+Iu-MBQip%lY z;|<3rsJ(lKHfW-gZr9$1<9ie<4mNx&j7ZVL9C-WvP*Lbs#6x_lQ}=6N9$Hiv3Fe@- zM={L}zk_k%)5QDs=l{fIA{=$wWNCY#D<*y5luYWnb=-tK-0{ zCk>tV$bIFp;#AjLqsE97ZWF~+RKhSYnSvayH`>jEk|3*c$KqGWr7XDNO&ACw11dWg zx)-qLqnx}&Fhmmwc_c`=VN+l{{f_hLpc@EPu|AP#|H(zX%dGmN-+Wg^x~W+u#R~-Z zqm0NFNwoG;*I~bQJYmv^o&^~?VVww$az)-EjMcI~9f)4;ITpWchF3{UrSrkKSdnjQl>9ie#A7T7?yrJ!}QK8hiU!*tro*i|-p#zGG;buvp(pdC4r9|GaDMM5otf zI&rAXTM>=ZoL#IubzTMP*6ZtAA5zS!gK-_$<+Fm=DVgZd4>yZ*8>?aflFB+4<PrL9)Ab5B z+V~7h6B1gX7W)+U(QdIq3c&jLa=sc0(1#hw)0p>BsE*s+)Gt8C#m6C8fqN~5wY-}73 zIC5$ry)R*M^Yl+#S#P8Jc3PD;N(=0yaVfl6G>j4g(*=}4ufTLHV7P7!Q&_G1L?o5; zsayBGA~~~DhU|kW4DlN;hm(I<#fNGcQWTmjn_E>rv{GGta5Ddzzc6cr)G9OWl)NCj z){=gwx89|`>>{enAKH$H5%`6Fp#S3a-(n*frVQMDO-~x=Z6YxyEEj$UQ`d}Xc;f2~ z2MV8)l~T|fw?*hFM;f*Od)l93{a&ES7{G9Y=frhPzJ7G8R-1!y#|*H{Lzl5)^j+dZ z5U1tzK|be93CnzNS%mmT(UKN}86;j#e0AbSdlG5#d)P7WA_-LA!#nJ5a+tb;uWbr$ zov%M{I24x2>z43ACoAfQs7QRxK30rKlDKgoQ4Q|a)489MQS0x@3jF<9UwJ4cg7(Xe znstm_XRdU$z?dGnQ9ibz8T_iA>eQ9_P#gupZ#15rtU}u5=?To28uCGPRyW(EC?ZXk z7uphG`=wyFlGfG5{x2Y*viMwulODCv(t0~RBx3$Kr&Bjg{T#y?Qy0|u0ESs>}%FkIW1 z_eFlT@$8#xo>m$nDGVSqN!O;EY=pS_Yk@!)i+k_mzH7SHi$5qhN(Hb8oL`R)xTd7- zNBSp@3UQ+xoy>d#F)GDi=Si)fl+1*1cDs6G{%{3WLbLtIviEgyty@6hTz%q4(W3RQ zWaMgKJRTIZtnZM5zufrxHv%qBG9MaB-ZGR$61Xo0>PB)~$UyiE)1X|ClNm+& z%T<%=S0lM;m?n9~_9KtU2V!Jfb7kL>^%W^fvQhpUe*(b}t|~#}#Lhm-&RivDxv`oa z4IX*1M!j$v6p7-5B2m(W26JU`vbDv9gAa*RYOH|4kS_tW!%Qo{L(Mn_*vUuD*fG|f z3@Rd40Gsvipt{)u^iEpk_N2}@MKdAn()PBfen~O5Tp~d?**mGm{*aefb9y%TU%}No z86Y+Ns6JN&?6NQI%$#s-H2qtT4a+aW4-rsgeo80^;9$}O4ql0J=A3OBxM{g*%%i%J zf^p^lw=nGhAdPKR#*Tn(_)yzy7Z?CyN|>3S0^A0MR!l9$gXtruYii0F^30VhowPC; zby)~(a2p^6Pv~GJ=Wy~;D+Bq->B!&S%93IjK;o4ofTZbHI4)G9nE(XP;(8B1?SOpY z`los+tqf;*58kkm++u$^Ag``z1Z_VJ^i&jibOxo(fA5#c1}K#sfWb?n)Q?3j)jjyB z#X1S8qqZ4)(=2D`+s*iZO_E4 zN7FI(@0-;qzA&I?g|HFDF1pS=jn;bE?v}S4uP|&Pt_8Lp9MJ7!MNn%oN}%t3qt1{lqe}{q z0wyG6>9skEWddqSmFBHPro48xV_p)9W+Ou#HYz<9rUp@MW1%+cfR8h4aODcI=T1N4 z0B{m%u>3YTf&)ASR!D^W*7=tRiLxcvoVs$Kj3{c*ycG4YBv|1M171lI@*7(+MWF==6hKiQf1`KA5FBEOLDHC@On0G#BMU0+f=eFL$U? z2=Ny1oVzs)b{)PWml8M+|C3l`0KgMK38y%h4bm_^dEWo3saNac7CLw$81NkWHhAj^ zo^eP46>yS=F&2@eKX*tswJwgCnf{^=H^6@7qc*ByGXUvX{T<>p0dHyeuca1H+@*=b z3LtcC2I}7w%jI9OO@K?rC7sg|d)JQNNp_8o|-eL8QcyK4l`o!%Ih(WwQx$N<0% z+!1J*1)C8&LmDJtM=j!^n+mT1QszI2Re*3F+P}JeWK~b;m1f2h+;w+`YV%GG%6_ED zvpAxt9#A&Px4#Y1#smelCv98pugJf0J@k^ zIS$YMa=nrJy%y#`GLzhlU*3)g9S24#K|7Il3sLkWSR#eH+4v(^xrP4*y})m_FCEab zA<1^yQGih{6#?R7zB)n#qJDL1>t{Mw{2Y(!N0bpap`+p`q)ksyezPf2*+zl$CICIW-L}DrYWIz3j^x7B?VGyT^2|DHq*%mc4Bl8 zy*!isaJ&wF5xSjs#Vok~7qkCua>cu_x!pO$AkT>RlqRFE+Jkj$$Et8UDC%k4Sk2CB zpslBmu$kCjYBJ_|K6eZd#<$c~M6u*&T$%GU{?dvU77`F|-c#v%tYj4ki%wMN!|Ic8t$a_u>&j%C_buJ_vA&Zm*l*o`)7y$(_!Ifd7$a8Fa7z zg5Cj~{x|e)2UDhvt7kG=`w;v$q7L&{DGSi7in~CWoC_rtYJD0f@iInFb4*YIY7h0- znvtn6(WbDY7cl&+^b|+*+0_%UlnrPPUAnxVX`c`Qc)!|38UpQQ$4>yegVJq-<1u^Vfw`jr0pe=)4qB=anq~ z0E?bTyUvEXH*H7^c9U#B&=T!EBDwlMC63D9w9pDjj+V2>#?ZTKYfAg^XUB%ue<%|X z#V>Y6jv@}h0~%(9Ruf8B%h(V>84K@5|F8w7fHh{oIf{N1=y)|yHky^sZFx$l8XhMd z%grkpbI%c52s?(b23l+?jIc_}iCErplyQ{YLrS+nmnM9Q;DcPQCtg+rj087ae~Yx3 zs|Mu@a8+sTzZ<>M-`1Pl{DaamHo>eUH%eoP@Jic9Z4@9ds6@UmF(?s`77IFpI;s=jpQA=>G-#x;nnQM{NPW=PyQ}=BzDsGhI7}uoq zv}_kp{Uk^A&ru4sN8NNM?gxcj&q>6ecu8oZ(eSbefwEof?*7kWuo3Q1X`LAJxdZgM z$C8i5PJAvaJJ@gm`^opq_VCOlKO%1wESF_(^nDMtvKa&acoiqcQ-+Dpy$+GysJp>C zkql#v^uNMSnh2>)pR(Qv|L4+FCd&-|@5l8IfuLzzdhkI3l10B#m_9+?M7cQh3{zxk z;o1}<+54kQ=>e?yM_DHZ%_sHET8t*zo_inNd4KP)(TlnKRNaOaEc=-`Gr;~K?^y~j z=kx!RK(m1a%85avT8Bp^h4OuvUOchJgVq@{-os%?L#>;J?PxMdh+aeJXtzWa5U!p4 zLRiA#$@4vnC|FtqXe|3G8qp55;&|w5D(0WZtPW@4_j9Kvi0E;4>2mk;8 literal 0 HcmV?d00001 diff --git a/doc/pow/images/cuckoo_base_numbered.png b/doc/pow/images/cuckoo_base_numbered.png new file mode 100644 index 0000000000000000000000000000000000000000..e74954330c1313aca6fe6c949df981a658920b8f GIT binary patch literal 30151 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