Running the Exchange · Part 3Engineering

Coin Selection, Parallelism, and the Architecture of Crypto Throughput

How Bitcoin, Ethereum, and Solana handle transaction parallelism differently, why coin selection matters at exchange scale, and how address design determines whether your platform serves retail and institutional customers equally well.

9 min read📅June 19, 2026⚙️Engineering🔗UTXO / EVM / Solana
Raajeev Reddy
Raajeev Reddy

Engineering leader with 15 years leading engineering organizations across blockchain, digital health, and media platforms.

Parts 1 and 2 covered how exchanges manage the flow of funds between cold and hot wallets and why keeping hundreds of per-asset limits in balance is one of the hardest real-time problems in crypto operations. This post goes one level deeper: what happens after the funds arrive in the hot wallet and a customer requests a withdrawal. Specifically, which address do you use to send it, and why that decision determines everything from throughput to cost to compliance.

Two customers. One platform. Opposite needs.

Every major custodial platform serves two fundamentally different types of customers simultaneously, and their requirements for how funds should be held and distributed are almost entirely incompatible.

👥 Retail customers

High volume, low value. Thousands of withdrawals per minute, each for a small amount. They need fast confirmation and parallel throughput. The platform needs many small addresses available simultaneously so withdrawals do not queue behind each other. Every second of delay is visible and damages trust.

🏢 Institutional customers

Low volume, high value. A small number of transactions, each potentially worth tens or hundreds of millions of dollars. They need large single-address outputs ready to move immediately without aggregating dozens of small inputs, which would lock all of them simultaneously and slow settlement to an unacceptable crawl.

The same hot wallet has to serve both at the same time. The way funds are distributed across addresses after a cold-to-hot restore determines which customer type is served well and which is not. Getting this wrong has a direct financial cost beyond just customer experience. Every sweep, restore, consolidation, and address restructuring operation required to correct a poorly designed address pool is an on-chain transaction carrying a real fee. At the scale of hundreds of millions of addresses across multiple chains, those fees compound rapidly into a significant operational expense. Getting the architecture right from the start is a financial discipline, not just an engineering preference.

To understand how to solve this problem, you first need to understand how Bitcoin, Ethereum, and Solana each handle transactions differently, because the architecture shapes the solution.

Bitcoin: you own individual bills, not a balance

On Bitcoin, funds do not sit in a single balance the way they do in a bank account. Think of your wallet as a physical wallet holding individual bills. You might have a $10 bill, a $20 bill, and a $50 bill. You do not have “$80.” You literally own three separate pieces of currency. On Bitcoin these are called UTXOs: unspent transaction outputs.

When you want to send $25, you cannot cut a bill. Your wallet has to choose which bills to combine. It might pick the $20 and the $10, spending $30 total. But here is the part many people miss, and where real money has been lost: you must explicitly specify a change address for the $5 remainder to return to you. If you do not specify a change address when constructing the transaction, the remainder does not automatically come back. It disappears entirely, effectively paid to miners as an additional fee.

Diagram 1 — Bitcoin UTXO: Coin Selection and the Change Address
UTXOs in hot wallet10 BTCaddr_A20 BTCaddr_B50 BTCaddr_C (not selected)TRANSACTIONinputs: addr_A + addr_B = 30 BTC25 BTC→ recipient address5 BTC→ change address (must specify)If no change addressis specified:The 5 BTC remainderdoes not return.5 BTCpaid to minersas unintended fee.Irreversible. On-chain.No recovery path.
A cautionary point for every engineer building on Bitcoin: This mistake has been made in production. Developers building custom transaction tooling, exchanges in their early operations, and individual users constructing raw transactions have all lost real funds this way. Once a Bitcoin transaction confirms on chain, it is final. There is no reversal, no support ticket, and no recovery path. The change address must be explicitly specified in every transaction or the remainder is permanently gone.

This is coin selection. For a personal wallet, the software may make a default choice on your behalf. At a custodial platform, there is no default. The engineering team writes the coin selection algorithm that decides which UTXOs to combine for every withdrawal. That algorithm is a deliberate engineering decision with direct consequences for throughput, cost, and privacy.

A well-designed coin selection algorithm achieves three things simultaneously. It minimizes transaction fees by selecting inputs that cover the required amount without unnecessary excess. It avoids creating many tiny change outputs, which fragment the wallet into micro-balances that become harder to deploy efficiently over time. And it protects privacy by not unnecessarily linking unrelated addresses as co-inputs in the same transaction.

