1
1
from itertools import chain
2
2
3
- from hathor .conf import HathorSettings
4
3
from hathor .daa import DifficultyAdjustmentAlgorithm , TestMode
5
4
from hathor .simulator .utils import add_new_blocks
6
5
from hathor .transaction import sum_weights
7
6
from hathor .transaction .storage import TransactionMemoryStorage
8
7
from tests import unittest
9
8
from tests .utils import add_new_transactions
10
9
11
- settings = HathorSettings ()
12
-
13
10
14
11
class BaseBlockchainTestCase (unittest .TestCase ):
15
12
__test__ = False
@@ -31,7 +28,7 @@ def setUp(self):
31
28
self .genesis = self .tx_storage .get_all_genesis ()
32
29
self .genesis_blocks = [tx for tx in self .genesis if tx .is_block ]
33
30
self .genesis_txs = [tx for tx in self .genesis if not tx .is_block ]
34
- self .daa = DifficultyAdjustmentAlgorithm (settings = settings )
31
+ self .daa = DifficultyAdjustmentAlgorithm (settings = self . _settings )
35
32
36
33
def test_single_chain (self ):
37
34
""" All new blocks belong to case (i).
@@ -358,20 +355,20 @@ def test_block_height(self):
358
355
def test_tokens_issued_per_block (self ):
359
356
manager = self .create_peer ('testnet' , tx_storage = self .tx_storage )
360
357
# this test is pretty dumb in that it test every possible height until halving has long stopped
361
- initial_reward = settings .INITIAL_TOKENS_PER_BLOCK
362
- final_reward = settings .MINIMUM_TOKENS_PER_BLOCK
358
+ initial_reward = self . _settings .INITIAL_TOKENS_PER_BLOCK
359
+ final_reward = self . _settings .MINIMUM_TOKENS_PER_BLOCK
363
360
expected_reward = initial_reward
364
361
height = 1
365
362
# check that there are BLOCKS_PER_HALVING with each reward, starting at the first rewardable block (height=1)
366
- for _i_halving in range (0 , settings .MAXIMUM_NUMBER_OF_HALVINGS ):
367
- for _i_block in range (0 , settings .BLOCKS_PER_HALVING ):
363
+ for _i_halving in range (0 , self . _settings .MAXIMUM_NUMBER_OF_HALVINGS ):
364
+ for _i_block in range (0 , self . _settings .BLOCKS_PER_HALVING ):
368
365
reward = manager .get_tokens_issued_per_block (height )
369
366
self .assertEqual (reward , expected_reward , f'reward at height { height } ' )
370
367
height += 1
371
368
expected_reward /= 2
372
369
self .assertEqual (expected_reward , final_reward )
373
370
# check that halving stops, for at least two "halving rounds"
374
- for _i_block in range (0 , 2 * settings .BLOCKS_PER_HALVING ):
371
+ for _i_block in range (0 , 2 * self . _settings .BLOCKS_PER_HALVING ):
375
372
reward = manager .get_tokens_issued_per_block (height )
376
373
self .assertEqual (reward , expected_reward , f'reward at height { height } ' )
377
374
height += 1
@@ -380,7 +377,7 @@ def test_block_rewards(self):
380
377
# even dumber test that only check if manager.get_tokens_issued_per_block was used correctly for a really large
381
378
# number of blocks, probably not worth running all the time
382
379
manager = self .create_peer ('testnet' , tx_storage = self .tx_storage )
383
- block_count = (settings . MAXIMUM_NUMBER_OF_HALVINGS + 1 ) * settings .BLOCKS_PER_HALVING
380
+ block_count = (self . _settings . MAXIMUM_NUMBER_OF_HALVINGS + 1 ) * self . _settings .BLOCKS_PER_HALVING
384
381
blocks = add_new_blocks (manager , block_count , advance_clock = block_count * 30 )
385
382
for block in blocks :
386
383
outputs = block .outputs
@@ -393,8 +390,8 @@ def test_daa_sanity(self):
393
390
# sanity test the DAA
394
391
manager = self .create_peer ('testnet' , tx_storage = self .tx_storage )
395
392
manager .daa .TEST_MODE = TestMode .DISABLED
396
- N = settings .BLOCK_DIFFICULTY_N_BLOCKS
397
- T = settings .AVG_TIME_BETWEEN_BLOCKS
393
+ N = self . _settings .BLOCK_DIFFICULTY_N_BLOCKS
394
+ T = self . _settings .AVG_TIME_BETWEEN_BLOCKS
398
395
manager .avg_time_between_blocks = T
399
396
# stabilize weight on 2 and lower the minimum to 1, so it can vary around 2
400
397
manager .min_block_weight = 2
@@ -419,52 +416,56 @@ def test_daa_sanity(self):
419
416
420
417
def test_daa_weight_decay_amount (self ):
421
418
self .daa .TEST_MODE = TestMode .DISABLED
422
- amount = settings .WEIGHT_DECAY_AMOUNT
419
+ amount = self . _settings .WEIGHT_DECAY_AMOUNT
423
420
424
- for distance in range (0 , settings .WEIGHT_DECAY_ACTIVATE_DISTANCE , 10 ):
421
+ for distance in range (0 , self . _settings .WEIGHT_DECAY_ACTIVATE_DISTANCE , 10 ):
425
422
self .assertEqual (self .daa .get_weight_decay_amount (distance ), 0 )
426
423
427
- distance = settings .WEIGHT_DECAY_ACTIVATE_DISTANCE - 1
424
+ distance = self . _settings .WEIGHT_DECAY_ACTIVATE_DISTANCE - 1
428
425
self .assertAlmostEqual (self .daa .get_weight_decay_amount (distance ), 0 )
429
426
430
- distance = settings .WEIGHT_DECAY_ACTIVATE_DISTANCE
427
+ distance = self . _settings .WEIGHT_DECAY_ACTIVATE_DISTANCE
431
428
for k in range (1 , 11 ):
432
- for _ in range (settings .WEIGHT_DECAY_WINDOW_SIZE ):
429
+ for _ in range (self . _settings .WEIGHT_DECAY_WINDOW_SIZE ):
433
430
self .assertAlmostEqual (self .daa .get_weight_decay_amount (distance ), k * amount )
434
431
distance += 1
435
432
self .assertAlmostEqual (self .daa .get_weight_decay_amount (distance ), 11 * amount )
436
433
437
434
def test_daa_weight_decay_blocks (self ):
438
435
manager = self .create_peer ('testnet' , tx_storage = self .tx_storage )
439
436
manager .daa .TEST_MODE = TestMode .DISABLED
440
- amount = settings .WEIGHT_DECAY_AMOUNT
437
+ amount = self . _settings .WEIGHT_DECAY_AMOUNT
441
438
442
- manager .daa .AVG_TIME_BETWEEN_BLOCKS = settings .AVG_TIME_BETWEEN_BLOCKS
443
- manager .daa .MIN_BLOCK_WEIGHT = 2 + 2 * settings .WEIGHT_DECAY_AMOUNT
444
- add_new_blocks (manager , 2 * settings .BLOCK_DIFFICULTY_N_BLOCKS , advance_clock = settings .AVG_TIME_BETWEEN_BLOCKS )
439
+ manager .daa .AVG_TIME_BETWEEN_BLOCKS = self ._settings .AVG_TIME_BETWEEN_BLOCKS
440
+ manager .daa .MIN_BLOCK_WEIGHT = 2 + 2 * self ._settings .WEIGHT_DECAY_AMOUNT
441
+ add_new_blocks (
442
+ manager ,
443
+ 2 * self ._settings .BLOCK_DIFFICULTY_N_BLOCKS ,
444
+ advance_clock = self ._settings .AVG_TIME_BETWEEN_BLOCKS
445
+ )
445
446
446
447
manager .daa .MIN_BLOCK_WEIGHT = 1
447
448
base_weight = manager .generate_mining_block ().weight
448
449
self .assertGreater (base_weight , manager .daa .MIN_BLOCK_WEIGHT )
449
450
450
- add_new_blocks (manager , 20 , advance_clock = settings .AVG_TIME_BETWEEN_BLOCKS )
451
+ add_new_blocks (manager , 20 , advance_clock = self . _settings .AVG_TIME_BETWEEN_BLOCKS )
451
452
452
- dt = settings .AVG_TIME_BETWEEN_BLOCKS # the latest call to add_new_blocks will advance the clock
453
- while dt < settings .WEIGHT_DECAY_ACTIVATE_DISTANCE :
453
+ dt = self . _settings .AVG_TIME_BETWEEN_BLOCKS # the latest call to add_new_blocks will advance the clock
454
+ while dt < self . _settings .WEIGHT_DECAY_ACTIVATE_DISTANCE :
454
455
weight = manager .generate_mining_block ().weight
455
456
self .assertAlmostEqual (weight , base_weight )
456
457
manager .reactor .advance (1 )
457
458
dt += 1
458
459
459
460
dt = 0
460
- while dt < settings .WEIGHT_DECAY_WINDOW_SIZE :
461
+ while dt < self . _settings .WEIGHT_DECAY_WINDOW_SIZE :
461
462
weight = manager .generate_mining_block ().weight
462
463
self .assertAlmostEqual (weight , base_weight - amount )
463
464
manager .reactor .advance (1 )
464
465
dt += 1
465
466
466
467
dt = 0
467
- while dt < settings .WEIGHT_DECAY_WINDOW_SIZE :
468
+ while dt < self . _settings .WEIGHT_DECAY_WINDOW_SIZE :
468
469
weight = manager .generate_mining_block ().weight
469
470
self .assertAlmostEqual (weight , base_weight - 2 * amount )
470
471
manager .reactor .advance (1 )
0 commit comments