diff --git a/block.js b/block.js index fa62068..00c4534 100644 --- a/block.js +++ b/block.js @@ -16,14 +16,15 @@ class Block { } static mineBlock({ lastBlock, data }) { - let hash, timestamp; const lastHash = lastBlock.hash; - const { difficulty } = lastBlock; + let hash, timestamp; + let { difficulty } = lastBlock; let nonce = 0; do { nonce++; timestamp = Date.now(); + difficulty = Block.adjustDifficulty({ originalBlock: lastBlock, timestamp }); hash = cryptoHash(timestamp, lastHash, data, nonce, difficulty); } while (hash.substring(0, difficulty) !== '0'.repeat(difficulty)); @@ -33,6 +34,8 @@ class Block { static adjustDifficulty({ originalBlock, timestamp }) { const { difficulty } = originalBlock; + if (difficulty < 1) return 1; + if ((timestamp - originalBlock.timestamp) > MINE_RATE) return difficulty - 1; return difficulty + 1; diff --git a/block.test.js b/block.test.js index 5e810c1..e654073 100644 --- a/block.test.js +++ b/block.test.js @@ -70,6 +70,12 @@ describe('Block', () => { expect(minedBlock.hash.substring(0, minedBlock.difficulty)) .toEqual('0'.repeat(minedBlock.difficulty)); }); + + it('adjusts the difficulty', () => { + const possibleResults = [lastBlock.difficulty+1, lastBlock.difficulty-1]; + + expect(possibleResults.includes(minedBlock.difficulty)).toBe(true); + }); }); describe('adjustDifficulty()', () => { @@ -86,5 +92,11 @@ describe('Block', () => { timestamp: block.timestamp + MINE_RATE + 100 })).toEqual(block.difficulty-1); }); + + it('has a lower limit of 1', () => { + block.difficulty = -1; + + expect(Block.adjustDifficulty({ originalBlock: block })).toEqual(1); + }); }); }); \ No newline at end of file