Attempt to continue if duplicate coinbase commit is found (#266)

This commit is contained in:
Yeastplume 2017-11-14 23:58:39 +00:00 committed by Ignotus Peverell
parent 8269bdd873
commit 89217a1fa5

View file

@ -442,11 +442,21 @@ impl Miner {
loop {
debug!(LOGGER, "in miner loop...");
trace!(LOGGER, "key_id: {:?}", key_id);
// get the latest chain state and build a block on top of it
let head = self.chain.head_header().unwrap();
let mut latest_hash = self.chain.head().unwrap().last_block_h;
let (mut b, block_fees) = self.build_block(&head, key_id);
let mut result = self.build_block(&head, key_id.clone());
while let Err(e) = result {
result = self.build_block(&head, key_id.clone());
if let self::Error::Chain(chain::Error::DuplicateCommitment(_)) = e {
warn!(LOGGER, "Duplicate commit for potential coinbase detected. Trying next derivation.");
} else {
break;
}
}
let (mut b, block_fees) = result.unwrap();
let mut sol = None;
let mut use_async = false;
@ -530,7 +540,7 @@ impl Miner {
&self,
head: &core::BlockHeader,
key_id: Option<Identifier>,
) -> (core::Block, BlockFees) {
) -> Result<(core::Block, BlockFees), Error> {
// prepare the block header timestamp
let mut now_sec = time::get_time().sec;
let head_sec = head.timestamp.to_timespec().sec;
@ -579,10 +589,18 @@ impl Miner {
b.header.nonce = rng.gen();
b.header.difficulty = difficulty;
b.header.timestamp = time::at_utc(time::Timespec::new(now_sec, 0));
self.chain
.set_sumtree_roots(&mut b)
.expect("Error setting sum tree roots");
(b, block_fees)
trace!(LOGGER, "Block: {:?}", b);
let result=self.chain.set_sumtree_roots(&mut b);
match result {
Ok(_) => Ok((b, block_fees)),
//If it's a duplicate commitment, it's likely trying to use
//a key that's already been derived but not in the wallet
//for some reason, allow caller to retry
Err(chain::Error::DuplicateCommitment(e)) =>
Err(Error::Chain(chain::Error::DuplicateCommitment(e))),
//Some other issue is worth a panic
Err(e) => panic!(e),
}
}
///