Reproducible Signed PSBTs #67
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
While developing tests for Embit's taproot miniscript capabilities in Krux, I noticed that final signed tap tree PSBTs could vary in content randomly, particularly when the same key was present in more than one leaf script. Investigating this with @jdlcdl, we found that the order of
taproot_script_path_sigscould change unpredictably when running Embit on standard python.Although these PSBTs would load and parse normally—both in coordinators and via bitcoin-cli—we wanted reproducible signed PSBTs for consistent tests and standardization across platforms.
Further investigation revealed that two variables within the
sign_withfunction in psbt.py—bip32_derivationsandderived_keypairs—were of typeset, which does not preserve order. This led to random ordering in the final PSBT data whenever thesesetvariables were read and written.By replacing these
setvariables withOrderedDict, we ensured a stable ordering. This change should resolve the variability and achieves reproducible signed PSBTs across both MicroPython devices and standard PCs.