def do_poet0_genesis(args): # Get ledger config: # ...set the default value of config because argparse 'default' in # ...combination with action='append' does the wrong thing. if args.config is None: args.config = ['txnvalidator.js'] # ...convert any comma-delimited argument strings to list elements for arglist in [args.config]: if arglist is not None: for arg in arglist: if ',' in arg: loc = arglist.index(arg) arglist.pop(loc) for element in reversed(arg.split(',')): arglist.insert(loc, element) options_config = ArgparseOptionsConfig([('conf_dir', 'ConfigDirectory'), ('data_dir', 'DataDirectory'), ('type', 'LedgerType'), ('log_config', 'LogConfigFile'), ('keyfile', 'KeyFile'), ('node', 'NodeName'), ('verbose', 'Verbose'), ('family', 'TransactionFamilies')], args) cfg = get_validator_configuration(args.config, options_config) # Obtain Journal object: # ...set WaitTimer globals target_wait_time = cfg.get("TargetWaitTime") initial_wait_time = cfg.get("InitialWaitTime") certificate_sample_length = cfg.get('CertificateSampleLength') fixed_duration_blocks = cfg.get("FixedDurationBlocks") from journal.consensus.poet0.wait_timer import set_wait_timer_globals set_wait_timer_globals( target_wait_time, initial_wait_time, certificate_sample_length, fixed_duration_blocks, ) # ...build Gossip dependency (nd, _) = parse_networking_info(cfg) minimum_retries = cfg.get("MinimumRetries") retry_interval = cfg.get("RetryInterval") gossiper = Gossip(nd, minimum_retries, retry_interval) # ...build Journal min_txn_per_block = cfg.get("MinimumTransactionsPerBlock") max_txn_per_block = cfg.get("MaxTransactionsPerBlock") max_txn_age = cfg.get("MaxTxnAge") genesis_ledger = cfg.get("GenesisLedger") data_directory = cfg.get("DataDirectory") store_type = cfg.get("StoreType") stat_domains = {} from journal.consensus.poet0.poet_consensus import PoetConsensus consensus_obj = PoetConsensus(cfg) journal = Journal( gossiper.LocalNode, gossiper, gossiper.dispatcher, consensus_obj, stat_domains, minimum_transactions_per_block=min_txn_per_block, max_transactions_per_block=max_txn_per_block, max_txn_age=max_txn_age, genesis_ledger=genesis_ledger, data_directory=data_directory, store_type=store_type, ) # ...add 'built in' txn families default_transaction_families = [endpoint_registry] for txn_family in default_transaction_families: txn_family.register_transaction_types(journal) # ...add auxiliary transaction families for txn_family_module_name in cfg.get("TransactionFamilies", []): txn_family = importlib.import_module(txn_family_module_name) txn_family.register_transaction_types(journal) # Make genesis block: # ...make sure there is no current chain here, or fail # ...create block g_block g_block = journal.build_block(genesis=True) journal.claim_block(g_block) # ...simulate receiving the genesis block msg from reactor to force commit g_block_msg = gossiper.IncomingMessageQueue.pop() journal.dispatcher.dispatch(g_block_msg) journal.initialization_complete() head = journal.most_recent_committed_block_id chain_len = len(journal.committed_block_ids()) # Run shutdown: # ...persist new state journal.shutdown() # ...release gossip obj's UDP port gossiper.Listener.loseConnection() gossiper.Listener.connectionLost(reason=None) # Log genesis data, then write it out to ease dissemination genesis_data = { 'GenesisId': head, 'ChainLength': chain_len, } gblock_fname = genesis_info_file_name(cfg['DataDirectory']) LOGGER.info('genesis data: %s', genesis_data) LOGGER.info('writing genesis data to %s', gblock_fname) with open(gblock_fname, 'w') as f: f.write(json.dumps(genesis_data))
def do_poet1_genesis(args): # Get journal config: cfg = mirror_validator_parsing(args) # Check for existing block store node_name = cfg.get("NodeName") data_directory = cfg.get("DataDirectory") store_type = cfg.get("StoreType") check_for_chain(data_directory, node_name, store_type) # Obtain Journal object: # ...set WaitTimer globals target_wait_time = cfg.get("TargetWaitTime") initial_wait_time = cfg.get("InitialWaitTime") certificate_sample_length = cfg.get('CertificateSampleLength') fixed_duration_blocks = cfg.get("FixedDurationBlocks") set_wait_timer_globals( target_wait_time, initial_wait_time, certificate_sample_length, fixed_duration_blocks, ) # ...build Gossip dependency (nd, _) = parse_networking_info(cfg) minimum_retries = cfg.get("MinimumRetries") retry_interval = cfg.get("RetryInterval") gossiper = Gossip(nd, minimum_retries, retry_interval) # ...build Journal min_txn_per_block = cfg.get("MinimumTransactionsPerBlock") max_txn_per_block = cfg.get("MaxTransactionsPerBlock") max_txn_age = cfg.get("MaxTxnAge") stat_domains = {} consensus_obj = PoetConsensus(cfg) journal = Journal( gossiper.LocalNode, gossiper, gossiper.dispatcher, consensus_obj, stat_domains, minimum_transactions_per_block=min_txn_per_block, max_transactions_per_block=max_txn_per_block, max_txn_age=max_txn_age, data_directory=data_directory, store_type=store_type, ) # ...add 'built in' txn families default_transaction_families = [ endpoint_registry, validator_registry, ] for txn_family in default_transaction_families: txn_family.register_transaction_types(journal) # ...add auxiliary transaction families for txn_family_module_name in cfg.get("TransactionFamilies", []): txn_family = importlib.import_module(txn_family_module_name) txn_family.register_transaction_types(journal) # Make genesis block: # ...make sure there is no current chain here, or fail # ...pop VR seed (we'll presently defer resolving VR seed issues) vr_seed = gossiper.IncomingMessageQueue.pop() journal.initial_transactions.append(vr_seed.Transaction) # ...create block g_block (including VR seed txn just popped) journal.on_genesis_block.fire(journal) journal.initializing = False for txn in journal.initial_transactions: journal.add_pending_transaction(txn, build_block=False) g_block = journal.build_block(genesis=True) # seed later... journal.claim_block(g_block) # ...simulate receiving the genesis block msg from reactor to force commit g_block_msg = gossiper.IncomingMessageQueue.pop() poet_public_key = g_block.poet_public_key journal.dispatcher.dispatch(g_block_msg) journal.initialization_complete() head = journal.most_recent_committed_block_id chain_len = len(journal.committed_block_ids()) # Run shutdown: # ...persist new state journal.shutdown() # ...release gossip obj's UDP port gossiper.Listener.loseConnection() gossiper.Listener.connectionLost(reason=None) # Log genesis data, then write it out to ease dissemination genesis_data = { 'GenesisId': head, 'ChainLength': chain_len, 'PoetPublicKey': poet_public_key, } gblock_fname = genesis_info_file_name(cfg['DataDirectory']) LOGGER.info('genesis data: %s', genesis_data) LOGGER.info('writing genesis data to %s', gblock_fname) with open(gblock_fname, 'w') as f: f.write(json.dumps(genesis_data, indent=4))
def do_dev_mode_genesis(args): # Get journal config: cfg = mirror_validator_parsing(args) # Check for existing block store node_name = cfg.get("NodeName") data_directory = cfg.get("DataDirectory") store_type = cfg.get("StoreType") check_for_chain(data_directory, node_name, store_type) # Obtain Journal object: # ...build Gossip dependency (nd, _) = parse_networking_info(cfg) minimum_retries = cfg.get("MinimumRetries") retry_interval = cfg.get("RetryInterval") gossiper = Gossip(nd, minimum_retries, retry_interval) # ...build Journal min_txn_per_block = cfg.get("MinimumTransactionsPerBlock") max_txn_per_block = cfg.get("MaxTransactionsPerBlock") max_txn_age = cfg.get("MaxTxnAge") stat_domains = {} consensus_obj = DevModeConsensus(block_publisher=True, block_wait_time=cfg.get('BlockWaitTime')) journal = Journal(gossiper.LocalNode, gossiper, gossiper.dispatcher, consensus_obj, stat_domains, minimum_transactions_per_block=min_txn_per_block, max_transactions_per_block=max_txn_per_block, max_txn_age=max_txn_age, data_directory=data_directory, store_type=store_type, ) # ...add 'built in' txn families default_transaction_families = [ endpoint_registry ] for txn_family in default_transaction_families: txn_family.register_transaction_types(journal) # ...add auxiliary transaction families for txn_family_module_name in cfg.get("TransactionFamilies", []): txn_family = importlib.import_module(txn_family_module_name) txn_family.register_transaction_types(journal) # Make genesis block: # ...make sure there is no current chain here, or fail # ...create block g_block journal.on_genesis_block.fire(journal) journal.initializing = False for txn in journal.initial_transactions: journal.add_pending_transaction(txn, build_block=False) g_block = journal.build_block(genesis=True) journal.claim_block(g_block) # ...simulate receiving the genesis block msg from reactor to force commit g_block_msg = gossiper.IncomingMessageQueue.pop() journal.dispatcher.dispatch(g_block_msg) journal.initialization_complete() head = journal.most_recent_committed_block_id chain_len = len(journal.committed_block_ids()) # Run shutdown: # ...persist new state journal.shutdown() # ...release gossip obj's UDP port gossiper.Listener.loseConnection() gossiper.Listener.connectionLost(reason=None) # Log genesis data, then write it out to ease dissemination genesis_data = { 'GenesisId': head, 'ChainLength': chain_len, } gblock_fname = genesis_info_file_name(cfg['DataDirectory']) LOGGER.info('genesis data: %s', genesis_data) LOGGER.info('writing genesis data to %s', gblock_fname) with open(gblock_fname, 'w') as f: f.write(json.dumps(genesis_data))
def do_poet1_genesis(args): # Get journal config: cfg = mirror_validator_parsing(args) # Check for existing block store node_name = cfg.get("NodeName") data_directory = cfg.get("DataDirectory") store_type = cfg.get("StoreType") check_for_chain(data_directory, node_name, store_type) # Obtain Journal object: # ...set WaitTimer globals target_wait_time = cfg.get("TargetWaitTime") initial_wait_time = cfg.get("InitialWaitTime") certificate_sample_length = cfg.get('CertificateSampleLength') fixed_duration_blocks = cfg.get("FixedDurationBlocks") set_wait_timer_globals(target_wait_time, initial_wait_time, certificate_sample_length, fixed_duration_blocks, ) # ...build Gossip dependency (nd, _) = parse_networking_info(cfg) minimum_retries = cfg.get("MinimumRetries") retry_interval = cfg.get("RetryInterval") gossiper = Gossip(nd, minimum_retries, retry_interval) # ...build Journal min_txn_per_block = cfg.get("MinimumTransactionsPerBlock") max_txn_per_block = cfg.get("MaxTransactionsPerBlock") max_txn_age = cfg.get("MaxTxnAge") stat_domains = {} consensus_obj = PoetConsensus(cfg) journal = Journal(gossiper.LocalNode, gossiper, gossiper.dispatcher, consensus_obj, stat_domains, minimum_transactions_per_block=min_txn_per_block, max_transactions_per_block=max_txn_per_block, max_txn_age=max_txn_age, data_directory=data_directory, store_type=store_type, ) # ...add 'built in' txn families default_transaction_families = [ endpoint_registry, validator_registry, ] for txn_family in default_transaction_families: txn_family.register_transaction_types(journal) # ...add auxiliary transaction families for txn_family_module_name in cfg.get("TransactionFamilies", []): txn_family = importlib.import_module(txn_family_module_name) txn_family.register_transaction_types(journal) # Make genesis block: consensus_obj.register_signup_information(journal=journal) # ...make sure there is no current chain here, or fail # ...pop VR seed (we'll presently defer resolving VR seed issues) vr_seed = gossiper.IncomingMessageQueue.pop() journal.initial_transactions.append(vr_seed.Transaction) # ...create block g_block (including VR seed txn just popped) journal.on_genesis_block.fire(journal) journal.initializing = False for txn in journal.initial_transactions: journal.add_pending_transaction(txn, build_block=False) g_block = journal.build_block(genesis=True) # seed later... journal.claim_block(g_block) # ...simulate receiving the genesis block msg from reactor to force commit g_block_msg = gossiper.IncomingMessageQueue.pop() poet_public_key = g_block.poet_public_key journal.dispatcher.dispatch(g_block_msg) journal.initialization_complete() head = journal.most_recent_committed_block_id chain_len = len(journal.committed_block_ids()) # Run shutdown: # ...persist new state journal.shutdown() # ...release gossip obj's UDP port gossiper.Listener.loseConnection() gossiper.Listener.connectionLost(reason=None) # Log genesis data, then write it out to ease dissemination genesis_data = { 'GenesisId': head, 'ChainLength': chain_len, 'PoetPublicKey': poet_public_key, } gblock_fname = genesis_info_file_name(cfg['DataDirectory']) LOGGER.info('genesis data: %s', genesis_data) LOGGER.info('writing genesis data to %s', gblock_fname) with open(gblock_fname, 'w') as f: f.write(json.dumps(genesis_data, indent=4))
def do_poet0_genesis(args): # Get ledger config: # ...set the default value of config because argparse 'default' in # ...combination with action='append' does the wrong thing. if args.config is None: args.config = ['txnvalidator.js'] # ...convert any comma-delimited argument strings to list elements for arglist in [args.config]: if arglist is not None: for arg in arglist: if ',' in arg: loc = arglist.index(arg) arglist.pop(loc) for element in reversed(arg.split(',')): arglist.insert(loc, element) options_config = ArgparseOptionsConfig( [ ('conf_dir', 'ConfigDirectory'), ('data_dir', 'DataDirectory'), ('type', 'LedgerType'), ('log_config', 'LogConfigFile'), ('keyfile', 'KeyFile'), ('node', 'NodeName'), ('verbose', 'Verbose'), ('family', 'TransactionFamilies') ], args) cfg = get_validator_configuration(args.config, options_config) # Obtain Journal object: # ...set WaitTimer globals target_wait_time = cfg.get("TargetWaitTime") initial_wait_time = cfg.get("InitialWaitTime") certificate_sample_length = cfg.get('CertificateSampleLength') fixed_duration_blocks = cfg.get("FixedDurationBlocks") from journal.consensus.poet0.wait_timer import set_wait_timer_globals set_wait_timer_globals(target_wait_time, initial_wait_time, certificate_sample_length, fixed_duration_blocks, ) # ...build Gossip dependency (nd, _) = parse_networking_info(cfg) minimum_retries = cfg.get("MinimumRetries") retry_interval = cfg.get("RetryInterval") gossiper = Gossip(nd, minimum_retries, retry_interval) # ...build Journal min_txn_per_block = cfg.get("MinimumTransactionsPerBlock") max_txn_per_block = cfg.get("MaxTransactionsPerBlock") max_txn_age = cfg.get("MaxTxnAge") genesis_ledger = cfg.get("GenesisLedger") data_directory = cfg.get("DataDirectory") store_type = cfg.get("StoreType") stat_domains = {} from journal.consensus.poet0.poet_consensus import PoetConsensus consensus_obj = PoetConsensus(cfg) journal = Journal(gossiper.LocalNode, gossiper, gossiper.dispatcher, consensus_obj, stat_domains, minimum_transactions_per_block=min_txn_per_block, max_transactions_per_block=max_txn_per_block, max_txn_age=max_txn_age, genesis_ledger=genesis_ledger, data_directory=data_directory, store_type=store_type, ) # ...add 'built in' txn families default_transaction_families = [ endpoint_registry ] for txn_family in default_transaction_families: txn_family.register_transaction_types(journal) # ...add auxiliary transaction families for txn_family_module_name in cfg.get("TransactionFamilies", []): txn_family = importlib.import_module(txn_family_module_name) txn_family.register_transaction_types(journal) # Make genesis block: # ...make sure there is no current chain here, or fail # ...create block g_block g_block = journal.build_block(genesis=True) journal.claim_block(g_block) # ...simulate receiving the genesis block msg from reactor to force commit g_block_msg = gossiper.IncomingMessageQueue.pop() journal.dispatcher.dispatch(g_block_msg) journal.initialization_complete() head = journal.most_recent_committed_block_id chain_len = len(journal.committed_block_ids()) # Run shutdown: # ...persist new state journal.shutdown() # ...release gossip obj's UDP port gossiper.Listener.loseConnection() gossiper.Listener.connectionLost(reason=None) # Log genesis data, then write it out to ease dissemination genesis_data = { 'GenesisId': head, 'ChainLength': chain_len, } gblock_fname = genesis_info_file_name(cfg['DataDirectory']) LOGGER.info('genesis data: %s', genesis_data) LOGGER.info('writing genesis data to %s', gblock_fname) with open(gblock_fname, 'w') as f: f.write(json.dumps(genesis_data))
def do_poet0_genesis(args): # Get ledger config: # set the default value of config because argparse 'default' in # combination with action='append' does the wrong thing. if args.config is None: args.config = ['txnvalidator.js'] # convert any comma-delimited argument strings to list elements for arglist in [args.config]: if arglist is not None: for arg in arglist: if ',' in arg: loc = arglist.index(arg) arglist.pop(loc) for element in reversed(arg.split(',')): arglist.insert(loc, element) options_config = ArgparseOptionsConfig( [ ('conf_dir', 'ConfigDirectory'), ('data_dir', 'DataDirectory'), ('type', 'LedgerType'), ('log_config', 'LogConfigFile'), ('keyfile', 'KeyFile'), ('node', 'NodeName'), ('verbose', 'Verbose'), ('family', 'TransactionFamilies') ], args) cfg = get_validator_configuration(args.config, options_config) # Perform requisite overrides and validation: cfg['GenesisLedger'] = True # should check that sigining key exists... # debug report for key, value in cfg.iteritems(): LOGGER.debug("CONFIG: %s = %s", key, value) # set WaitTimer globals target_wait_time = cfg.get("TargetWaitTime") initial_wait_time = cfg.get("InitialWaitTime") certificate_sample_length = cfg.get('CertificateSampleLength') fixed_duration_blocks = cfg.get("FixedDurationBlocks") from journal.consensus.poet0.wait_timer \ import set_wait_timer_globals set_wait_timer_globals(target_wait_time, initial_wait_time, certificate_sample_length, fixed_duration_blocks, ) # build gossiper (nd, _) = parse_networking_info(cfg) minimum_retries = cfg.get("MinimumRetries") retry_interval = cfg.get("RetryInterval") gossiper = Gossip(nd, minimum_retries, retry_interval) # build journal min_txn_per_block = cfg.get("MinimumTransactionsPerBlock") max_txn_per_block = cfg.get("MaxTransactionsPerBlock") max_txn_age = cfg.get("MaxTxnAge") genesis_ledger = cfg.get("GenesisLedger") data_directory = cfg.get("DataDirectory") store_type = cfg.get("StoreType") stat_domains = {} # in future, dynamically select consensus obj based on ConsensusType journal = Journal(gossiper.LocalNode, gossiper, gossiper.dispatcher, PoetConsensus(cfg), stat_domains, minimum_transactions_per_block=min_txn_per_block, max_transactions_per_block=max_txn_per_block, max_txn_age=max_txn_age, genesis_ledger=genesis_ledger, data_directory=data_directory, store_type=store_type, ) # may need to add transaction family objects ad hoc from cfg dfl_txn_families = [endpoint_registry, integer_key] for txnfamily in dfl_txn_families: txnfamily.register_transaction_types(journal) # ...skipping onNodeDisconnect handler (using ledger, not validator...) # Create genesis block: # we should make sure there is no current chain here, or fail # calling initialization_complete will create the genesis block journal.initialization_complete() # simulate receiving the genesis block msg from reactor to force commit msg = journal.gossip.IncomingMessageQueue.pop() (_, msg_handler) = journal.dispatcher.message_handler_map[msg.MessageType] msg_handler(msg, journal) # Gather data, then shutdown to save state: head = journal.most_recent_committed_block_id # ...not sure why n_blocks is experimentally 0 and not 1 # ...if we only make the genesis, it would be good to check n_blks = 1 n_blks = journal.committed_block_count journal.shutdown() # log genesis data, then write it out to ease dissemination genesis_data = { 'GenesisId': head, 'ChainLength': n_blks, } gblock_fname = get_genesis_block_id_file_name(cfg['DataDirectory']) LOGGER.info('genesis data: %s', genesis_data) LOGGER.info('writing genesis data to %s', gblock_fname) with open(gblock_fname, 'w') as f: f.write(json.dumps(genesis_data))