Experiment reports / Offline fixture

Unsigned, signed, finalized: three different states

Inspect what is present at each PSBT stage without mistaking a signature field for a validated transaction.

Published by HabibitcoinFixture generated: 2026-09-11T22:33:24ZMethod: automated byte and node checksNative SegWit / PSBT v0

Recorded fixture result

Observed inspection state: missing-signatures

  • MISSING_SIGNATURES

    No partial signatures or final unlocking fields are present; script requirements were not evaluated.

  • TIMELOCK_UNCHECKED

    Locktime/sequence constraints are present. Chain height, median time, and input ages were not checked.

  • NOT_VALIDATED

    Parsing and metadata inspection only: no signature/script verification, finalizability decision, UTXO-set check, or mempool test.

Independent Bitcoin Core check

Verified 2026-09-11T23:08:08.502Z with Bitcoin Core daemon version v29.0.0 on a fresh, isolated regtest chain. Core signed and finalized a separate funded Workshop split, then accepted it in testmempoolaccept. The Workshop spend was not broadcast. This is local regtest evidence, not a confirmed Signet transaction.

The checks also compare PSBT and raw decoding with Core, preserve an unknown fee when UTXO metadata is absent, and confirm that an overspend fails with bad-txns-in-belowout. This does not establish acceptance for every fixture or script type.

Verification results and software hashes · Exact PSBTs, funding transaction, and Core responses

Start with the unsigned PSBT

This fixture includes the previous-output information needed for the native SegWit example but no signatures. Its recipient amounts and fee are inspectable. Its unsigned transaction bytes are shorter than the eventual witness-bearing transaction, so the unsigned virtual size is not an honest final fee-rate denominator.

Signatures are data, not a verdict

A partial signature field tells an inspector that signature material is present. It does not by itself prove that the signature authorizes this transaction, that all script conditions are met, or that the input is unspent. The Doctor labels signature presence separately from validation.

Finalization assembles unlocking data

A finalizer constructs final scriptSig and witness fields from the available data. When those fields are present, their serialized weight can be measured. Transaction Doctor can expose that measurement, but intentionally does not call the transaction valid or broadcastable on the strength of field presence alone.

The next checks happen elsewhere

Review recipients and fee in the signing wallet. Use a default-Signet node for testmempoolaccept before broadcasting a real signed transaction. Node policy acceptance, propagation, and confirmation are different events. A passing parse cannot substitute for any of them.

How to reproduce

The Doctor's prepared examples cover missing UTXO data, complete unsigned data, partial signatures, finalized data, and raw transaction bytes. These are deterministic offline artifacts. Select each stage and compare the input rows, findings, and the explicit size label.

Compare the same transaction at each stage

FixtureObserved statusSerialized vB
Previous output suppliedmissing-signatures82
Signature presentsignatures-present82
Final witness fieldsfinal-fields-present110
Extracted raw transactionraw-unverified110

For the first two rows, serialized vB describes only the unsigned transaction. The finalized rows include witness data. Raw transaction bytes alone do not contain input amounts, so their fee is unknown without previous-output metadata.

Reproduction artifact

The full collection includes the options, transactions, and expected inspection output. The public source bundle contains the build script and automated checks used to regenerate it.

Download fixture JSON Open this example

Inspect the PSBT bytes
cHNidP8BAFICAAAAARERERERERERERERERERERERERERERERERERERERERERAAAAAAD9////ARwlAAAAAAAAFgAUKioqKioqKioqKioqKioqKioqKiqQ0AMAAAEBHxAnAAAAAAAAFgAUdR526BmRltRUlBxF0bOjI/FDO9YAAA==

Specifications and implementation

BIP 174: PSBT roles and format; BIP 141: transaction weight; Bitcoin Core v30.0 dust policy; bitcoinjs-lib implementation.