That last point deserves more explanation. On a public blockchain, when multiple addresses appear as inputs in the same transaction, blockchain analysts apply what is called the common-input-ownership heuristic: the assumption that all inputs belong to the same controlling entity. Chain analysis firms including Chainalysis use this as a primary clustering technique to map organizational wallet structures. When a custodial platform carelessly combines UTXOs from different operational pools or customer segments in a single transaction, it permanently links those addresses on chain. That linkage reveals internal organizational structure, can expose customer flow patterns, and creates compliance exposure that is difficult to undo. At exchange scale, address hygiene is not optional.

The other critical property of UTXO-based chains is parallelism. If Alice owns UTXO A and Bob owns UTXO B, and both spend their UTXOs in the same block, there is no conflict. Bitcoin nodes can validate both transactions simultaneously because they touch completely different outputs. The throughput problem comes not from Bitcoin’s inability to parallelize, but from the locking constraint at the address level. Once an address is selected as an input for a broadcast transaction, the platform’s internal system marks that UTXO as in-use to prevent a conflicting transaction from being broadcast. This locking is enforced by the platform’s own software, not by Bitcoin itself. At the protocol level, Bitcoin will accept a conflicting transaction into the mempool and let miners decide which one to include. During network congestion, an unconfirmed transaction can remain pending for an hour or more, keeping that UTXO unavailable throughout that window.

Ethereum: one giant spreadsheet, edited sequentially

Ethereum does not use individual coins. Instead imagine one giant spreadsheet with a row for every account and a column for its balance. A transfer simply changes two rows. Alice sends 20 ETH to Bob: Alice’s row decrements by 20, Bob’s row increments by 20.

The problem with parallelizing this is not simple transfers. It is smart contracts. Consider a swap on Uniswap. The transaction calls a router, which calls a pool, which calls a token contract, which calls a fee collector, which may call an oracle. Nobody knows which storage slots will be modified until the code actually runs. The EVM has to execute the transaction to discover what it touches. This makes pre-declaring dependencies impossible for most real-world transactions, which is why Ethereum executes transactions in a strict sequential order, one after another, in a single globally agreed sequence.

For custodial platforms, this means EVM hot wallet throughput scales through address pool size rather than transaction parallelism. Each Ethereum address has its own independent nonce sequence, so the more independent addresses the platform maintains in its hot wallet pool, the more concurrent outgoing transactions it can support without one blocking another.

Diagram 2 — Ethereum: Sequential Execution and the Call Chain Problem
A single Uniswap swap triggers this entire call chainUserinitiates swapRouterroutes tradePoolexecutes swapTokentransfers ERC-20Fee collectortakes protocol feeOraclereads priceStorage slots touched are unknown until runtime. The EVM must execute to discover them.Result: transactions execute in strict sequence, one at a timeTx 1Tx 2Tx 3Tx 4No transaction starts until the previous one fully completes and all state changes are committed.Custodial platform throughput scales by adding more independent hot wallet addresses, each with its own nonce sequence.More addresses = more concurrent outgoing transactions without blocking.

Solana: declare your accounts, then run in parallel

Solana takes a different approach entirely. Before a transaction is broadcast, the sender must explicitly declare every account the transaction will read from or write to. The validator sees this declaration before execution begins and uses it to detect conflicts without having to run the code first.

If transaction 1 touches Alice’s account and a USDC vault, and transaction 2 touches Bob’s account and an NFT marketplace, there is no overlap. Both run simultaneously on separate CPU cores. If both transactions write to Alice’s account, they conflict and Solana serializes them.

Diagram 3 — Solana Parallel vs Serial Execution
Non-conflicting: run in parallelTx 1Writes: Alice, USDC vaultTx 2Writes: Bob, NFT vaultCPU core 1CPU core 2No shared accounts. Execute simultaneously.Conflicting: serializedTx 1Writes: Alice, USDC vaultTx 2Writes: Alice, CarolBoth write Alice. Must serialize.Hot account bottleneckWhen many users simultaneously interact with the same liquidity pool or token vault,all those transactions write to the same account and Solana serializes them.

This design gives Solana significantly higher throughput than Ethereum under ideal conditions. The tradeoff is developer complexity: Solana developers must declare all accounts a transaction will touch before sending it, requiring knowledge of the execution path upfront. Ethereum developers simply write the code and let the EVM discover dependencies at runtime.

