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()
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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)
Пример #7
0
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)
Пример #8
0
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)