Bitcoin architecture evolution — Satoshi era v0.1 vs modern v27+ baseline

Figures: Satoshi Nakamoto

What this page is

This page is L2 #9 — Architecture evolution (Satoshi era vs v27+) in the design-document series — the first of three cross-cutting deep dives. Where each L1 page examines one subsystem end-to-end with a brief “two-era comparison” section at the bottom, this page puts those comparisons side by side across all eight domains and adds the split-architecture diagrams that no single domain page can provide.

Scope. Every comparison uses two fixed reference points: Satoshi’s v0.1 release (January 3, 2009) and modern Bitcoin Core v27+ baseline. Intermediate versions are mentioned only when they introduced a structural change. The page does not cover design drift at the social or economic layer — those are analyzed in the design-intent vs current-reality entry. Each section below contains a split diagram (v0.1 left, v27+ right) and a comparison table, matching the L1 numbering.

1. System-wide architecture

The most visible change between v0.1 and v27+ is architectural decomposition. Satoshi shipped a single binary that fused the wallet, the miner, the GUI, the validation engine, and the network layer into one process backed by a single database. Modern Bitcoin Core separates these concerns into distinct modules, processes, and storage backends.

v27+ — modular

bitcoind

(node)

P2P network layer

Validation engine

Mempool

Storage layer

LevelDB

(UTXO set + block index)

Flat files

(blk*.dat / rev*.dat)

bitcoin-wallet

(logical separation;

experimental multiprocess)

SQLite

(descriptor wallet)

bitcoin-qt

(optional GUI)

External miner

(via getblocktemplate /

Stratum v2)

v0.1 — monolithic (January 2009)

Single binary

(bitcoin.exe)

Built-in GUI

(wxWidgets)

Built-in CPU miner

Validation + relay

Wallet (random keys)

Berkeley DB

(all state in one DB)

Aspectv0.1 (January 2009)v27+ baseline
BinarySingle executable: wallet + miner + GUI + nodebitcoind (node), bitcoin-wallet (wallet), bitcoin-qt (GUI) — separate binaries
Process modelOne process, one address spaceLogically separated; experimental multiprocess work in progress (not yet default)
DatabaseBerkeley DB for all persistent stateLevelDB (UTXO set, block index) + flat files (blocks) + SQLite (wallet)
MiningInternal CPU miner, same processExternal via getblocktemplate (BIP 22/23); Stratum v2 in ecosystem
InterfacesNone at launch; basic JSON-RPC added shortly afterJSON-RPC (full read/write), REST (read-only), ZMQ (push notifications)
Cryptography libraryOpenSSL (ECDSA/secp256k1); Crypto++ (SHA-256)libsecp256k1 (ECDSA/Schnorr), internal SHA-256 with hardware acceleration

2. Network layer

v27+ — network

DNS seed bootstrap

addr / addrv2

(IPv4, IPv6, Tor,

I2P, CJDNS)

Compact block relay

(BIP 152, ~20 kB)

Encrypted transport

(BIP 324, ChaCha20)

8 full-relay +

2 block-relay-only +

feeler + anchor

v0.1 — network

IRC bootstrap

