def test_deserialize_condition(self, fulfillment_ed25519): deserialized_condition = Condition.from_uri( fulfillment_ed25519['condition_uri']) assert deserialized_condition.serialize_uri( ) == fulfillment_ed25519['condition_uri'] assert binascii.hexlify(deserialized_condition.hash ) == fulfillment_ed25519['condition_hash']
def prepare_transfer(inputs, outputs, metadata=None): """Create an instance of a :class:`~.Output`. Args: inputs (list of (dict): { 'tx': <(bigchaindb.common.transactionTransaction): input transaction, can differ but must have same asset id>, 'output': <(int): output index of tx> } ) outputs (list of (dict): { 'condition': <(cryptoconditions.Condition): output condition>, 'public_keys': <(optional list of base58): for indexing defaults to `None`>, 'amount': <(int): defaults to `1`> } ) metadata (dict) Raises: TypeError: if `public_keys` is not instance of `list`. """ from bigchaindb.common.transaction import (Input, Output, TransactionLink) from bigchaindb.models import Transaction from cryptoconditions import (Fulfillment, Condition) asset = inputs[0]['tx']['asset'] asset = {'id': asset['id'] if 'id' in asset else inputs[0]['tx']['id']} _inputs, _outputs = [], [] for _input in inputs: _output = _input['tx']['outputs'][_input['output']] _inputs.append( Input(fulfillment=Condition.from_uri(_output['condition']['uri']), owners_before=_output['public_keys'], fulfills=TransactionLink(txid=_input['tx']['id'], output=_input['output']))) for output in outputs: _outputs.append( Output(fulfillment=output['condition'], public_keys=output['public_keys'] if "public_keys" in output else [], amount=output['amount'] if "amount" in output else 1)) return Transaction( operation='TRANSFER', asset=asset, inputs=_inputs, outputs=_outputs, metadata=metadata, )
def test_create_condition(self, fulfillment_sha256): sha256condition = Condition() sha256condition.type_id = PreimageSha256Fulfillment.TYPE_ID sha256condition.bitmask = PreimageSha256Fulfillment.FEATURE_BITMASK sha256condition.hash = binascii.unhexlify( fulfillment_sha256['condition_hash']) sha256condition.max_fulfillment_length = 0 assert sha256condition.serialize_uri( ) == fulfillment_sha256['condition_uri']
def test_deserialize_condition_and_validate_fulfillment( self, fulfillment_sha256): condition = Condition.from_uri(fulfillment_sha256['condition_uri']) fulfillment = PreimageSha256Fulfillment() fulfillment.preimage = '' assert fulfillment.serialize_uri( ) == fulfillment_sha256['fulfillment_uri'] assert fulfillment.condition.serialize_uri( ) == condition.serialize_uri() assert fulfillment.validate() assert fulfillment.validate() and fulfillment.condition.serialize_uri( ) == condition.serialize_uri()
def test_serialize_deserialize_condition(self, vk_ilp): vk = VerifyingKey(vk_ilp['b58']) fulfillment = Ed25519Fulfillment(public_key=vk) condition = fulfillment.condition deserialized_condition = Condition.from_uri(condition.serialize_uri()) assert deserialized_condition.bitmask == condition.bitmask assert deserialized_condition.hash == condition.hash assert deserialized_condition.max_fulfillment_length == condition.max_fulfillment_length assert deserialized_condition.serialize_uri( ) == condition.serialize_uri()
def test_fulfillment_nested_and_or(self, fulfillment_sha256, fulfillment_ed25519, fulfillment_threshold_nested_and_or): ilp_fulfillment_sha = Fulfillment.from_uri( fulfillment_sha256['fulfillment_uri']) ilp_fulfillment_ed = Fulfillment.from_uri( fulfillment_ed25519['fulfillment_uri']) # 2-of-2 (AND with 2 inputs) fulfillment = ThresholdSha256Fulfillment(threshold=2) fulfillment.add_subfulfillment(ilp_fulfillment_sha) assert fulfillment.validate(MESSAGE) is False # 1-of-2 (OR with 2 inputs) nested_fulfillment = ThresholdSha256Fulfillment(threshold=1) nested_fulfillment.add_subfulfillment(ilp_fulfillment_ed) assert nested_fulfillment.validate(MESSAGE) is True nested_fulfillment.add_subfulfillment(ilp_fulfillment_ed) assert nested_fulfillment.validate(MESSAGE) is True fulfillment.add_subfulfillment(nested_fulfillment) assert fulfillment.validate(MESSAGE) is True fulfillment_uri = fulfillment.serialize_uri() assert fulfillment.condition_uri == fulfillment_threshold_nested_and_or[ 'condition_uri'] assert fulfillment_uri == fulfillment_threshold_nested_and_or[ 'fulfillment_uri'] print(fulfillment_uri) deserialized_fulfillment = Fulfillment.from_uri(fulfillment_uri) condition_uri = fulfillment.condition.serialize_uri() deserialized_condition = Condition.from_uri(condition_uri) assert isinstance(deserialized_fulfillment, ThresholdSha256Fulfillment) assert deserialized_fulfillment.threshold == 2 assert len(deserialized_fulfillment.subconditions) == 2 assert len(deserialized_fulfillment.subconditions[1] ['body'].subconditions) == 2 assert deserialized_fulfillment.serialize_uri() == fulfillment_uri assert deserialized_fulfillment.validate(MESSAGE) assert deserialized_condition.serialize_uri() == condition_uri vk = ilp_fulfillment_ed.public_key.encode(encoding='base58') assert len(fulfillment.get_subcondition_from_vk(vk)) == 2 assert len(deserialized_fulfillment.get_subcondition_from_vk(vk)) == 1
def test_fulfillment_nested( self, fulfillment_sha256, fulfillment_ed25519_2, ): ilp_fulfillment_sha = Fulfillment.from_uri( fulfillment_sha256['fulfillment_uri']) ilp_fulfillment_ed1 = Fulfillment.from_uri( fulfillment_ed25519_2['fulfillment_uri']) # 2-of-2 (AND with 2 inputs) fulfillment = ThresholdSha256Fulfillment(threshold=2) fulfillment.add_subfulfillment(ilp_fulfillment_sha) max_depth = 6 def add_nested_fulfillment(parent, current_depth=0): current_depth += 1 child = ThresholdSha256Fulfillment(threshold=1) if current_depth < max_depth: add_nested_fulfillment(child, current_depth) else: child.add_subfulfillment(ilp_fulfillment_ed1) parent.add_subfulfillment(child) return parent fulfillment = add_nested_fulfillment(fulfillment) assert fulfillment.validate(MESSAGE) is True assert len(fulfillment.subconditions) == 2 assert isinstance(fulfillment.subconditions[1]['body'], ThresholdSha256Fulfillment) assert isinstance( fulfillment.subconditions[1]['body'].subconditions[0]['body'], ThresholdSha256Fulfillment) fulfillment_uri = fulfillment.serialize_uri() deserialized_fulfillment = Fulfillment.from_uri(fulfillment_uri) condition_uri = fulfillment.condition.serialize_uri() deserialized_condition = Condition.from_uri(condition_uri) assert deserialized_fulfillment.serialize_uri() == fulfillment_uri assert deserialized_fulfillment.validate(MESSAGE) is True assert deserialized_condition.serialize_uri() == condition_uri
def test_fulfillment_nested_and_or(self, fulfillment_sha256, fulfillment_ed25519, fulfillment_threshold_nested_and_or): ilp_fulfillment_sha = Fulfillment.from_uri(fulfillment_sha256['fulfillment_uri']) ilp_fulfillment_ed = Fulfillment.from_uri(fulfillment_ed25519['fulfillment_uri']) # 2-of-2 (AND with 2 inputs) fulfillment = ThresholdSha256(threshold=2) fulfillment.add_subfulfillment(ilp_fulfillment_sha) assert fulfillment.validate(MESSAGE) is False # 1-of-2 (OR with 2 inputs) nested_fulfillment = ThresholdSha256(threshold=1) nested_fulfillment.add_subfulfillment(ilp_fulfillment_ed) assert nested_fulfillment.validate(MESSAGE) is True nested_fulfillment.add_subfulfillment(ilp_fulfillment_ed) assert nested_fulfillment.validate(MESSAGE) is True fulfillment.add_subfulfillment(nested_fulfillment) assert fulfillment.validate(MESSAGE) is True fulfillment_uri = fulfillment.serialize_uri() assert fulfillment.condition_uri == fulfillment_threshold_nested_and_or['condition_uri'] assert fulfillment_uri == fulfillment_threshold_nested_and_or['fulfillment_uri'] print(fulfillment_uri) deserialized_fulfillment = Fulfillment.from_uri(fulfillment_uri) condition_uri = fulfillment.condition.serialize_uri() deserialized_condition = Condition.from_uri(condition_uri) assert isinstance(deserialized_fulfillment, ThresholdSha256) assert deserialized_fulfillment.threshold == 2 assert len(deserialized_fulfillment.subconditions) == 2 assert len(deserialized_fulfillment.subconditions[1]['body'].subconditions) == 2 assert deserialized_fulfillment.serialize_uri() == fulfillment_uri assert deserialized_fulfillment.validate(MESSAGE) assert deserialized_condition.serialize_uri() == condition_uri vk = ilp_fulfillment_ed.public_key.encode(encoding='base58') assert len(fulfillment.get_subcondition_from_vk(vk)) == 2 assert len(deserialized_fulfillment.get_subcondition_from_vk(vk)) == 1
def test_fulfillment_nested(self, fulfillment_sha256, fulfillment_ed25519_2, ): ilp_fulfillment_sha = Fulfillment.from_uri(fulfillment_sha256['fulfillment_uri']) ilp_fulfillment_ed1 = Fulfillment.from_uri(fulfillment_ed25519_2['fulfillment_uri']) # 2-of-2 (AND with 2 inputs) fulfillment = ThresholdSha256(threshold=2) fulfillment.add_subfulfillment(ilp_fulfillment_sha) max_depth = 6 def add_nested_fulfillment(parent, current_depth=0): current_depth += 1 child = ThresholdSha256(threshold=1) if current_depth < max_depth: add_nested_fulfillment(child, current_depth) else: child.add_subfulfillment(ilp_fulfillment_ed1) parent.add_subfulfillment(child) return parent fulfillment = add_nested_fulfillment(fulfillment) assert fulfillment.validate(MESSAGE) is True assert len(fulfillment.subconditions) == 2 assert isinstance(fulfillment.subconditions[1]['body'], ThresholdSha256) assert isinstance(fulfillment.subconditions[1]['body'].subconditions[0]['body'], ThresholdSha256) fulfillment_uri = fulfillment.serialize_uri() deserialized_fulfillment = Fulfillment.from_uri(fulfillment_uri) condition_uri = fulfillment.condition.serialize_uri() deserialized_condition = Condition.from_uri(condition_uri) assert deserialized_fulfillment.serialize_uri() == fulfillment_uri assert deserialized_fulfillment.validate(MESSAGE) is True assert deserialized_condition.serialize_uri() == condition_uri
def test_deserialize_condition(self, fulfillment_sha256): example_condition = fulfillment_sha256['condition_uri'] condition = Condition.from_uri(example_condition) assert condition.serialize_uri() == fulfillment_sha256['condition_uri']