Пример #1
0
    def test_verify_unsealing_data(self):
        signup_info = \
            SignupInfo.create_signup_info(
                originator_public_key_hash=self._originator_public_key_hash,
                most_recent_wait_certificate_id=NullIdentifier)
        poet_public_key = \
            SignupInfo.unseal_signup_data(signup_info.sealed_signup_data)

        self.assertEqual(
            signup_info.poet_public_key,
            poet_public_key,
            msg="PoET public key in signup info and sealed data don't match")
Пример #2
0
    def test_verify_unsealing_data(self):
        signup_info = \
            SignupInfo.create_signup_info(
                originator_public_key=self._originator_public_key,
                validator_network_basename='This is CNN.',
                most_recent_wait_certificate_id=NullIdentifier)
        encoded_poet_public_key = \
            SignupInfo.unseal_signup_data(signup_info.sealed_signup_data)

        self.assertEqual(
            signup_info.poet_public_key,
            encoded_poet_public_key,
            msg="PoET public key in signup info and sealed data don't match")
Пример #3
0
    def test_verify_unsealing_data(self):
        signup_info = \
            SignupInfo.create_signup_info(
                originator_public_key=self._originator_public_key,
                validator_network_basename='This is CNN.',
                most_recent_wait_certificate_id=NullIdentifier)
        encoded_poet_public_key = \
            SignupInfo.unseal_signup_data(signup_info.sealed_signup_data)

        self.assertEqual(
            signup_info.poet_public_key,
            encoded_poet_public_key,
            msg="PoET public key in signup info and sealed data don't match")
Пример #4
0
    def initialization_complete(self, journal):
        """Processes all invocations that arrived while the ledger was
        being initialized.
        """
        # Before we allow the base journal to do anything that might result
        # in a wait timer or wait certificate from being created, we have to
        # ensure that the PoET enclave has been initialized.  This can be done
        # in one of two ways:
        # 1. If we have sealed signup data (meaning that we have previously
        #    created signup info), we can request that the enclave unseal it,
        #    in the process restoring the enclave to its previous state.
        # 2. Create new signup information.
        signup_info = None
        sealed_signup_data = journal.local_store.get('sealed_signup_data')

        if sealed_signup_data is not None:
            SignupInfo.unseal_signup_data(
                sealed_signup_data=sealed_signup_data)
        else:
            wait_certificate_id = journal.most_recent_committed_block_id
            signup_info = \
                SignupInfo.create_signup_info(
                    originator_public_key=journal.local_node.public_key(),
                    validator_network_basename='Intel Validator Network',
                    most_recent_wait_certificate_id=wait_certificate_id)

            # Save off the sealed signup data
            self.local_store.set('sealed_signup_data',
                                 signup_info.sealed_signup_data)
            self.local_store.sync()

            # initialize the poet handlers
            poet_transaction_block.register_message_handlers(journal)

            # initialize stats specifically for the block chain journal
            journal.JournalStats.add_metric(stats.Value('LocalMeanTime', 0))
            journal.JournalStats.add_metric(
                stats.Value('AggregateLocalMean', '0'))
            journal.JournalStats.add_metric(
                stats.Value('PopulationEstimate', '0'))
            journal.JournalStats.add_metric(
                stats.Value('ExpectedExpirationTime', '0'))
            journal.JournalStats.add_metric(stats.Value('Duration', '0'))

        # If we created signup information, then insert ourselves into the
        # validator registry.
        if signup_info is not None:
            # Create a validator register transaction and sign it.  Wrap
            # the transaction in a message.  Broadcast it to out.
            transaction = \
                val_reg.ValidatorRegistryTransaction.register_validator(
                    self.local_node.Name,
                    self.local_node.Identifier,
                    signup_info)
            transaction.sign_from_node(self.local_node)

            message = \
                val_reg.ValidatorRegistryTransactionMessage()
            message.Transaction = transaction

            LOGGER.info('Register PoET 1 validator with name %s',
                        journal.local_node.Name)

            journal.gossip.broadcast_message(message)
