def test_l1block_trust_verifying(self): block = make_l1_block() sig = crypto.sign_l1_block(blake2b, secp256k1, key, block) block.proof = sig block.scheme = "trust" self.assertTrue(crypto.verify_l1_block_trust(blake2b, secp256k1, key.pubkey, block)) valid_block = copy.deepcopy(block) block.dc_id = "forged" self.assertFalse(crypto.verify_l1_block_trust(blake2b, secp256k1, key.pubkey, block)) block = copy.deepcopy(valid_block) block.block_id = "forged" self.assertFalse(crypto.verify_l1_block_trust(blake2b, secp256k1, key.pubkey, block)) block = copy.deepcopy(valid_block) block.timestamp = "forged" self.assertFalse(crypto.verify_l1_block_trust(blake2b, secp256k1, key.pubkey, block)) block = copy.deepcopy(valid_block) block.prev_id = "forged" self.assertFalse(crypto.verify_l1_block_trust(blake2b, secp256k1, key.pubkey, block)) block = copy.deepcopy(valid_block) block.prev_proof = "forged==" self.assertFalse(crypto.verify_l1_block_trust(blake2b, secp256k1, key.pubkey, block)) block = copy.deepcopy(valid_block) block.stripped_transactions = ["some", "forged", "txns"] self.assertFalse(crypto.verify_l1_block_trust(blake2b, secp256k1, key.pubkey, block)) block = copy.deepcopy(valid_block) block.proof = "MEQCIF+o3DHBiTbpw8X6W4/yOuPF/FfANIiNnG0mFLgjBAjuAiAe/QAHN8ufmHMeRvHFItdrzVHFORGED4/msipzFORGED==" self.assertFalse(crypto.verify_l1_block_trust(blake2b, secp256k1, key.pubkey, block))
def verify_block(self, block: "model.BlockModel") -> bool: # noqa: C901 """Verify a block with this class' keys Args: block: BlockModel to verify Returns: Boolean if valid block (according to these keys) Raises: NotImplementedError when invalid scheme on self """ if self.scheme == SupportedSchemes.trust and self.pub is None: RuntimeError( "No public key has been set for verifying block signature") if self.level == 1: if self.scheme == SupportedSchemes.trust: return crypto.verify_l1_block_trust( self.hash, self.encryption, self.pub, cast("l1_block_model.L1BlockModel", block)) elif self.scheme == SupportedSchemes.work: return crypto.verify_l1_block_pow( self.hash, cast("l1_block_model.L1BlockModel", block)) else: raise NotImplementedError( f"Proof scheme {self.scheme} not implemented") elif self.level == 2: if self.scheme == SupportedSchemes.trust: return crypto.verify_l2_block_trust( self.hash, self.encryption, self.pub, cast("l2_block_model.L2BlockModel", block)) elif self.scheme == SupportedSchemes.work: return crypto.verify_l2_block_pow( self.hash, cast("l2_block_model.L2BlockModel", block)) else: raise NotImplementedError( f"Proof scheme {self.scheme} not implemented") elif self.level == 3: if self.scheme == SupportedSchemes.trust: return crypto.verify_l3_block_trust( self.hash, self.encryption, self.pub, cast("l3_block_model.L3BlockModel", block)) elif self.scheme == SupportedSchemes.work: return crypto.verify_l3_block_pow( self.hash, cast("l3_block_model.L3BlockModel", block)) else: raise NotImplementedError( f"Proof scheme {self.scheme} not implemented") elif self.level == 4: if self.scheme == SupportedSchemes.trust: return crypto.verify_l4_block_trust( self.hash, self.encryption, self.pub, cast("l4_block_model.L4BlockModel", block)) elif self.scheme == SupportedSchemes.work: return crypto.verify_l4_block_pow( self.hash, cast("l4_block_model.L4BlockModel", block)) else: raise NotImplementedError( f"Proof scheme {self.scheme} not implemented") elif self.level == 5: if self.scheme == SupportedSchemes.trust: return crypto.verify_l5_block_trust( self.hash, self.encryption, self.pub, cast("l5_block_model.L5BlockModel", block)) else: raise NotImplementedError( f"Proof scheme {self.scheme} not implemented") else: raise exceptions.InvalidNodeLevel( f"Node level {self.level} nonexistent")