Open GavinShox opened 6 years ago
Hi, sorry for the delayed answer, can you provide a minimal working example of the problem? I am not sure in which cases it appears.
When you serialize a SegWitTransaction object using python's pickle module, it works. But the problem is when you try to deserialize that pickled object, you get this exception:
Traceback (most recent call last):
File "C:/Users/gavin/PycharmProjects/Bit-Store/main.py", line 46, in <module>
tx = w.import_transaction(ex)
File "C:\Users\gavin\PycharmProjects\Bit-Store\lib\core\wallet.py", line 366, in import_transaction
txn = self.deserialize_transaction(txn_bytes)
File "C:\Users\gavin\PycharmProjects\Bit-Store\lib\core\wallet.py", line 307, in deserialize_transaction
obj = pickle.loads(txn_bytes)
File "C:\Users\gavin\AppData\Local\Programs\Python\Python36-32\lib\site-packages\btcpy\structs\transaction.py", line 744, in __getattr__
return getattr(self.transaction, item)
File "C:\Users\gavin\AppData\Local\Programs\Python\Python36-32\lib\site-packages\btcpy\structs\transaction.py", line 744, in __getattr__
return getattr(self.transaction, item)
File "C:\Users\gavin\AppData\Local\Programs\Python\Python36-32\lib\site-packages\btcpy\structs\transaction.py", line 744, in __getattr__
return getattr(self.transaction, item)
[Previous line repeated 328 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object
The issue is that pickle will actually attempt to get attributes from the SegWitTransaction object before self.transaction
is actaully an attribute of the object. So in __getattr__
, the function call getattr(self.transaction, item)
will just recursivly re-call __getattr__
because self.transaction isn't defined yet.
This allows SegWitTransaction to be pickled successfully. Before, when deserializing a SegWitTransaction object, pickle would throw a RecursionError as it would attempt to call getattr before self.transaction existed, which would cause it to infinitely recall getattr when it couldn't resolve self.transaction.