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")
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")
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)
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)
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)