(#bitcoin on lfnet.org)

addr messages

(IPv4 only)

Full block relay

(~1 MB per peer)

Plaintext TCP

8 outbound peers

Featurev0.1v27+ baselineKey BIP / version
Peer discoveryIRC channel + addrDNS seeds + addrv2 + peers.dat cacheBIP 155 (addrv2, v22)
Address typesIPv4 onlyIPv4, IPv6, Tor v3, I2P, CJDNSBIP 155
Outbound peers8 full-relay8 full-relay + 2 block-relay-only + feeler + anchorv19+ (block-relay-only)
Block relayFull block to every peer (~1–2 MB)Compact blocks: header + short IDs (~20 kB)BIP 152 (v0.13)
TransportPlaintext TCPOpportunistic encrypted transport (ChaCha20-Poly1305)BIP 324 (v26, default v27)
Initial syncSequential: one block at a timeHeaders-first: parallel block downloadv0.10
Eclipse resistanceMinimalOutbound rotation, diverse eviction, anchor peers, block-relay-only peersv19+

Detailed treatment: L1 #1 — P2P network design

3. Transaction layer

v27+ — transaction

SegWit format

(+ marker/flag +

witness field)

ECDSA + Schnorr

(libsecp256k1)

P2PKH, P2SH, P2WPKH,

P2WSH, P2TR

Signatures in witness

(Schnorr: 64 bytes fixed)

Non-malleable txid

(witness excluded)

v0.1 — transaction

Legacy format

(version + inputs +

outputs + locktime)

ECDSA only

(OpenSSL)

P2PK, P2PKH

Signatures in

scriptSig

(70–72 bytes DER)

Malleable txid

Featurev0.1v27+ baselineKey BIP / version
FormatLegacy: version + inputs + outputs + locktimeSegWit: + marker/flag + witnessBIP 141 (2017)
Transaction IDSHA-256d of full serialized transactiontxid excludes witness; wtxid includes itBIP 141
MalleabilityPossible — third parties can alter scriptSigFixed — witness excluded from txidBIP 141
Script typesP2PK, P2PKHP2PKH, P2SH, P2WPKH, P2WSH, P2TRBIP 16, 141, 341
Signature schemeECDSA via OpenSSLECDSA + Schnorr via libsecp256k1BIP 340 (2021)
OpcodesFull set (including later-disabled)Reduced set; tapscript re-enables selected opcodesBIP 342
TimelocksAbsolute locktime onlyAbsolute + relative (BIP 68) + script-level (OP_CLTV, OP_CSV)BIP 65, 68, 112, 113
Replace-by-FeeNot implemented; first-seenFull RBF defaultBIP 125 (v0.12 opt-in; v24 option added; v28 default)
Coin selectionSimple largest-firstBnB + knapsack + single-random-draw; waste metricv27+

Detailed treatment: L1 #2 — Transaction design

4. Block and chain layer

v27+ — block structure

80-byte header

(BIP 9 version-bits)

Primary Merkle tree +

witness commitment

(in coinbase OP_RETURN)

4 MWU weight limit

(~1.5–2 MB observed)

80,000 sigops/block

(weight-adjusted)

v0.1 — block structure

80-byte header

(version 1)

Single Merkle tree

(full serialized txs)

No explicit size limit

(1 MB added mid-2010)

20,000 sigops/block

Featurev0.1v27+ baselineKey BIP / version
Header format80 bytes, version 180 bytes, same structure; BIP 9 signaling bitsBIP 9
Block versionAlways 1Version-bits (0x20000000 base + signal bits)BIP 9 (2016)
Merkle treeSingle tree over full serialized transactionsPrimary tree (stripped txs) + witness commitment in coinbaseBIP 141
Size limitNo limit in v0.1; 1 MB added 20104 MWU weight limitBIP 141 (2017)
Witness discountDoes not existWitness bytes at 1/4 weight (1 WU vs 4 WU)BIP 141
Coinbase dataArbitrary up to 100 bytesBIP 34: block height prefix requiredBIP 34 (2013)
Sigop limit20,000 per block80,000 per block (weight-adjusted); tapscript counts differentlyBIP 141, 342

Detailed treatment: L1 #3 — Block and chain design

5. Consensus layer

v27+ — consensus

SHA-256d proof of work

(unchanged)

Same algorithm

(off-by-one preserved

as consensus rule)

Most-work chain

(hardened nChainWork)

BIP 9 versionbits /

BIP 8 Speedy Trial

assumevalid

(skip script verification

below trusted hash)

v0.1 — consensus

SHA-256d proof of work

Difficulty adjustment

(every 2,016 blocks,

off-by-one bug)

Most-work chain

(nChainWork)

Flag-day activation

(direct code change)

Hardcoded checkpoints

(anti-DoS)

Featurev0.1v27+ baselineKey BIP / version
Hash functionSHA-256d (double SHA-256)Same
Chain selectionMost-work chain (nChainWork)Same rule; persistent tracking hardened
Difficulty adjustmentEvery 2,016 blocks; off-by-one bugSame algorithm; bug preserved (fixing = hard fork)
Soft fork activationDirect code change (flag day)BIP 9 versionbits / BIP 8 Speedy TrialBIP 9, BIP 8
Script validationCombined scriptSig + scriptPubKey executionSeparated evaluation; SegWit witness programs; tapscriptBIP 141, 342
Timestamp ruleMust be > previous block timestampMedian-time-past (MTP): > median of previous 11 blocksBIP 113
CheckpointsHardcoded block hashesassumevalid replaces most checkpoint functionalityv0.14+

Detailed treatment: L1 #4 — Consensus design

6. Monetary and incentive layer

v27+ — monetary

3.125 BTC subsidy

(era 4, post-halving 2024)

Fee-rate auction

(sat/vB)

External miner via

getblocktemplate / Stratum v2

Fee-rate-sorted template

with SegWit weight accounting

v0.1 — monetary

50 BTC subsidy

(era 0)

Most transactions free

(priority by coin age)

Internal CPU miner

Trivial block template

Featurev0.1v27+ baselineKey BIP / version
Total supply cap20,999,999.9769 BTCSame — consensus-frozen constant
Subsidy calculationnSubsidy >>= (nHeight / 210000)Same arithmetic; zero-guard for shift ≥ 64
Fee behaviorMost transactions free; priority by coin ageFee-rate auction (sat/vB); coin-age priority removed
CPFPNot implementedAncestor-aware mempool; package evaluationv0.13+
Block templateInternal miner; trivial orderinggetblocktemplate (BIP 22/23); fee-rate sortedBIP 22, 23
Witness discountDoes not existWitness bytes at 1/4 weightBIP 141

Detailed treatment: L1 #5 — Monetary design

7. Cryptography layer

v27+ — cryptography

libsecp256k1

(constant-time, audited)

ECDSA + Schnorr

Compressed keys

(33 bytes);

x-only (32 bytes, Taproot)

DER (ECDSA) +

fixed 64-byte (Schnorr)

RFC 6979 deterministic

(ECDSA); BIP 340 synthetic

(Schnorr)

Base58Check + Bech32

(bc1q...) + Bech32m

(bc1p...)

HD derivation

(BIP 32/44/84/86);

descriptor wallets

v0.1 — cryptography

OpenSSL

(all operations)

ECDSA only

Uncompressed

public keys

(65 bytes)

DER encoding

(variable, 70–72 bytes)

OpenSSL PRNG

nonce generation

Base58Check

(P2PKH: 1...)

Random key pool

(non-deterministic)

Featurev0.1v27+ baselineKey BIP / version
Cryptography libraryOpenSSLlibsecp256k1 (constant-time, formally reviewed)v0.10 (2015)
Signature schemesECDSA onlyECDSA (legacy/SegWit v0) + Schnorr (Taproot)BIP 340 (2021)
Key formatUncompressed public keys (65 bytes)Compressed (33 bytes); x-only (32 bytes, Taproot)BIP 340
Signature malleabilityPossible — s value alterableLow-S rule (BIP 146) for ECDSA; Schnorr non-malleableBIP 146
Nonce generationOpenSSL PRNGRFC 6979 deterministic (ECDSA); BIP 340 synthetic (Schnorr)RFC 6979
Hash functionsSHA-256, SHA-256d, RIPEMD-160 via OpenSSLSame algorithms; internal with hardware acceleration (SHA-NI, ARMv8-A)
Sighash algorithmLegacy sighash (quadratic in inputs)BIP 143 (SegWit v0, linear) + BIP 341 (Taproot, epoch-tagged)BIP 143, 341

Detailed treatment: L1 #6 — Cryptography design

8. Storage layer

v27+ — storage

LevelDB (UTXO set +

block index) + flat files

(blocks + undo data)

Unspent outputs only

(outpoint-indexed)

Dedicated undo files

(rev*.dat for fast rollback)

Pruning (min 550 MiB) +

assumeUTXO bootstrap

v0.1 — storage

Berkeley DB

(all state in one DB)

Full transactions stored

(spent + unspent)

No undo data

(reorg = re-validate

from fork point)

No pruning

(store everything)

Featurev0.1v27+ baselineKey version
Primary databaseBerkeley DB (all state)LevelDB (UTXO set + block index); flat files (blocks)v0.8 (2013)
UTXO storageFull transactions with spent-flag vectorOnly unspent outputs; outpoint-indexed, compact serializationv0.8
Coins cacheNo separate cache; BDB handled reads/writesDedicated in-memory write-back cache (default 450 MiB)v0.15+
Block storageSingle BDB databaseSequential flat files (blk*.dat, ~128 MiB each)v0.8
Undo dataNot stored; reorg = re-validation from fork pointDedicated rev*.dat files for fast rollbackv0.8
PruningNot availableAvailable; minimum retention 550 MiBv0.11 (2015)
assumeUTXONot availableSnapshot-based bootstrap with background verificationv27+
Disk sizeNegligible (chain was tiny)~650+ GB archival; ~10 GB pruned; ~7 GB coins DB

Detailed treatment: L1 #7 — Storage design

9. Wallet and interface layer

v27+ — wallet

Logical separation

(experimental multiprocess)

Descriptor wallets

(deterministic derivation)

SQLite

(wallet.dat, new format)

One-time seed backup

(covers all derived keys)

Fee estimation +

RBF + PSBT workflow

v0.1 — wallet

Embedded in node binary

(no interface boundary)

Random key pool

(100 independent keys)

Berkeley DB

(wallet.dat)

Backup = export file

(new keys after backup

are unrecoverable)

No fee estimation

(transactions free)

Featurev0.1v27+ baselineKey BIP / version
ArchitectureEmbedded in single binaryLogically separated; experimental multiprocess in progress (not yet default)v27+
Key generationRandom key pool (100 independent keys)Descriptor wallets: deterministic from master seedBIP 380+ (default v23)
Key storageBerkeley DB (wallet.dat)SQLite (wallet.dat, new format)v26 (BDB deprecated for new wallets)
Backup modelExport file after every new keyDescriptor backup covers all derived keys (raw BIP 32 seed, not BIP 39)BIP 32 + descriptors
SigningInternal, same processInternal, PSBT (BIP 174/370), or hardware wallet via HWIBIP 174 (2018)
Multi-device signingNot supportedPSBT workflow: create → update → sign → combine → finalizeBIP 174, 370
Fee bumpingNot availableReplace-by-Fee (bumpfee), CPFPBIP 125
InterfacesNone at launch; basic JSON-RPC added shortly afterJSON-RPC (full), REST (read-only), ZMQ (push notifications)
Process modelMonolithic (wallet + node + miner + GUI)Modular binaries: bitcoind, bitcoin-wallet, bitcoin-qt; runtime process separation experimentalv27+

Detailed treatment: L1 #8 — Wallet design

10. Structural migration timeline

2009–2010v0.1 (Jan 2009)Monolithic binary, BDB,IRC, CPU miner,OpenSSL1 MB limit (Sep 2010)Block-size cap,opcodes disabled2012–2013v0.8 (Mar 2013)BDB → LevelDB, flatblock files, undo data2015–2017v0.10 (2015)Headers-first sync,libsecp256k1SegWit — BIP 141 (Aug2017)Witness field, 4 MWU,non-malleable txid2018–2021BIP 174 (2018)PSBT workflowTaproot — BIP 341(Nov 2021)Schnorr, tapscript,key/script-path2023–2025v26 (2023)BIP 324 encryptedtransport, BDBdeprecatedv27 baseline (2024)assumeUTXO snapshotsyncv28 (2024)full RBF defaultArchitectural milestones: v0.1 → v27+

11. What changed vs what did not

Fifteen years of development transformed the implementation, but the consensus-critical core remains exactly as Satoshi shipped it.

Unchanged since v0.1:

Transformed since v0.1:

  • storage engine (BDB → LevelDB + flat files + SQLite)
  • cryptography library (OpenSSL → libsecp256k1)
  • signature schemes (ECDSA only → ECDSA + Schnorr)
  • block capacity (no limit → 1 MB → 4 MWU)
  • transaction format (legacy → SegWit)
  • script system (full opcodes + concatenated execution → reduced set + separated evaluation + tapscript)
  • key management (random pool → HD derivation + descriptors)
  • peer transport (plaintext → encrypted)
  • peer discovery (IRC → DNS seeds + addrv2)
  • mining interface (internal CPU → external via getblocktemplate)
  • initial sync (sequential → headers-first + assumeUTXO)
  • fee market (free → fee-rate auction with RBF/CPFP)
  • process architecture (monolithic → modular)
  • soft fork activation (flag day → BIP 9/8)

12. Limits of this page

This page compares two reference points across all domains but does not replace the domain pages. For full treatment of any subsystem, see the L1 page linked at the bottom of each section above.

Out of scope: