def test_muiltiple_in_mix_own_multiple_out_single_own_transfer( b, user_pk, user_sk): from bigchaindb.models import Transaction from bigchaindb.common.transaction import _fulfillment_to_details # CREATE divisible asset tx_create = Transaction.create([b.me], [([user_pk], 50), ([user_pk, b.me], 50)]) tx_create_signed = tx_create.sign([b.me_private]) # create block block = b.create_block([tx_create_signed]) assert block.validate(b) == block b.write_block(block) # vote vote = b.vote(block.id, b.get_last_voted_block().id, True) b.write_vote(vote) # TRANSFER tx_transfer = Transaction.transfer(tx_create.to_inputs(), [([b.me], 100)], asset_id=tx_create.id) tx_transfer_signed = tx_transfer.sign([b.me_private, user_sk]) assert tx_transfer_signed.validate(b) == tx_transfer_signed assert len(tx_transfer_signed.outputs) == 1 assert tx_transfer_signed.outputs[0].amount == 100 assert len(tx_transfer_signed.inputs) == 2 ffill_fid0 = _fulfillment_to_details( tx_transfer_signed.inputs[0].fulfillment) ffill_fid1 = _fulfillment_to_details( tx_transfer_signed.inputs[1].fulfillment) assert 'subconditions' not in ffill_fid0 assert 'subconditions' in ffill_fid1 assert len(ffill_fid1['subconditions']) == 2
def test_muiltiple_in_mix_own_multiple_out_single_own_transfer(alice, b, user_pk, user_sk): from bigchaindb.models import Transaction from bigchaindb.common.transaction import _fulfillment_to_details # CREATE divisible asset tx_create = Transaction.create([alice.public_key], [([user_pk], 50), ([user_pk, alice.public_key], 50)], asset={'name': random.random()}) tx_create_signed = tx_create.sign([alice.private_key]) # TRANSFER tx_transfer = Transaction.transfer(tx_create.to_inputs(), [([alice.public_key], 100)], asset_id=tx_create.id) tx_transfer_signed = tx_transfer.sign([alice.private_key, user_sk]) b.store_bulk_transactions([tx_create_signed]) assert tx_transfer_signed.validate(b) == tx_transfer_signed assert len(tx_transfer_signed.outputs) == 1 assert tx_transfer_signed.outputs[0].amount == 100 assert len(tx_transfer_signed.inputs) == 2 ffill_fid0 = _fulfillment_to_details(tx_transfer_signed.inputs[0].fulfillment) ffill_fid1 = _fulfillment_to_details(tx_transfer_signed.inputs[1].fulfillment) assert 'subconditions' not in ffill_fid0 assert 'subconditions' in ffill_fid1 assert len(ffill_fid1['subconditions']) == 2 b.store_bulk_transactions([tx_transfer_signed]) with pytest.raises(DoubleSpend): tx_transfer_signed.validate(b)
def test_muiltiple_in_mix_own_multiple_out_mix_own_transfer(b, user_pk, user_sk): from bigchaindb.models import Transaction from bigchaindb.common.transaction import _fulfillment_to_details # CREATE divisible asset tx_create = Transaction.create([b.me], [([user_pk], 50), ([user_pk, b.me], 50)], asset={'name': random.random()}) tx_create_signed = tx_create.sign([b.me_private]) # TRANSFER tx_transfer = Transaction.transfer(tx_create.to_inputs(), [([b.me], 50), ([b.me, user_pk], 50)], asset_id=tx_create.id) tx_transfer_signed = tx_transfer.sign([b.me_private, user_sk]) b.store_bulk_transactions([tx_create_signed, tx_transfer_signed]) assert tx_transfer_signed.validate(b) == tx_transfer_signed assert len(tx_transfer_signed.outputs) == 2 assert tx_transfer_signed.outputs[0].amount == 50 assert tx_transfer_signed.outputs[1].amount == 50 assert len(tx_transfer_signed.inputs) == 2 cond_cid0 = tx_transfer_signed.outputs[0].to_dict() cond_cid1 = tx_transfer_signed.outputs[1].to_dict() assert 'subconditions' not in cond_cid0['condition']['details'] assert 'subconditions' in cond_cid1['condition']['details'] assert len(cond_cid1['condition']['details']['subconditions']) == 2 ffill_fid0 = _fulfillment_to_details(tx_transfer_signed.inputs[0].fulfillment) ffill_fid1 = _fulfillment_to_details(tx_transfer_signed.inputs[1].fulfillment) assert 'subconditions' not in ffill_fid0 assert 'subconditions' in ffill_fid1 assert len(ffill_fid1['subconditions']) == 2
def test_unsupported_condition_type(): from bigchaindb.common import transaction from cryptoconditions.exceptions import UnsupportedTypeError with pytest.raises(UnsupportedTypeError): transaction._fulfillment_from_details({'type': 'a'}) with pytest.raises(UnsupportedTypeError): transaction._fulfillment_to_details(MagicMock(type_name='a'))
def test_single_in_multiple_own_single_out_single_own_transfer(b, user_pk, user_sk): from bigchaindb.models import Transaction from bigchaindb.common.transaction import _fulfillment_to_details # CREATE divisible asset tx_create = Transaction.create([b.me], [([b.me, user_pk], 100)], asset={'name': random.random()}) tx_create_signed = tx_create.sign([b.me_private]) # TRANSFER tx_transfer = Transaction.transfer(tx_create.to_inputs(), [([b.me], 100)], asset_id=tx_create.id) tx_transfer_signed = tx_transfer.sign([b.me_private, user_sk]) b.store_bulk_transactions([tx_create_signed, tx_transfer_signed]) assert tx_transfer_signed.validate(b) == tx_transfer_signed assert len(tx_transfer_signed.outputs) == 1 assert tx_transfer_signed.outputs[0].amount == 100 assert len(tx_transfer_signed.inputs) == 1 ffill = _fulfillment_to_details(tx_transfer_signed.inputs[0].fulfillment) assert 'subconditions' in ffill assert len(ffill['subconditions']) == 2
def make_ed25519_condition(public_key, *, amount=1): ed25519 = Ed25519Sha256(public_key=base58.b58decode(public_key)) return { 'amount': str(amount), 'condition': { 'details': _fulfillment_to_details(ed25519), 'uri': ed25519.condition_uri, }, 'public_keys': (public_key, ), }
def persisted_transfer_carol_car_to_dimi(carol_keypair, dimi_pubkey, transactions_api_full_url, persisted_carol_car_transaction): output_txid = persisted_carol_car_transaction['id'] ed25519_dimi = Ed25519Sha256(public_key=base58.b58decode(dimi_pubkey)) transaction = { 'asset': { 'id': output_txid }, 'metadata': None, 'operation': 'TRANSFER', 'outputs': ({ 'amount': '1', 'condition': { 'details': _fulfillment_to_details(ed25519_dimi), 'uri': ed25519_dimi.condition_uri, }, 'public_keys': (dimi_pubkey, ), }, ), 'inputs': ({ 'fulfillment': None, 'fulfills': { 'output_index': 0, 'transaction_id': output_txid, }, 'owners_before': (carol_keypair.public_key, ), }, ), 'version': '1.0', 'id': None, } serialized_transaction = json.dumps( transaction, sort_keys=True, separators=(',', ':'), ensure_ascii=False, ) serialized_transaction = sha3_256(serialized_transaction.encode()) if transaction['inputs'][0]['fulfills']: serialized_transaction.update('{}{}'.format( transaction['inputs'][0]['fulfills']['transaction_id'], transaction['inputs'][0]['fulfills']['output_index']).encode()) ed25519_carol = Ed25519Sha256( public_key=base58.b58decode(carol_keypair.public_key)) ed25519_carol.sign(serialized_transaction.digest(), base58.b58decode(carol_keypair.private_key)) transaction['inputs'][0]['fulfillment'] = ed25519_carol.serialize_uri() set_transaction_id(transaction) response = requests.post(transactions_api_full_url, json=transaction) return response.json()
def test_single_in_multiple_own_single_out_single_own_create(alice, b, user_pk, user_sk): from bigchaindb.models import Transaction from bigchaindb.common.transaction import _fulfillment_to_details tx = Transaction.create([alice.public_key, user_pk], [([user_pk], 100)], asset={'name': random.random()}) tx_signed = tx.sign([alice.private_key, user_sk]) assert tx_signed.validate(b) == tx_signed assert len(tx_signed.outputs) == 1 assert tx_signed.outputs[0].amount == 100 assert len(tx_signed.inputs) == 1 ffill = _fulfillment_to_details(tx_signed.inputs[0].fulfillment) assert 'subconditions' in ffill assert len(ffill['subconditions']) == 2