Bitcoin Core Architecture
Mempool Graph Topology and the Ancestor Feerate Model
The Bitcoin mempool represents the distributed holding area for valid, unconfirmed transactions awaiting inclusion into the blockchain consensus ledger 1. Formally, the memory pool operates as a directed acyclic graph (DAG), denoted as 2. In this formulation, the vertex set corresponds to valid transactions admitted under standard node validation rules, and the directed edge set represents unspent transaction output (UTXO) spending dependencies 2. When an unconfirmed transaction spends an outpoint created by another unconfirmed transaction , a directed edge is instantiated, defining as the parent (ancestor) and as the child (descendant) 1.
Topological ordering is a consensus invariant: no child transaction can appear in a block prior to its parent 1. Therefore, candidate transaction selection by mining nodes cannot be executed as a naive, one-dimensional greedy knapsack optimization over individual transaction feerates 1. The economic viability of confirming any given transaction is structurally coupled to the ancestor transactions that precede it 1.
To account for these multi-transaction dependencies, Bitcoin Core historically implemented ancestor and descendant tracking within CTxMemPoolEntry objects 3. For any transaction , its ancestor set comprises along with the transitive closure of all unconfirmed parents 1:
The aggregate virtual size and cumulative modified fees establish the transaction’s Ancestor Feerate 1:
To prevent high-feerate parent transactions from being artificially downgraded by low-feerate descendants during block construction, Bitcoin Core evaluates mining candidates using the ancestor score , where denotes the individual transaction feerate 1. This mathematical model enables Child-Pays-For-Parent (CPFP) fee bumping: a high-feerate child compensates miners for the block space occupied by its low-feerate unconfirmed ancestors 1. For instance, given a parent transaction of paying () and a child transaction of paying (), the ancestor feerate of the package evaluates to 1:
Under this valuation, an ancestor-aware block assembler mines the package atomically, capturing a combined yield that exceeds the parent’s individual feerate 1.
Despite its utility, the legacy ancestor tracking architecture suffers from severe structural limitations 2. Graph mutations (such as insertions, evictions, or block confirmations) require recursive tree traversals to update cached ancestor and descendant counters across connected subgraphs 3. Furthermore, an algorithmic asymmetry exists between block template assembly and mempool eviction 1. While mining assembly prioritizes candidate subgraphs by descending ancestor feerate (), eviction under memory exhaustion drops subgraphs by ascending descendant feerate () 1:
Because ancestor feerate and descendant feerate can rank identical transaction clusters in contradictory orders, transactions prioritized for block inclusion can simultaneously become targets for eviction during fee spikes, creating economic instability and complex pinning vulnerabilities 1.
Cluster Mempool Theory and Linearization Algorithms
The Cluster Mempool framework replaces monolithic DAG traversal with modular decomposition, partitioning the global mempool graph into disjoint, connected components termed “clusters” 2. Formally, a cluster is an isolated subgraph such that no vertex shares an unconfirmed dependency edge with any vertex 2. The fundamental objective of the cluster mempool architecture is to compute, cache, and update an optimal linearization for each independent cluster 2.
A linearization is a permutation of all vertices in cluster that respects topological ordering: if , then 2. A linearization strictly dominates () if its feerate diagram is superior across all prefix sizes 4. The feerate diagram is the convex upper curve formed by plotting cumulative virtual size against cumulative fees across all ordered prefixes of 4. An optimal linearization maximizes this curve, guaranteeing that selecting the first virtual bytes from the cluster yields the maximal achievable fee revenue for any topologically valid subset of equivalent size 4.
From an optimal linearization , the cluster is partitioned in linear time into a series of disjoint, contiguous sub-sequences termed “chunks” 2. Each chunk represents a maximal-feerate prefix of the remaining sequence 2. By mathematical definition, the chunk feerates within a cluster exhibit strict monotonic decay 2:
Computing optimal linearizations on arbitrary directed graphs is equivalent to the maximum-weight closure problem under precedence constraints, which is NP-hard 4. Cluster Mempool overcomes this computational barrier through a multi-tiered optimization engine:
- Size and Complexity Bounds: Node policy enforces strict limits on cluster size and topological complexity, preventing state-space explosions during real-time network validation loops 2.
- Branch-and-Bound Linearization: For small cluster topologies, an exhaustive branch-and-bound search evaluates all valid topological permutations to identify the provably optimal sequence 4.
- Parametric Max-Flow / Min-Cut Network Optimization: For complex topologies, optimization is mapped to a parametric flow network using the Picard-Ratcliff theorem 4. Given a target feerate parameter , transactions are mapped to flow network vertices with source capacities and sink capacities , with infinite capacity assigned to topological dependency edges 4. Applying push-relabel max-flow algorithms (such as the Goldberg-Tarjan framework) extracts minimum cuts that correspond directly to optimal prefix subsets at parameter 4.
- Post-Linearization Optimizations: Heuristic post-processing passes, including Linearization Merge Optimization (LIMO) and ancestor sort approximations, iteratively refine candidate sequences 4.
By pre-linearizing clusters into statically chunked sequences, Cluster Mempool establishes complete symmetry between block production and mempool eviction 1. Block construction iterates across all clusters by selecting the highest-feerate available chunks, while mempool eviction pops the lowest-feerate chunks from the tail of the globally merged chunk index 1. Furthermore, fee estimation models transition from tracking individual transaction confirmations to tracking chunk-level mining scores, eliminating distortion caused by unconfirmed parent-child dependencies 1.
| Architectural Attribute | Legacy Mempool Framework | Cluster Mempool Framework |
|---|---|---|
| Graph Representation | Monolithic DAG with dynamic ancestor/descendant sets per entry 3. | Disjoint topological clusters () with static linearizations 2. |
| Block Assembly Metric | Ancestor Score: calculated per candidate iteration 1. | Monotonic Chunk Feerate: derived directly from cluster linearizations 2. |
| Mempool Eviction Metric | Descendant Feerate: 1. | Lowest Chunk Feerate (symmetrically aligned with block assembly) 1. |
| Algorithmic Consistency | Asymmetric: mining prioritizes high , eviction drops low 1. | Symmetric: unified chunk index drives both block production and eviction 1. |
| Graph Mutation Cost | recursive tree traversals updating cached scores across ancestry 3. | Bounded re-linearization local to the mutated cluster component 2. |
| Fee Estimation Unit | Individual transaction feerate upon confirmation (ignores CPFP dependencies) 1. | Linearized chunk mining scores, capturing true package economic priority 1. |
Anti-Pinning Policies, TRUC Transactions, and Package Relay Architecture
Standard mempool policy governs the boundary between unconfirmed peer-to-peer transaction propagation and consensus block production 3. In multi-party contract protocols, such as the Lightning Network, channel state transitions depend on the timely confirmation of pre-signed commitment transactions to enforce unilateral closes and resolve Hash Time Locked Contracts (HTLCs) before safety timeouts expire 5. In these adversarial environments, standard relay policies can be weaponized through transaction pinning, where an attacker exploits mempool acceptance rules to prevent a time-sensitive transaction from confirming 5.
Historically, unconfirmed replacements have been regulated by BIP 125 Opt-In Replace-By-Fee (RBF) 5. Under BIP 125, an incoming replacement transaction must pay an absolute fee greater than or equal to the aggregate sum of all transactions it would evict (Rule 3), and it cannot cause more than 100 existing transactions to be evicted from the mempool (Rule 5) 5. An adversary can exploit these rules by attaching a low-feerate, maximum-weight tree of descendants (up to the standard limit of 25 transactions and ) to a shared commitment transaction 5. To replace this pinned package, the honest party is forced by Rule 3 to pay exorbitant absolute fees to offset the adversary’s large descendant chain, or is blocked entirely by Rule 5 if the descendant count threshold is saturated 5.
To eliminate structural pinning vectors, BIP 431 introduces Topologically Restricted Until Confirmation (TRUC) transactions, designated via version 3 transaction signaling (nVersion = 3) 5. TRUC enforces strict structural invariants on unconfirmed transaction subgraphs within the mempool:
- The virtual size of an individual v3 transaction cannot exceed 5.
- An unconfirmed v3 transaction can have at most one unconfirmed parent transaction, and that parent must also be a v3 transaction 5.
- An unconfirmed v3 transaction can have at most one unconfirmed child transaction (enforcing a strict 1-Parent-1-Child, or 1P1C, topology) 5.
- The virtual size of the unconfirmed v3 child transaction cannot exceed 5.
- Non-v3 transactions cannot spend unconfirmed outputs of v3 transactions, preventing third parties from expanding the cluster topology 5.
By restricting the unconfirmed topology to a maximum of two transactions with an aggregate virtual size cap of , TRUC renders BIP 125 Rule 3 and Rule 5 pinning attacks mathematically impossible 5.
TRUC transactions operate alongside Pay-to-Anchor (P2A) outputs (OP_1 <0x4e73>), which establish standard, ephemeral anchor outputs 5. P2A outputs can be spent by any party without signature requirements, allowing Layer 2 implementations to deploy zero-fee commitment transactions that are dynamically fee-bumped at broadcast time via compact 1P1C child packages 5.
To propagate zero-fee or sub-relay-fee parent transactions that depend entirely on high-fee child packages, the peer-to-peer network implements BIP 331 Ancestor Package Relay 6. BIP 331 replaces isolated transaction broadcasts with package negotiation messages (sendpackages, pkgtxns, ancpkginfo) 6. When a node receives a child transaction referencing an unknown parent outpoint, it queries the peer for the ancestor package rather than dropping the transaction as an orphan 6. The validation engine processes the package atomically using ProcessNewPackage and AcceptPackage, verifying that the aggregate package feerate meets standard mempool admission criteria 6:
This mechanism ensures that transactions below individual dynamic relay thresholds can safely enter the mempool DAG if the net package feerate satisfies standard eviction and relay policies 6.
| Policy Dimension | Standard Mempool Policy (v1/v2) | BIP 431 TRUC Policy (v3) | BIP 331 Package Relay |
|---|---|---|---|
| Max Ancestor Count | 25 unconfirmed transactions 3. | 1 unconfirmed parent (1P1C only) 5. | Evaluated over package cluster (typically 1P1C) 6. |
| Max Descendant Count | 25 unconfirmed transactions 3. | 1 unconfirmed child (1P1C only) 5. | Evaluated over package cluster (typically 1P1C) 6. |
| Package Virtual Size Limit | Up to aggregate ancestry 3. | Parent , Child 5. | Bounded by package submission parameters 6. |
| Replacement Dynamics | Vulnerable to descendant bloat via BIP 125 Rules 3 & 5 5. | Anti-pinning design: bounded size permits direct 1P1C replacement 5. | Package-aware replacement evaluation across DAG 6. |
| P2P Relay Primitives | Single inv/tx messages (orphans dropped) 6. | Supported via standard or package-negotiated relay 6. | Protocol-level package payloads (pkgtxns) 6. |
Block Assembly Mechanics and BlockTemplateManager Engine
The construction of candidate block templates is executed by the BlockAssembler class within src/node/miner.cpp 1. The primary objective of BlockAssembler is to solve a multi-dimensional knapsack optimization problem: selecting a subset of transactions from the mempool DAG that maximizes fee revenue while adhering strictly to consensus constraints 1. These limits comprise a maximum block weight of (WU), equivalent to , and a maximum execution budget of to prevent signature validation denial-of-service attacks 1.
Block template generation begins in BlockAssembler::CreateNewBlock, which initializes the block header fields, constructs the placeholder coinbase transaction, and allocates consensus overhead margins 1. The assembler then enters its selection loop within BlockAssembler::addPackageTxs 1. In the legacy model, this loop queries a priority queue of mempool entries sorted by ancestor feerate via CompareTxMemPoolEntryByAncestorFee 1.
When a high-scoring transaction is evaluated, the assembler extracts its full unconfirmed ancestor set , filters out any transactions already committed to the current template, and verifies that the remaining package satisfies both the residual block weight and SigOp limits 1. If the package fits, the transactions are appended to the template in topological order, and the cached ancestor values of remaining mempool transactions are updated to reflect the inclusion of those ancestors 1. Under Cluster Mempool, this iterative re-indexing loop is replaced by sequential chunk extraction: BlockAssembler walks the global list of pre-linearized clusters in descending order of chunk feerate, appending each chunk directly to the block template until consensus limits are reached 1.
To support high-throughput mining infrastructure without introducing RPC latency into block construction, Bitcoin Core provides the BlockTemplateManager subsystem 7. Rather than assembling a new block template on every incoming RPC request (such as getblocktemplate), BlockTemplateManager maintains an asynchronous cache of pre-assembled templates synchronized directly with mempool state updates 7.
BlockTemplateManager subscribes to BlockConnected notifications from the validation interface to invalidate and clear stale template caches whenever the chain tip advances 7. It coordinates block production across multiple internal subsystems:
- Mining RPC interfaces serving external pool infrastructure (
getblocktemplate,waitNext,createNewBlock) 7. - The Peer Manager, which requires immediate template references to generate Compact Block short ID filters 8.
- Mempool fee estimation forecasters that continuously evaluate candidate block space demand to project feerate percentiles 7.
Mining Protocol Modernization: Stratum v2 and Decentralized Template Selection
The block template produced by a full node establishes the candidate ledger state, but the distribution of that template across physical mining hardware is governed by dedicated mining communication protocols 9. Historically, pooled mining relied on the getwork and getblocktemplate (GBT) protocols before standardizing on Stratum v1 9. Stratum v1 utilizes cleartext JSON-RPC framing to coordinate work between pool servers and individual ASIC mining devices 9.
Stratum v1 introduces a significant centralization vector into the network architecture 9. In Stratum v1, the pool’s central server constructs the block template, inserts its own coinbase transaction, builds the Merkle tree, and transmits only the raw 80-byte header components along with Merkle branches to individual hashing workers 9. The physical mining devices remain entirely unaware of the specific transactions included in the block they are computing proof-of-work for 9. Consequently, pool operators retain centralized authority over transaction selection, policy enforcement, and transaction censorship, while individual miners are unable to audit or modify the block contents 9.
Stratum v2 (SV2), implemented via the Stratum Reference Implementation (SRI), re-architects pooled mining by decoupling hashrate aggregation from transaction selection authority 9. SV2 replaces cleartext JSON-RPC strings with an encrypted, binary-framed protocol utilizing Authenticated Encryption with Associated Data (AEAD), reducing bandwidth consumption while eliminating man-in-the-middle hashrate hijacking risks 9.
The core architectural innovation of Stratum v2 is the Job Negotiation sub-protocol, which operates through four primary components 9:
- Template Provider (TP): A local subsystem running alongside a full Bitcoin Core node (
bitcoind) that builds custom block templates directly from the local mempool viaBlockAssembler9. - Job Negotiator (JN): A client component operated by the miner that negotiates custom block templates with the mining pool 9.
- Pool Job Negotiator Server: The pool-side interface that evaluates custom templates proposed by miners against pool fee policies and validity rules 9.
- Mining Devices: Downstream ASIC hardware units that compute proof-of-work on work packages assigned by the local Job Negotiator 9.
In this workflow, the miner’s Template Provider constructs a candidate block template and forwards the transaction set and Merkle path to the local Job Negotiator 9. The Job Negotiator transmits a proposal token containing the candidate Merkle root to the pool’s Job Negotiator server 9. The pool validates the proposed template against its operational parameters and returns a signed job token, allowing the miner’s hashing hardware to mine on the locally constructed block template 9. If the pool rejects the proposal, the Job Negotiator can automatically fall back to alternative pools or transition to solo mining 9. This protocol design returns transaction selection authority to individual hashers, mitigating the threat of pool-level transaction censorship 9.
| Architectural Layer | Stratum v1 Protocol | Stratum v2 Protocol (SRI) |
|---|---|---|
| Transport Encoding | Cleartext, unencrypted JSON-RPC framing 9. | Encrypted binary framing with AEAD cryptographic authentication 9. |
| Transaction Selection Point | Centralized pool operator exclusively 9. | Decentralized via local Template Provider (TP) and bitcoind 9. |
| Template Negotiation | None; miners receive pre-constructed Merkle branches 9. | Supported via the Job Negotiator (JN) sub-protocol 9. |
| Censorship Vulnerability | High (pools unilaterally control block transaction sets) 9. | Low (individual hashers construct independent block templates) 9. |
| Bandwidth Efficiency | Low (high-overhead string parsing and frequent messaging) 9. | High (compact binary frames optimized for high-latency connections) 9. |
Consensus Validation and Chain Propagation Pipelines
When a miner finds a valid proof-of-work nonce for a candidate block header, the block is broadcast to the peer-to-peer network, transitioning the contained transactions from unconfirmed mempool states to immutable consensus ledger state 1.
Consensus state transitions within Bitcoin Core are coordinated by ChainstateManager and executed through ConnectBlock 7. Structural block verification follows a strict sequence:
- Header Validation:
CheckBlockHeaderverifies proof-of-work difficulty targets against the block header hash, checks that timestamps remain within acceptable bounds, and enforces the Median-Time-Past (MTP) rule 1. - Contextual Validation:
CheckBlockvalidates that the computed Merkle root matches the header commitment, enforces block weight limits (), checks the Segregated Witness commitment in the coinbase script, and verifies that the block’s transactions are topologically ordered 1. - State Transition Execution:
ConnectBlockapplies the state transition function against the active UTXO view (CoinsViewCache), ensuring all referenced inputs exist, checking input values against output values to prevent inflation, verifying coinbase maturity limits (100 blocks), executing script verification scripts (ECDSA, Schnorr, Tapscript) via parallelCScriptCheckworker threads, and pruning confirmed transactions from the active mempool DAG 3.
The UTXO database mutation for block at height is expressed formally as:
To accelerate block relay across the network and minimize orphan rates caused by propagation latency, Bitcoin nodes implement BIP 152 Compact Blocks 8. Rather than transmitting full, multi-megabyte block payloads containing transactions that already reside in recipient mempools, BIP 152 constructs a compact HeaderAndShortIDs payload 8. This message contains the 80-byte block header, the full coinbase transaction, and an array of 6-byte truncated Short IDs for each non-coinbase transaction 8.
These 6-byte Short IDs are computed using a SipHash-2-4 construction seeded by the block header nonce and outpoint salt 8. Upon receiving a compact block, the node cross-matches the Short IDs against its local mempool transactions 8. In High-Bandwidth Mode, if all Short IDs resolve to known mempool transactions, the node reconstructs and validates the full block immediately, eliminating network round-trip delays 8. If any Short IDs cannot be matched due to mempool differences, the node transmits a getblocktxn request for the missing transaction indices and reconstructs the block upon receiving the corresponding blocktxn payload 8.
To streamline node synchronization, Bitcoin Core provides the AssumeUTXO framework (introduced in Bitcoin Core 26.0) 10. Historically, Initial Block Download (IBD) required sequential, computationally intensive script verification from the genesis block before a node could participate in active validation 10. AssumeUTXO decouples initial bootstrap time from historical ledger replay using the loadtxoutset RPC command, which imports a serialized snapshot of the UTXO set at a hardcoded base height () 10.
ChainstateManager initializes two concurrent chainstate engines 10:
- Snapshot Chainstate: Loads the confirmed UTXO snapshot directly into the active validation engine, allowing the node to immediately track the active chain tip, process incoming blocks via Compact Blocks, populate its mempool, and serve mining templates 10.
- Background Chainstate: Concurrently validates historical blocks from the genesis block up to in the background, executing full script verification 10.
When the background validation engine reaches , it computes the SHA-256 hash of the reconstructed UTXO state and verifies it against the snapshot’s cryptographic commitment 10. Upon verification, the background chainstate is pruned, establishing a unified ledger state and transitioning the node to standard operation without requiring sync-time downtime 10.
| Synchronization Phase | Standard Initial Block Download (IBD) | AssumeUTXO Architecture (Bitcoin Core 26.0+) |
|---|---|---|
| Time to Tip Synchronization | Bound by historical script execution and disk I/O from genesis 10. | Near-instantaneous activation upon importing serialized UTXO snapshot 10. |
| Chainstate Management | Single monolithic chainstate processing historical sequence 10. | Dual concurrent chainstates: Snapshot Chainstate and Background Chainstate 10. |
| Mempool & Mining Readiness | Inactive until full historical validation reaches the chain tip 10. | Active immediately at snapshot height (), supporting template generation 10. |
| Historical Verification | Sequential foreground validation from genesis block 10. | Asynchronous background validation validating snapshot hash at height 10. |
| Trust Model | Fully trustless mathematical derivation from genesis rules 10. | Trust-minimized: relies on hardcoded snapshot SHA-256 hash commitments 10. |
Architectural Synthesis
The lifecycle of a Bitcoin transaction forms a continuous progression across distinct subsystem layers:
- Mempool Ingestion and Topology Optimization: Standard transactions enter the peer-to-peer mempool, where they are partitioned into isolated topological clusters 2. Parametric max-flow/min-cut algorithms establish optimal linearizations, partitioning each cluster into monotonically decreasing feerate chunks 4. Anti-pinning standards (BIP 431 TRUC/v3) and BIP 331 Ancestor Package Relay protect these graph topologies from resource-exhaustion attacks, ensuring accurate valuation for multi-party contract transactions [^4, ^5].
- Block Template Construction: The
BlockAssemblerconsumes these pre-linearized chunks to construct revenue-maximizing candidate blocks that respect consensus weight and SigOp limits 1. TheBlockTemplateManagercoordinates template caching across mining interfaces and peer managers 7. Stratum v2 protocols distribute this template construction process directly to individual miners, preventing the concentration of transaction selection authority in centralized pool operators 9. - Consensus State Execution and Propagation: Once solved, blocks propagate across the network using BIP 152 Compact Blocks, resolving short transaction identifiers against local mempool state 8.
ChainstateManagerapplies these block state transitions to mutate the UTXO database, invalidates confirmed entries from the mempool DAG, and utilizesAssumeUTXOsnapshot validation to support rapid node deployment [^8, ^10].
These interconnected subsystems operate in concert, aligning transaction relay policies, economic incentive models, and cryptographic consensus validation into a unified distributed ledger architecture.
Works Cited
-
Bitcoin Core Contributors, “Ancestor Feerate and Package Mining in Bitcoin Core”, 2016 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27 ↩28 ↩29 ↩30 ↩31 ↩32 ↩33 ↩34 ↩35 ↩36 ↩37
-
Suhas Daftuar, “Cluster Mempool Definitions and Theory”, 2023 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15
-
Bitcoin Core Reviews, “Cluster Mempool PR Review Club #31363”, 2024 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
Pieter Wuille, “How to Linearize Your Cluster”, 2023 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10
-
Greg Sanders, “BIP 431: Topologically Restricted Until Confirmation (TRUC)”, 2024 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20
-
Gloria Zhao, “BIP 331: Ancestor Package Relay”, 2022 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12
-
Bitcoin Core Developers, “BlockTemplateManager Architecture and Template Caching”, 2024 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
Matt Corallo, “BIP 152: Compact Block Relay”, 2016 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
Stratum Protocol Community, “Stratum V2 Protocol Specification and SRI Architecture”, 2023 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27 ↩28 ↩29 ↩30
-
James O’Beirne, “AssumeUTXO: Fast Node Synchronization via UTXO Set Snapshots”, 2023 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18