Mandatory transaction re-extension exposes a reassignment regression: changing a frozen UTXO to a different owner updates its commitment but does not persist the replacement locking script. Re-extension retrieves the original script, so the new owner's signature fails. The original owner's signature passes that script but the recomputed commitment differs from the stored reassigned commitment. Neither owner can spend the output after maturity.
This affects the ownership-changing alert/confiscation and RPC flows on main after 3e26a5d2fad9e22cf2ea4f40ee4babf362ac5d28 and release/v0.15 after c7682127778565279fe51369194a88e4925dedd6. The existing v0.15.9-beta-1 tag points to 9272b80c9259d00fd51eb8f66ee658a46adb940a, before that release-branch merge.
Reproduction:
- Store and mine an output locked to Bob.
- Freeze it and call
ReAssignUTXO with a commitment to Charles's script.
- Advance beyond the reassignment maturity height.
- Submit a Charles-signed spend with the replacement script in its extended fields: script validation rejects it.
- Submit a Bob-signed spend: the store rejects it with
UTXO_MISMATCH.
Operator impact: successful reassign/alert processing does not establish spendability. Avoid ownership-changing reassignment until this is resolved. There is no documented, validated recovery procedure; do not assume that re-freezing and restoring the original commitment is portable. SQL freezing locates by outpoint without checking the supplied commitment, while Aerospike checks it.
Required follow-up:
- Provide an authoritative replacement-script source and validation support without trusting submitter-supplied extended fields.
- Restore new-owner spending after maturity and reject the old owner, with SQL and Aerospike end-to-end coverage.
- Define failure/Processed reporting and recovery for already-reassigned outputs.
- Resolve the maturity-setting discrepancy: SQL honors
utxostore_reassignedUtxoSpendableAfterBlocks, while Aerospike currently uses the fixed 1,000-block constant.
- Add verified operator guidance and release notes when support is restored.
The SQLite smoke test in #1721 (backport #1722) documents and pins the current limitation. Its same-owner reassignment is a control for maturity, not proof that ownership-changing confiscation works. Those PRs remain tests/documentation only.
Mandatory transaction re-extension exposes a reassignment regression: changing a frozen UTXO to a different owner updates its commitment but does not persist the replacement locking script. Re-extension retrieves the original script, so the new owner's signature fails. The original owner's signature passes that script but the recomputed commitment differs from the stored reassigned commitment. Neither owner can spend the output after maturity.
This affects the ownership-changing alert/confiscation and RPC flows on main after
3e26a5d2fad9e22cf2ea4f40ee4babf362ac5d28and release/v0.15 afterc7682127778565279fe51369194a88e4925dedd6. The existingv0.15.9-beta-1tag points to9272b80c9259d00fd51eb8f66ee658a46adb940a, before that release-branch merge.Reproduction:
ReAssignUTXOwith a commitment to Charles's script.UTXO_MISMATCH.Operator impact: successful
reassign/alert processing does not establish spendability. Avoid ownership-changing reassignment until this is resolved. There is no documented, validated recovery procedure; do not assume that re-freezing and restoring the original commitment is portable. SQL freezing locates by outpoint without checking the supplied commitment, while Aerospike checks it.Required follow-up:
utxostore_reassignedUtxoSpendableAfterBlocks, while Aerospike currently uses the fixed 1,000-block constant.The SQLite smoke test in #1721 (backport #1722) documents and pins the current limitation. Its same-owner reassignment is a control for maturity, not proof that ownership-changing confiscation works. Those PRs remain tests/documentation only.