def local_main(config, windows_service=False): """ Implement the actual application logic for starting the txnvalidator """ ledgertype = config.get('LedgerType', 'lottery') if ledgertype == 'lottery': validator = lottery_validator.LotteryValidator( config, windows_service=windows_service) elif ledgertype == 'voting': validator = voting_validator.VotingValidator( config, windows_service=windows_service) else: warnings.warn('Unknown ledger type %s' % ledgertype) sys.exit(1) web_api.initialize_web_server(config, validator.Ledger) # go through the list of transaction families that should be initialized in # this validator. the endpoint registry is always included for txnfamily in config.get('TransactionFamilies'): try: validator.add_transaction_family( importlib.import_module(txnfamily)) except ImportError, e: warnings.warn("transaction family not found: {}".format(txnfamily)) sys.exit(1)
def local_main(config, windows_service=False): """ Implement the actual application logic for starting the txnvalidator """ ledgertype = config.get('LedgerType', 'lottery') validator = None try: if ledgertype == 'lottery': validator = lottery_validator.LotteryValidator( config, windows_service=windows_service) elif ledgertype == 'voting': validator = voting_validator.VotingValidator( config, windows_service=windows_service) else: warnings.warn('Unknown ledger type %s' % ledgertype) sys.exit(1) except GossipException as e: print >> sys.stderr, str(e) sys.exit(1) web_api.initialize_web_server(config, validator.Ledger) # go through the list of transaction families that should be initialized in # this validator. the endpoint registry is always included for txnfamily in config.get('TransactionFamilies'): logger.info("adding transaction family: %s", txnfamily) try: validator.add_transaction_family( importlib.import_module(txnfamily)) except ImportError: warnings.warn("transaction family not found: {}".format(txnfamily)) sys.exit(1) validator.start() reactor.run()
def local_main(config, windows_service=False, daemonized=False): """ Implement the actual application logic for starting the txnvalidator """ # If this process has been daemonized, then we want to make # sure to print out an information message as quickly as possible # to the logger for debugging purposes. if daemonized: logger.info('validator has been daemonized') # These imports are delayed because of poor interactions between # epoll and fork. Unfortunately, these import statements set up # epoll and we need that to happen after the forking done with # Daemonize(). This is a side-effect of importing twisted. from twisted.internet import reactor from txnserver.validator import parse_networking_info from txnserver.validator import Validator from txnserver import web_api from gossip.gossip_core import GossipException from gossip.gossip_core import Gossip logger.warn('validator pid is %s', os.getpid()) consensus_type = config.get('LedgerType', 'poet0') stat_domains = {} try: (node, http_port) = parse_networking_info(config) # to construct a validator, we pass it a consensus specific journal validator = None journal = None # Gossip parameters minimum_retries = config.get("MinimumRetries") retry_interval = config.get("RetryInterval") gossip = Gossip(node, minimum_retries, retry_interval, stat_domains) # WaitTimer globals target_wait_time = config.get("TargetWaitTime") initial_wait_time = config.get("InitialWaitTime") certificate_sample_length = config.get('CertificateSampleLength') fixed_duration_blocks = config.get("FixedDurationBlocks") minimum_wait_time = config.get("MinimumWaitTime") # Journal parameters min_txn_per_block = config.get("MinimumTransactionsPerBlock") max_txn_per_block = config.get("MaxTransactionsPerBlock") max_txn_age = config.get("MaxTxnAge") data_directory = config.get("DataDirectory") store_type = config.get("StoreType") if consensus_type == 'poet0': from sawtooth_validator.consensus.poet0 import poet_consensus from sawtooth_validator.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) # Continue to pass config to PoetConsensus for possible other # enclave implementations - poet_enclave.initialize consensus = poet_consensus.PoetConsensus(config) elif consensus_type == 'poet1': from sawtooth_validator.consensus.poet1 import poet_consensus from sawtooth_validator.consensus.poet1.wait_timer \ import set_wait_timer_globals set_wait_timer_globals(target_wait_time, initial_wait_time, certificate_sample_length, fixed_duration_blocks, minimum_wait_time) # Continue to pass config to PoetConsensus for possible other # enclave implementations - poet_enclave.initialize consensus = poet_consensus.PoetConsensus(config) elif consensus_type == 'quorum': quorum = config.get("Quorum") nodes = config.get("Nodes") vote_time_interval = config.get("VoteTimeInterval") ballot_time_interval = config.get("BallotTimeInterval") voting_quorum_target_size = config.get("VotingQuorumTargetSize") from sawtooth_validator.consensus.quorum import quorum_consensus consensus = quorum_consensus.QsuorumConsensus( vote_time_interval, ballot_time_interval, voting_quorum_target_size, quorum, nodes) elif consensus_type == 'dev_mode': block_publisher = config.get("DevModePublisher", False) block_wait_time = config.get("BlockWaitTime") from sawtooth_validator.consensus.dev_mode \ import dev_mode_consensus consensus = dev_mode_consensus.DevModeConsensus( block_publisher, block_wait_time) else: warnings.warn('Unknown consensus type %s' % consensus_type) sys.exit(1) permissioned_validators =\ config.get("WhitelistOfPermissionedValidators") journal = Journal(gossip.LocalNode, gossip, gossip.dispatcher, consensus, permissioned_validators, stat_domains, min_txn_per_block, max_txn_per_block, max_txn_age, data_directory, store_type) validator = Validator( gossip, journal, stat_domains, config, windows_service=windows_service, http_port=http_port, ) except GossipException as e: print >> sys.stderr, str(e) sys.exit(1) listen_info = config.get("Listen", None) web_api.initialize_web_server(listen_info, validator) # go through the list of transaction families that should be initialized in # this validator. the endpoint registry is always included if consensus_type == 'poet1': from sawtooth_validator.consensus.poet1 import validator_registry validator_registry.register_transaction_types(journal) for txnfamily in config.get('TransactionFamilies'): logger.info("adding transaction family: %s", txnfamily) try: validator.add_transaction_family( importlib.import_module(txnfamily)) except ImportError: warnings.warn("transaction family not found: {}".format(txnfamily)) sys.exit(1) # attempt to restore journal state from persistence try: validator.journal.restore() except KeyError as e: logger.error( "Config is not compatible with data files" " found on restore. Keyerror on %s", e) sys.exit(1) try: validator.pre_start() reactor.run(installSignalHandlers=False) except KeyboardInterrupt: pass except SystemExit as e: raise e except: traceback.print_exc(file=sys.stderr) sys.exit(1)
def local_main(config, windows_service=False, daemonized=False): """ Implement the actual application logic for starting the txnvalidator """ # If this process has been daemonized, then we want to make # sure to print out an information message as quickly as possible # to the logger for debugging purposes. if daemonized: logger.info('validator has been daemonized') # These imports are delayed because of poor interactions between # epoll and fork. Unfortunately, these import statements set up # epoll and we need that to happen after the forking done with # Daemonize(). This is a side-effect of importing twisted. from twisted.internet import reactor from txnserver.validator import parse_networking_info from txnserver.validator import Validator from txnserver import quorum_validator from txnserver import web_api from gossip.gossip_core import GossipException logger.warn('validator pid is %s', os.getpid()) ledgertype = config.get('LedgerType', 'poet0') try: (node, http_port) = parse_networking_info(config) # to construct a validator, we pass it a consensus specific ledger validator = None ledger = None # Gossip parameters minimum_retries = config.get("MinimumRetries") retry_interval = config.get("RetryInterval") gossip = Gossip(node, minimum_retries, retry_interval) # WaitTimer globals target_wait_time = config.get("TargetWaitTime") initial_wait_time = config.get("InitialWaitTime") certificate_sample_length = config.get('CertificateSampleLength') fixed_duration_blocks = config.get("FixedDurationBlocks") minimum_wait_time = config.get("MinimumWaitTime") # Journal parameters min_txn_per_block = config.get("MinimumTransactionsPerBlock") max_txn_per_block = config.get("MaxTransactionsPerBlock") max_txn_age = config.get("MaxTxnAge") genesis_ledger = config.get("GenesisLedger") restore = config.get("Restore") data_directory = config.get("DataDirectory") store_type = config.get("StoreType") if ledgertype == 'poet0': from journal.consensus.poet0 import poet_journal 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) # Continue to pass config to PoetJournal for possible other enclave # implmentations - poet_enclave.initialize ledger = poet_journal.PoetJournal(gossip, config, min_txn_per_block, max_txn_per_block, max_txn_age, genesis_ledger, restore, data_directory, store_type) elif ledgertype == 'poet1': from journal.consensus.poet1 import poet_journal from journal.consensus.poet1.wait_timer \ import set_wait_timer_globals set_wait_timer_globals(target_wait_time, initial_wait_time, certificate_sample_length, fixed_duration_blocks, minimum_wait_time) # Continue to pass config to PoetJournal for possible other enclave # implmentations - poet_enclave.initialize ledger = poet_journal.PoetJournal(gossip, config, min_txn_per_block, max_txn_per_block, max_txn_age, genesis_ledger, restore, data_directory, store_type) elif ledgertype == 'quorum': quorum = config.get("Quorum") nodes = config.get("Nodes") vote_time_interval = config.get("VoteTimeInterval") ballot_time_interval = config.get("BallotTimeInterval") voting_quorum_target_size = config.get("VotingQuorumTargetSize") from journal.consensus.quorum import quorum_journal ledger = quorum_journal.QuorumJournal( gossip, min_txn_per_block, max_txn_per_block, max_txn_age, genesis_ledger, restore, data_directory, store_type, vote_time_interval, ballot_time_interval, voting_quorum_target_size) ledger.initialize_quorum_map(quorum, nodes) # quorum validator is still sub-classed for now... validator = quorum_validator.QuorumValidator( gossip, ledger, config, windows_service=windows_service, http_port=http_port) elif ledgertype == 'dev_mode': block_wait_time = config.get("BlockWaitTime") from journal.consensus.dev_mode import dev_mode_journal ledger = dev_mode_journal.DevModeJournal( gossip, min_txn_per_block, max_txn_per_block, max_txn_age, genesis_ledger, restore, data_directory, store_type, block_wait_time) else: warnings.warn('Unknown ledger type %s' % ledgertype) sys.exit(1) if validator is None: # null-check until we get rid of QuorumValidator subclass validator = Validator( gossip, ledger, config, windows_service=windows_service, http_port=http_port, ) except GossipException as e: print >> sys.stderr, str(e) sys.exit(1) listen_info = config.get("Listen", None) web_api.initialize_web_server(listen_info, validator) # go through the list of transaction families that should be initialized in # this validator. the endpoint registry is always included for txnfamily in config.get('TransactionFamilies'): logger.info("adding transaction family: %s", txnfamily) try: validator.add_transaction_family( importlib.import_module(txnfamily)) except ImportError: warnings.warn("transaction family not found: {}".format(txnfamily)) sys.exit(1) try: validator.pre_start() reactor.run() except KeyboardInterrupt: pass except SystemExit as e: raise e except: traceback.print_exc(file=sys.stderr) sys.exit(1)
def local_main(config, windows_service=False, daemonized=False): """ Implement the actual application logic for starting the txnvalidator """ # If this process has been daemonized, then we want to make # sure to print out an information message as quickly as possible # to the logger for debugging purposes. if daemonized: logger.info('validator has been daemonized') # These imports are delayed because of poor interactions between # epoll and fork. Unfortunately, these import statements set up # epoll and we need that to happen after the forking done with # Daemonize(). This is a side-effect of importing twisted. from twisted.internet import reactor from txnserver import lottery_validator from txnserver import quorum_validator from txnserver import dev_mode_validator from txnserver import web_api from gossip.gossip_core import GossipException logger.warn('validator pid is %s', os.getpid()) ledgertype = config.get('LedgerType', 'lottery') validator = None try: if ledgertype == 'lottery': validator = lottery_validator.LotteryValidator( config, windows_service=windows_service) elif ledgertype == 'quorum': validator = quorum_validator.QuorumValidator( config, windows_service=windows_service) elif ledgertype == 'dev_mode': validator = dev_mode_validator.DevModeValidator( config, windows_service=windows_service) else: warnings.warn('Unknown ledger type %s' % ledgertype) sys.exit(1) except GossipException as e: print >> sys.stderr, str(e) sys.exit(1) web_api.initialize_web_server(config, validator) # go through the list of transaction families that should be initialized in # this validator. the endpoint registry is always included for txnfamily in config.get('TransactionFamilies'): logger.info("adding transaction family: %s", txnfamily) try: validator.add_transaction_family( importlib.import_module(txnfamily)) except ImportError: warnings.warn("transaction family not found: {}".format(txnfamily)) sys.exit(1) try: validator.pre_start() reactor.run() except KeyboardInterrupt: pass except SystemExit as e: raise e except: traceback.print_exc(file=sys.stderr) sys.exit(1)
def local_main(config, windows_service=False, daemonized=False): """ Implement the actual application logic for starting the txnvalidator """ # If this process has been daemonized, then we want to make # sure to print out an information message as quickly as possible # to the logger for debugging purposes. if daemonized: logger.info('validator has been daemonized') # These imports are delayed because of poor interactions between # epoll and fork. Unfortunately, these import statements set up # epoll and we need that to happen after the forking done with # Daemonize(). This is a side-effect of importing twisted. from twisted.internet import reactor from txnserver import lottery_validator from txnserver import voting_validator from txnserver import web_api from gossip.gossip_core import GossipException logger.warn('validator pid is %s', os.getpid()) ledgertype = config.get('LedgerType', 'lottery') validator = None try: if ledgertype == 'lottery': validator = lottery_validator.LotteryValidator( config, windows_service=windows_service) elif ledgertype == 'voting': validator = voting_validator.VotingValidator( config, windows_service=windows_service) else: warnings.warn('Unknown ledger type %s' % ledgertype) sys.exit(1) except GossipException as e: print >> sys.stderr, str(e) sys.exit(1) web_api.initialize_web_server(config, validator) # go through the list of transaction families that should be initialized in # this validator. the endpoint registry is always included for txnfamily in config.get('TransactionFamilies'): logger.info("adding transaction family: %s", txnfamily) try: validator.add_transaction_family( importlib.import_module(txnfamily)) except ImportError: warnings.warn("transaction family not found: {}".format(txnfamily)) sys.exit(1) try: validator.pre_start() reactor.run() except KeyboardInterrupt: pass except SystemExit as e: raise e except: traceback.print_exc(file=sys.stderr) sys.exit(1)
def local_main(config, windows_service=False, daemonized=False): """ Implement the actual application logic for starting the txnvalidator """ # If this process has been daemonized, then we want to make # sure to print out an information message as quickly as possible # to the logger for debugging purposes. if daemonized: logger.info('validator has been daemonized') # These imports are delayed because of poor interactions between # epoll and fork. Unfortunately, these import statements set up # epoll and we need that to happen after the forking done with # Daemonize(). This is a side-effect of importing twisted. from twisted.internet import reactor from txnserver.validator import parse_networking_info from txnserver.validator import Validator from txnserver import quorum_validator from txnserver import web_api from gossip.gossip_core import GossipException logger.warn('validator pid is %s', os.getpid()) ledgertype = config.get('LedgerType', 'poet0') validator = None try: (nd, http_port) = parse_networking_info(config) # to construct a validator, we pass it a consensus specific ledger validator = None ledger = None ep_domain = None if ledgertype == 'poet0': from journal.consensus.poet0 import poet_journal set_wait_timer_globals(config) ledger = poet_journal.PoetJournal(nd, **config) ep_domain = '/PoetValidator' elif ledgertype == 'quorum': from journal.consensus.quorum import quorum_journal ledger = quorum_journal.QuorumJournal(nd, **config) ledger.initialize_quorum_map(config) # quorum validator is still sub-classed for now... validator = quorum_validator.QuorumValidator( nd, ledger, config, windows_service=windows_service, http_port=http_port) validator.EndpointDomain = '/QuorumValidator' elif ledgertype == 'dev_mode': from journal.consensus.dev_mode import dev_mode_journal set_wait_timer_globals(config) ledger = dev_mode_journal.DevModeJournal(nd, **config) ep_domain = '/DevModeValidator' else: warnings.warn('Unknown ledger type %s' % ledgertype) sys.exit(1) if validator is None: # null-check until we get rid of QuorumValidator subclass validator = Validator( nd, ledger, config, windows_service=windows_service, http_port=http_port, ) validator.EndpointDomain = ep_domain except GossipException as e: print >> sys.stderr, str(e) sys.exit(1) web_api.initialize_web_server(config, validator) # go through the list of transaction families that should be initialized in # this validator. the endpoint registry is always included for txnfamily in config.get('TransactionFamilies'): logger.info("adding transaction family: %s", txnfamily) try: validator.add_transaction_family( importlib.import_module(txnfamily)) except ImportError: warnings.warn("transaction family not found: {}".format(txnfamily)) sys.exit(1) try: validator.pre_start() reactor.run() except KeyboardInterrupt: pass except SystemExit as e: raise e except: traceback.print_exc(file=sys.stderr) sys.exit(1)
def local_main(config, windows_service=False, daemonized=False): """ Implement the actual application logic for starting the txnvalidator """ # If this process has been daemonized, then we want to make # sure to print out an information message as quickly as possible # to the logger for debugging purposes. if daemonized: logger.info('validator has been daemonized') # These imports are delayed because of poor interactions between # epoll and fork. Unfortunately, these import statements set up # epoll and we need that to happen after the forking done with # Daemonize(). This is a side-effect of importing twisted. from twisted.internet import reactor from txnserver.validator import parse_networking_info from txnserver.validator import Validator from txnserver import web_api from gossip.gossip_core import GossipException from gossip.gossip_core import Gossip from journal.journal_core import Journal logger.warn('validator pid is %s', os.getpid()) consensus_type = config.get('LedgerType', 'poet1') stat_domains = {} try: (node, http_port) = parse_networking_info(config) # to construct a validator, we pass it a consensus specific journal validator = None journal = None # Gossip parameters minimum_retries = config.get("MinimumRetries") retry_interval = config.get("RetryInterval") gossip = Gossip(node, minimum_retries, retry_interval, stat_domains) # WaitTimer globals target_wait_time = config.get("TargetWaitTime") initial_wait_time = config.get("InitialWaitTime") certificate_sample_length = config.get('CertificateSampleLength') fixed_duration_blocks = config.get("FixedDurationBlocks") minimum_wait_time = config.get("MinimumWaitTime") # Journal parameters min_txn_per_block = config.get("MinimumTransactionsPerBlock") max_txn_per_block = config.get("MaxTransactionsPerBlock") max_txn_age = config.get("MaxTxnAge") data_directory = config.get("DataDirectory") store_type = config.get("StoreType") if consensus_type == 'poet1': from sawtooth_validator.consensus.poet1 import poet_consensus from sawtooth_validator.consensus.poet1.wait_timer \ import set_wait_timer_globals set_wait_timer_globals(target_wait_time, initial_wait_time, certificate_sample_length, fixed_duration_blocks, minimum_wait_time) # Continue to pass config to PoetConsensus for possible other # enclave implementations - poet_enclave.initialize consensus = poet_consensus.PoetConsensus(config) elif consensus_type == 'dev_mode': block_publisher = config.get("DevModePublisher", False) block_wait_time = config.get("BlockWaitTime") from sawtooth_validator.consensus.dev_mode \ import dev_mode_consensus consensus = dev_mode_consensus.DevModeConsensus( block_publisher, block_wait_time) else: warnings.warn('Unknown consensus type %s' % consensus_type) sys.exit(1) permissioned_validators =\ config.get("WhitelistOfPermissionedValidators") journal = Journal( gossip.LocalNode, gossip, gossip.dispatcher, consensus, permissioned_validators, stat_domains, min_txn_per_block, max_txn_per_block, max_txn_age, data_directory, store_type) validator = Validator( gossip, journal, stat_domains, config, windows_service=windows_service, http_port=http_port, ) except GossipException as e: print(str(e), file=sys.stderr) sys.exit(1) listen_info = config.get("Listen", None) web_api.initialize_web_server(listen_info, validator) # go through the list of transaction families that should be initialized in # this validator. the endpoint registry is always included if consensus_type == 'poet1': from sawtooth_validator.consensus.poet1 import validator_registry validator_registry.register_transaction_types(journal) for txnfamily in config.get('TransactionFamilies'): logger.info("adding transaction family: %s", txnfamily) try: validator.add_transaction_family( importlib.import_module(txnfamily)) except ImportError: warnings.warn("transaction family not found: {}".format(txnfamily)) sys.exit(1) # attempt to restore journal state from persistence try: validator.journal.restore() except KeyError as e: logger.error("Config is not compatible with data files" " found on restore. Keyerror on %s", e) sys.exit(1) try: validator.pre_start() reactor.run(installSignalHandlers=False) except KeyboardInterrupt: pass except SystemExit as e: raise e except: traceback.print_exc(file=sys.stderr) sys.exit(1)