def main(): args = parse_arguments() logger.debug( "=====================================================================================" ) logger.info("QRL Path: %s", args.qrl_dir) config.user.qrl_dir = expanduser(args.qrl_dir) config.create_path(config.user.qrl_dir) logger.debug( "=====================================================================================" ) config.create_path(config.user.wallet_dir) mining_address = None if config.user.mining_enabled: mining_address = get_mining_address(args.mining_address) if not mining_address: logger.warning('Invalid Mining Credit Wallet Address') logger.warning('%s', args.mining_address) return False ntp.setDrift() if args.debug: logger.warning("FAULT HANDLER ENABLED") faulthandler.enable() logger.info('Initializing chain..') persistent_state = State() if args.measurement > -1: persistent_state.get_measurement = MagicMock( return_value=args.measurement) chain_manager = ChainManager(state=persistent_state) chain_manager.load(Block.from_json(GenesisBlock().to_json())) qrlnode = QRLNode(db_state=persistent_state, mining_address=mining_address) qrlnode.set_chain_manager(chain_manager) set_logger(args, qrlnode.sync_state) ####### # NOTE: Keep assigned to a variable or might get collected admin_service, grpc_service, mining_service = start_services(qrlnode) qrlnode.start_listening() qrlnode.connect_peers() qrlnode.start_pow(args.mining_thread_count) logger.info('QRL blockchain ledger %s', config.dev.version) logger.info('mining/staking address %s', args.mining_address) # FIXME: This will be removed once we move away from Twisted reactor.run()
def main(): args = parse_arguments() config.create_path(config.user.wallet_dir) mining_credit_wallet = get_mining_credit_wallet(args.mining_credit_wallet) if not mining_credit_wallet: logger.warning('Invalid Mining Credit Wallet Address') logger.warning('%s', args.mining_credit_wallet) return False logger.debug( "=====================================================================================" ) logger.info("Data Path: %s", args.data_dir) config.user.data_dir = args.data_dir config.create_path(config.user.data_dir) ntp.setDrift() logger.info('Initializing chain..') persistent_state = State() chain_manager = ChainManager(state=persistent_state) chain_manager.load(Block.from_json(GenesisBlock().to_json())) qrlnode = QRLNode(db_state=persistent_state, mining_credit_wallet=mining_credit_wallet) qrlnode.set_chain_manager(chain_manager) set_logger(args, qrlnode.sync_state) ####### # NOTE: Keep assigned to a variable or might get collected admin_service, grpc_service, mining_service = start_services(qrlnode) qrlnode.start_listening() qrlnode.connect_peers() qrlnode.start_pow(args.mining_thread_count) logger.info('QRL blockchain ledger %s', config.dev.version) logger.info('mining/staking address %s', args.mining_credit_wallet) # FIXME: This will be removed once we move away from Twisted reactor.run()
def main(): args = parse_arguments() config.create_path(config.user.wallet_dir) slaves = mining_wallet_checks(args) logger.debug("=====================================================================================") logger.info("Data Path: %s", args.data_dir) config.user.data_dir = args.data_dir config.create_path(config.user.data_dir) ntp.setDrift() logger.info('Initializing chain..') persistent_state = State() chain_manager = ChainManager(state=persistent_state) chain_manager.load(Block.from_json(GenesisBlock().to_json())) qrlnode = QRLNode(db_state=persistent_state, slaves=slaves) qrlnode.set_chain(chain_manager) set_logger(args, qrlnode.sync_state) ####### # NOTE: Keep assigned to a variable or might get collected admin_service, grpc_service = start_services(qrlnode) qrlnode.start_listening() qrlnode.connect_peers() qrlnode.start_pow() logger.info('QRL blockchain ledger %s', config.dev.version) logger.info('mining/staking address %s', slaves[0]) # FIXME: This will be removed once we move away from Twisted reactor.run()
def main(): args = parse_arguments() logger.debug("=====================================================================================") logger.info("QRL Path: %s", args.qrl_dir) config.user.qrl_dir = expanduser(args.qrl_dir) config.create_path(config.user.qrl_dir) logger.debug("=====================================================================================") config.create_path(config.user.wallet_dir) mining_address = None ntp.setDrift() logger.info('Initializing chain..') persistent_state = State() if args.mocknet: args.debug = True config.user.mining_enabled = True config.user.mining_thread_count = 1 config.user.mining_pause = 500 config.dev.mining_setpoint_blocktime = 1 config.user.genesis_difficulty = 2 # Mocknet mining address # Q01050058bb3f8cb66fd90d0347478e5bdf3a475e82cfc5fe5dc276500ca21531e6edaf3d2d0f7e # Mocknet mining hexseed # 010500dd70f898c2cb4c11ce7fd85aa04554e41dcc46569871d189a3f48d84e2fbedbe176695e291e9b81e619b3625c624cde6 args.mining_address = 'Q01050058bb3f8cb66fd90d0347478e5bdf3a475e82cfc5fe5dc276500ca21531e6edaf3d2d0f7e' if args.debug: logger.warning("FAULT HANDLER ENABLED") faulthandler.enable() if config.user.mining_enabled: mining_address = get_mining_address(args.mining_address) if not mining_address: logger.warning('Invalid Mining Credit Wallet Address') logger.warning('%s', args.mining_address) return False if args.measurement > -1: persistent_state.get_measurement = MagicMock(return_value=args.measurement) chain_manager = ChainManager(state=persistent_state) chain_manager.load(Block.deserialize(GenesisBlock().serialize())) qrlnode = QRLNode(mining_address=mining_address) qrlnode.set_chain_manager(chain_manager) set_logger(args, qrlnode.sync_state) ####### # NOTE: Keep assigned to a variable or might get collected admin_service, grpc_service, mining_service, debug_service = start_services(qrlnode) qrlnode.start_listening() qrlnode.connect_peers() qrlnode.start_pow(args.mining_thread_count) logger.info('QRL blockchain ledger %s', config.dev.version) if config.user.mining_enabled: logger.info('Mining/staking address %s using %s threads (0 = auto)', 'Q' + bin2hstr(mining_address), args.mining_thread_count) elif args.mining_address or args.mining_thread_count: logger.warning('Mining is not enabled but you sent some "mining related" param via CLI') # FIXME: This will be removed once we move away from Twisted reactor.run()
class TestQRLNodeProperties(TestCase): @patch('qrl.core.misc.ntp.getTime', new=replacement_getTime) def setUp(self): state = Mock() self.m_chain_manager = ChainManager(state=state) self.m_chain_manager._last_block = None self.m_chain_manager._state.get_block_by_number.return_value = None self.m_peer_manager = Mock(name='mock P2PPeerManager') self.qrlnode = QRLNode(mining_address=b'') self.qrlnode.set_chain_manager(self.m_chain_manager) self.qrlnode.peer_manager = self.m_peer_manager def test_state(self): # If qrlnode._p2pfactory is None, then this should be this value self.assertEqual(self.qrlnode.state, ESyncState.unknown.value) # Else, it should be whatever this part of p2pfactory says m_p2pfactory = Mock() m_p2pfactory.sync_state.state.value = "test" self.qrlnode._p2pfactory = m_p2pfactory self.assertEqual(self.qrlnode.state, "test") def test_num_connections(self): # If qrlnode._p2pfactory is None, then this should return 0 self.assertEqual(self.qrlnode.num_connections, 0) # otherwise it should return what p2pfactory's num_connections says m_p2pfactory = Mock(num_connections=5) self.qrlnode._p2pfactory = m_p2pfactory self.assertEqual(self.qrlnode.num_connections, 5) def test_epoch(self): self.assertEqual(self.qrlnode.epoch, 0) self.m_chain_manager._last_block = Mock(block_number=5) self.assertEqual(self.qrlnode.epoch, (5 // config.dev.blocks_per_epoch)) self.m_chain_manager._last_block = Mock(block_number=256) self.assertEqual(self.qrlnode.epoch, (256 // config.dev.blocks_per_epoch)) def test_uptime_network(self): # If there is no block after the genesis block, this property should return 0 self.assertEqual(self.qrlnode.uptime_network, 0) # However, if there is a block after the genesis block, use its timestamp to calculate our uptime. with patch('qrl.core.misc.ntp.getTime') as m_getTime: self.m_chain_manager._state.get_block_by_number.return_value = Mock( timestamp=1000000) m_getTime.return_value = 1500000 self.assertEqual(self.qrlnode.uptime_network, 500000) def test_block_last_reward(self): # If last_block() returned None, of course the last reward was 0. self.assertEqual(self.qrlnode.block_last_reward, 0) # Else it is what the block_reward says it is. self.m_chain_manager._last_block = Mock(block_reward=53) self.assertEqual(self.qrlnode.block_last_reward, 53) def test_block_time_mean(self): # FIXME # For this function to work, last_block() must not return a None. If it does, bad things will happen. self.m_chain_manager._last_block = Mock(name='mock Block') # If this particular function returns None, this property should just return the config value self.m_chain_manager._state.get_block_metadata.return_value = None self.assertEqual(self.qrlnode.block_time_mean, config.dev.mining_setpoint_blocktime) # Else, it should consult state.get_measurement() self.m_chain_manager._state.get_block_metadata.return_value = Mock( name='mock BlockMetadata') self.qrlnode.block_time_mean() self.m_chain_manager._state.get_measurement.assert_called_once() def test_coin_supply(self): with mock._patch_object(ChainManager, 'total_coin_supply') as m_total_coin_supply: m_total_coin_supply.__get__ = Mock(return_value=100) self.assertEqual(100, self.qrlnode.coin_supply) m_total_coin_supply.__get__.assert_called_once() def test_coin_supply_max(self): # This property should be whatever config says it is. self.assertEqual(self.qrlnode.coin_supply_max, config.dev.max_coin_supply) def test_get_peers_stat(self): self.qrlnode.get_peers_stat() self.m_peer_manager.get_peers_stat.assert_called_once() def test_connect_peers(self): self.qrlnode.connect_peers() self.m_peer_manager.connect_peers.assert_called_once()