Round trip plutus datum serialization/deserialization error
theeldermillenial opened this issue · 4 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:
- Create a custom plutus data class
- Create a datum, print the datum hash
- Create a transaction with the transaction builder, add a script input
- Build the transaction and serialize to cbor
- 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)
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.
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.