* extended validate_asset_id

* added asset & web test cases (abci and non-abic)

Signed-off-by: Jürgen Eckel <juergen@riddleandcode.com>
This commit is contained in:
Jürgen Eckel 2023-01-26 00:16:07 +01:00
parent 59e6befbfb
commit 0e79bbecca
No known key found for this signature in database
3 changed files with 47 additions and 24 deletions

View File

@ -462,12 +462,18 @@ class Planetmint(object):
if not tx.inputs_valid(input_conditions_converted): if not tx.inputs_valid(input_conditions_converted):
raise InvalidSignature("Transaction signature is invalid.") raise InvalidSignature("Transaction signature is invalid.")
def validate_asset_id(self, tx, input_txs): def validate_asset_id(self, tx: Transaction, input_txs:list):
# validate asset id # validate asset
asset_id = tx.get_asset_id(input_txs) if tx.operation != Transaction.COMPOSE:
if asset_id != Transaction.read_out_asset_id(tx): asset_id = tx.get_asset_id(input_txs)
raise AssetIdMismatch(("The asset id of the input does not" " match the asset id of the" " transaction")) if asset_id != Transaction.read_out_asset_id(tx):
raise AssetIdMismatch(("The asset id of the input does not" " match the asset id of the" " transaction"))
else:
asset_ids = Transaction.get_asset_ids( input_txs )
if Transaction.read_out_asset_id(tx) in asset_ids:
raise AssetIdMismatch(("The asset ID of the compose must be different to all of its input asset IDs"))
def validate_inputs_distinct(self, tx): def validate_inputs_distinct(self, tx):
# Validate that all inputs are distinct # Validate that all inputs are distinct
links = [i.fulfills.to_uri() for i in tx.inputs] links = [i.fulfills.to_uri() for i in tx.inputs]

View File

@ -68,6 +68,17 @@ def test_asset_id_mismatch(alice, user_pk):
with pytest.raises(AssetIdMismatch): with pytest.raises(AssetIdMismatch):
Transaction.get_asset_id([tx1, tx2]) Transaction.get_asset_id([tx1, tx2])
def test_compose_valid_transactions(b, user_pk, user_sk, alice, signed_create_tx, _bdb):
from transactions.types.assets.compose import Compose
validated = b.validate_transaction(signed_create_tx)
b.store_bulk_transactions([validated])
inputs = signed_create_tx.to_inputs()
assets = [signed_create_tx.id, "QmW5GVMW98D3mktSDfWHS8nX2UiCd8gP1uCiujnFX4yK8n"]
compose_transaction = Compose.generate(inputs=inputs, recipients=[([user_pk], 1)], assets=assets)
compose_transaction.sign([user_sk])
assert b.validate_transaction( compose_transaction)
def test_create_valid_divisible_asset(b, user_pk, user_sk, _bdb): def test_create_valid_divisible_asset(b, user_pk, user_sk, _bdb):
tx = Create.generate([user_pk], [([user_pk], 2)]) tx = Create.generate([user_pk], [([user_pk], 2)])

View File

@ -473,37 +473,43 @@ def test_post_transaction_invalid_mode(client):
assert "400 BAD REQUEST" in response.status assert "400 BAD REQUEST" in response.status
assert 'Mode must be "async", "sync" or "commit"' == json.loads(response.data.decode("utf8"))["message"]["mode"] assert 'Mode must be "async", "sync" or "commit"' == json.loads(response.data.decode("utf8"))["message"]["mode"]
def test_post_transaction_compose_valid_wo_abci(b, _bdb):
alice = generate_key_pair()
tx = Create.generate([alice.public_key], [([alice.public_key], 1)], assets=[{"data":"QmW5GVMW98D3mktSDfWHS8nX2UiCd8gP1uCiujnFX4yK97"}]).sign([alice.private_key])
validated = b.validate_transaction(tx)
b.store_bulk_transactions([validated])
tx_obj = tx
tx = tx.to_dict()
compose_asset_cid = "bafkreignwcoye67vn6edp23mj4llhpzzkgyuefu7xesjzjxcv2bz3p4nfm"
inputs_ = tx_obj.to_inputs()
assets_ = [ tx["id"], compose_asset_cid]
compose_transaction = Compose.generate(inputs=inputs_, recipients=[([alice.public_key], 1)], assets=assets_)
signed_compose_tx = compose_transaction.sign( [alice.private_key])
compose_dict = signed_compose_tx.to_dict()
compose_obj = Transaction.from_dict( compose_dict)
validated_compose = b.validate_transaction(compose_obj)
b.store_bulk_transactions([validated_compose])
@pytest.mark.abci @pytest.mark.abci
def test_post_transaction_compose_valid( client): def test_post_transaction_compose_valid(client,b):
mode = ("?mode=commit", BROADCAST_TX_COMMIT) mode = ("?mode=commit", BROADCAST_TX_COMMIT)
alice = generate_key_pair() alice = generate_key_pair()
tx = Create.generate([alice.public_key], [([alice.public_key], 1)], assets=[{"data":"QmW5GVMW98D3mktSDfWHS8nX2UiCd8gP1uCiujnFX4yK97"}]).sign([alice.private_key]) tx = Create.generate([alice.public_key], [([alice.public_key], 1)], assets=[{"data":"QmW5GVMW98D3mktSDfWHS8nX2UiCd8gP1uCiujnFX4yK97"}]).sign([alice.private_key])
mode_endpoint = TX_ENDPOINT + mode[0] mode_endpoint = TX_ENDPOINT + mode[0]
response = client.post(mode_endpoint, data=json.dumps(tx.to_dict())) response = client.post(mode_endpoint, data=json.dumps(tx.to_dict()))
assert "202 ACCEPTED" in response.status assert "202 ACCEPTED" in response.status
tx_obj = tx
tx = tx.to_dict() tx = tx.to_dict()
compose_asset_cid = "bafkreignwcoye67vn6edp23mj4llhpzzkgyuefu7xesjzjxcv2bz3p4nfm"
inputs_ = tx_obj.to_inputs()
compose_asset_cid = "QmW5GVMW98D3mktSDfWHS8nX2UiCd8gP1uCiujnFX4yK8n"
condition_index = 0
condition = tx["outputs"][condition_index]
inputs_ = [
Input(
_fulfillment_from_details(condition["condition"]["details"]),
condition["public_keys"],
fulfills=TransactionLink(
txid=tx["id"],
output=condition_index,
),
)
]
assets_ = [ tx["id"], compose_asset_cid] assets_ = [ tx["id"], compose_asset_cid]
compose_transaction = Compose.generate(inputs=inputs_, recipients=[([alice.public_key], 1)], assets=assets_) compose_transaction = Compose.generate(inputs=inputs_, recipients=[([alice.public_key], 1)], assets=assets_)
signed_tx = compose_transaction.sign( [alice.private_key]) signed_tx = compose_transaction.sign( [alice.private_key])
validated_compose = b.validate_transaction(signed_tx)
mode_endpoint = TX_ENDPOINT + "?mode=commit" mode_endpoint = TX_ENDPOINT + "?mode=commit"
response = client.post(mode_endpoint, data=json.dumps(signed_tx.to_dict())) response = client.post(mode_endpoint, data=json.dumps(signed_tx.to_dict()))
assert "202 ACCEPTED" in response.status assert "202 ACCEPTED" in response.status