pycardano icon indicating copy to clipboard operation
pycardano copied to clipboard

Round trip plutus datum serialization/deserialization error

Open theeldermillenial opened this issue 1 year ago • 1 comments

Describe the bug When adding a script input to a transaction in the transaction builder, the datum is improperly serialized.

To Reproduce I will create a small working example later today, but the basic steps are:

  1. Create a custom plutus data class
  2. Create a datum, print the datum hash
  3. Create a transaction with the transaction builder, add a script input
  4. Build the transaction and serialize to cbor
  5. Deserialize the transaction, generate the hash of the datum in the witness set

Additional context: Generating the hash of the datum before serialization is correct.

Expected behavior Roundtrip serializing and deserializing of a transaction without mutations in the data.

Environment and software version (please complete the following information):

  • OS: Ubuntu
  • PyCardano Version 0.10.0 (also tried with latest on Github)

theeldermillenial avatar Mar 12 '24 13:03 theeldermillenial

I was able to recreate just by adding another test to test_transactions.py

def test_datum_witness():
    @dataclass
    class TestDatum(PlutusData):
        CONSTR_ID = 0
        a: int
        b: bytes

    tx_body = make_transaction_body()
    signed_tx = Transaction(
        tx_body, TransactionWitnessSet(plutus_data=[TestDatum(1, b"test")])
    )
    restored_tx = Transaction.from_cbor(signed_tx.to_cbor())
    assert signed_tx.to_cbor_hex() == restored_tx.to_cbor_hex()

Edit: Compare cbor instead of using the utility function that compares objects. Maybe that doesn't matter.

theeldermillenial avatar Mar 12 '24 20:03 theeldermillenial

Is there any fundamental difference between this and #311 ?

nielstron avatar Apr 11 '24 15:04 nielstron

Originally I wasn't sure, but now that I've looked into it I think they are the same. It all traces back to the decoder not properly distinguishing between definite/indefinite lists.

I think either of these could be closed, maybe copying over some of the info from one to the other.

In other news, I've been making progress on the cbor2 updates. Slowly but surely.

theeldermillenial avatar Apr 12 '24 21:04 theeldermillenial

Closing this issue due to duplication https://github.com/Python-Cardano/pycardano/issues/311

cffls avatar Apr 17 '24 03:04 cffls