For custodial platforms on Solana, the parallelism benefit is real but the hot account constraint matters. When many users simultaneously interact with the same liquidity pool or token vault, all those transactions write to the same state and Solana serializes them. Platforms interacting with external liquidity sources have to route and time transactions carefully to avoid these bottlenecks.

Diagram 4 — How Bitcoin, Ethereum, and Solana Handle Parallelism
Bitcoin (UTXO)Ethereum (EVM)SolanaIndividual coins (UTXOs)Account balances (ledger)Account balances + declared accessCash in your walletOne shared spreadsheetSpreadsheet with declared rowsHigh (distinct UTXOs)Low (sequential execution)High (non-overlapping accounts)Address locking duringconfirmation windowAddress pool size limitsconcurrent throughputHot accounts serializecompeting transactionsLimited smart contractsFlexible, dynamicFlexible, declared upfront

Chunking the restore to serve both customer types

With the architectural context established, the chunking problem becomes clear. When 200 BTC arrives from the cold wallet into the hot wallet, it does not land in a single address and sit there. The platform immediately distributes it across multiple addresses in a pattern designed to serve both customer types simultaneously.

For retail throughput, 200 BTC might be split across 100 addresses of 2 BTC each. Each of those 100 addresses can now serve a separate customer withdrawal in parallel. While one address is locked waiting for its transaction to confirm, 99 others remain available. The throughput ceiling rises with the number of independently usable addresses.

For institutional settlement, the same 200 BTC might instead be split across 4 addresses of 50 BTC each. A customer wanting to move 50 BTC uses one address, signs one transaction, and confirms in one step. No aggregation required. No locking of 25 separate 2 BTC addresses simultaneously while the network processes a slow confirmation.

In practice, a single restore is distributed across both address sizes in a ratio calibrated to the platform’s historical mix of retail and institutional volume. The ratio adjusts based on observed patterns, time of day, market conditions, and anticipated demand signals. Getting this ratio wrong has a direct cost: every corrective consolidation or re-chunking operation is another on-chain transaction, another fee, another line added to the cost of doing business. Across hundreds of millions of addresses and multiple chains, those fees compound into a number that matters.

Diagram 5 — Chunking 200 BTC for Retail vs Institutional Throughput
200 BTC restoredfrom cold to hot walletRetail chunking100 addresses × 2 BTC eachEach address handles one withdrawal in parallel2 BTC2 BTC2 BTC2 BTC2 BTC... ×100High throughput. Parallel withdrawals.Institutional chunking4 addresses × 50 BTC eachEach address handles one large withdrawal cleanly50 BTCaddr 150 BTCaddr 250 BTCaddr 350 BTCaddr 4Low aggregation. Fast large-value settlement.The same restore serves both customer types. The chunking ratio is calibratedto the exchange's actual mix of retail and institutional volume.

The cost of getting this wrong

Poor coin selection and address design create compounding problems that are not immediately visible but become serious at scale. If address chunking is too coarse for retail volume, thousands of customer withdrawals queue behind a small number of locked addresses during peak periods. Confirmation times stretch. Customers wait. The exchange appears slow even though the funds are fully available.

If chunking is too fine for institutional volume, a 50 BTC withdrawal requires aggregating 25 separate 2 BTC inputs simultaneously, locking all of them for the duration of one slow confirmation while hundreds of retail withdrawals wait behind it. The exchange optimized for one customer type at the direct expense of the other.

The insight that is easy to miss: Coin selection is not a transaction-level decision. It is a wallet architecture decision made at restore time, long before any customer withdrawal arrives. By the time a customer clicks withdraw, the options available to serve that withdrawal were already determined by how the last restore was chunked.
Next in this series: The dust problem. Every address on every chain, Bitcoin, Ethereum, and beyond, eventually accumulates small balances that are too costly to move individually but too valuable to ignore collectively. Multiply that across hundreds of millions of addresses at exchange scale and the number sitting idle is larger than most people would expect. The opportunity to recover it exists at every major platform. The engineering required to do it safely, without triggering compliance flags or creating new operational risk, is far harder than it looks. Here is how we approached it.
Raajeev Reddy
Raajeev Reddy

Engineering leader with 15 years leading engineering organizations across blockchain, digital health, and media platforms.

← All writing