Пример #5
0
    def test_create_wait_timer(self):
        # Need to create signup information first
        signup_info = \
            SignupInfo.create_signup_info(
                originator_public_key=self._originator_public_key,
                validator_network_basename="America's Most Watched Network",
                most_recent_wait_certificate_id=NullIdentifier)

        stake_in_the_sand = time.time()

        # An empty certificate list should result in a local mean that is
        # the target wait time
        wt = wait_timer.WaitTimer.create_wait_timer([])

        self.assertIsNotNone(wt)
        self.assertEqual(wt.local_mean, wait_timer.WaitTimer.target_wait_time)
        self.assertEquals(wt.previous_certificate_id, NullIdentifier)
        self.assertGreaterEqual(wt.request_time, stake_in_the_sand)
        self.assertLessEqual(wt.request_time, time.time())
        self.assertGreaterEqual(
            wt.duration,
            wait_timer.WaitTimer.minimum_wait_time)

        wt = wait_timer.WaitTimer.create_wait_timer(tuple())

        self.assertIsNotNone(wt)
        self.assertEqual(wt.local_mean, wait_timer.WaitTimer.target_wait_time)
        self.assertEquals(wt.previous_certificate_id, NullIdentifier)
        self.assertGreaterEqual(wt.request_time, stake_in_the_sand)
        self.assertLessEqual(wt.request_time, time.time())
        self.assertGreaterEqual(
            wt.duration,
            wait_timer.WaitTimer.minimum_wait_time)

        # Ensure that the enclave is set back to initial state
        SignupInfo.poet_enclave = reload(poet_enclave)
        wait_timer.WaitTimer.poet_enclave = SignupInfo.poet_enclave

        # Make sure that trying to create a wait timer before signup
        # information is provided causes an error
        with self.assertRaises(wait_timer.WaitTimerError):
            wait_timer.WaitTimer.create_wait_timer([])

        with self.assertRaises(wait_timer.WaitTimerError):
            wait_timer.WaitTimer.create_wait_timer(tuple())

        # Initialize the enclave with sealed signup data
        SignupInfo.unseal_signup_data(signup_info.sealed_signup_data)

        stake_in_the_sand = time.time()

        # An empty certificate list should result in a local mean that is
        # the target wait time
        wt = wait_timer.WaitTimer.create_wait_timer([])

        self.assertIsNotNone(wt)
        self.assertEqual(wt.local_mean, wait_timer.WaitTimer.target_wait_time)
        self.assertEquals(wt.previous_certificate_id, NullIdentifier)
        self.assertGreaterEqual(wt.request_time, stake_in_the_sand)
        self.assertLessEqual(wt.request_time, time.time())
        self.assertGreaterEqual(
            wt.duration,
            wait_timer.WaitTimer.minimum_wait_time)

        wt = wait_timer.WaitTimer.create_wait_timer(tuple())

        self.assertIsNotNone(wt)
        self.assertEqual(wt.local_mean, wait_timer.WaitTimer.target_wait_time)
        self.assertEquals(wt.previous_certificate_id, NullIdentifier)
        self.assertGreaterEqual(wt.request_time, stake_in_the_sand)
        self.assertLessEqual(wt.request_time, time.time())
        self.assertGreaterEqual(
            wt.duration,
            wait_timer.WaitTimer.minimum_wait_time)
Пример #6
0
    def initialization_complete(self, journal):
        """Processes all invocations that arrived while the ledger was
        being initialized.
        """
        # Before we allow the base journal to do anything that might result
        # in a wait timer or wait certificate being created, we have to ensure
        # the PoET enclave has been initialized.  This can be done in one of
        # two ways:
        # 1. If we have sealed signup data (meaning that we have previously
        #    created signup info), we can request that the enclave unseal it,
        #    in the process restoring the enclave to its previous state.
        # 2. Create new signup information.
        signup_info = None
        sealed_signup_data = journal.local_store.get('sealed_signup_data')

        if sealed_signup_data is not None:
            SignupInfo.unseal_signup_data(
                sealed_signup_data=sealed_signup_data)
        else:
            wait_certificate_id = journal.most_recent_committed_block_id
            signup_info = \
                SignupInfo.create_signup_info(
                    originator_public_key=journal.local_node.public_key(),
                    validator_network_basename='Intel Validator Network',
                    most_recent_wait_certificate_id=wait_certificate_id)

            # Save off the sealed signup data
            journal.local_store.set(
                'sealed_signup_data',
                signup_info.sealed_signup_data)
            journal.local_store.sync()

        # propagate the maximum blocks to keep
        journal.maximum_blocks_to_keep = max(
            journal.maximum_blocks_to_keep,
            WaitTimer.certificate_sample_length)

        # initialize stats specifically for the block chain journal
        journal.JournalStats.add_metric(stats.Value('LocalMeanTime', 0))
        journal.JournalStats.add_metric(stats.Value('AggregateLocalMean', '0'))
        journal.JournalStats.add_metric(stats.Value('PopulationEstimate', '0'))
        journal.JournalStats.add_metric(stats.Value('ExpectedExpirationTime',
                                                    '0'))
        journal.JournalStats.add_metric(stats.Value('Duration', '0'))

        # initialize the block handlers
        poet_transaction_block.register_message_handlers(journal)

        # If we created signup information, then insert ourselves into the
        # validator registry.
        if signup_info is not None:
            # Create a validator register transaction and sign it.  Wrap
            # the transaction in a message.  Broadcast it to out.
            transaction = \
                val_reg.ValidatorRegistryTransaction.register_validator(
                    journal.local_node.Name,
                    journal.local_node.Identifier,
                    signup_info)
            transaction.sign_from_node(journal.local_node)

            message = \
                val_reg.ValidatorRegistryTransactionMessage()
            message.Transaction = transaction

            LOGGER.info(
                'Register PoET 1 validator with name %s',
                journal.local_node.Name)

            journal.gossip.broadcast_message(message)