| 42 | )"; |
| 43 | |
| 44 | void checkCalculatedDifficulty(BlockHeader const& _bi, BlockHeader const& _parent, Network _n, ChainOperationParams const& _p, string const& _testName = "") |
| 45 | { |
| 46 | u256 difficulty = _bi.difficulty(); |
| 47 | u256 frontierDiff = _p.u256Param("homsteadForkBlock"); |
| 48 | |
| 49 | //The ultimate formula (Homestead) |
| 50 | if (_bi.number() > frontierDiff) |
| 51 | { |
| 52 | u256 minimumDifficulty = _p.u256Param("minimumDifficulty"); |
| 53 | bigint block_diff = _parent.difficulty(); |
| 54 | |
| 55 | bigint a = (_parent.difficulty() / 2048); |
| 56 | int b = 1 - int(_bi.timestamp() - _parent.timestamp()) / 10; |
| 57 | bigint c = (_bi.number() / 100000) - 2; |
| 58 | |
| 59 | block_diff += a * max<int>(b, -99); |
| 60 | block_diff += u256(1) << (unsigned)c; |
| 61 | block_diff = max<bigint>(minimumDifficulty, block_diff); |
| 62 | |
| 63 | BOOST_CHECK_MESSAGE(difficulty == block_diff, "Homestead Check Calculated diff = " << difficulty << " expected diff = " << block_diff << _testName); |
| 64 | return; |
| 65 | } |
| 66 | |
| 67 | u256 durationLimit; |
| 68 | u256 minimumDifficulty; |
| 69 | u256 difficultyBoundDivisor; |
| 70 | switch(_n) |
| 71 | { |
| 72 | case Network::MainNetwork: |
| 73 | case Network::FrontierTest: |
| 74 | case Network::HomesteadTest: |
| 75 | case Network::Ropsten: |
| 76 | case Network::TransitionnetTest: |
| 77 | durationLimit = 13; |
| 78 | minimumDifficulty = 131072; |
| 79 | difficultyBoundDivisor = 2048; |
| 80 | break; |
| 81 | default: |
| 82 | cerr << "testing undefined network difficulty"; |
| 83 | durationLimit = _p.u256Param("durationLimit"); |
| 84 | minimumDifficulty = _p.u256Param("minimumDifficulty"); |
| 85 | difficultyBoundDivisor = _p.u256Param("difficultyBoundDivisor"); |
| 86 | break; |
| 87 | } |
| 88 | |
| 89 | //Frontier Era |
| 90 | bigint block_diff = _parent.difficulty(); |
| 91 | |
| 92 | bigint a = (_parent.difficulty() / difficultyBoundDivisor); |
| 93 | bigint b = ((_bi.timestamp() - _parent.timestamp()) < durationLimit) ? 1 : -1; |
| 94 | bigint c = (_bi.number() / 100000) - 2; |
| 95 | |
| 96 | block_diff += a * b; |
| 97 | block_diff += u256(1) << (unsigned)c; |
| 98 | block_diff = max<bigint>(minimumDifficulty, block_diff); |
| 99 | |
| 100 | BOOST_CHECK_MESSAGE(difficulty == block_diff, "Check Calculated diff = " << difficulty << " expected diff = " << block_diff << _testName); |
| 101 | return; |
no test coverage detected