  Public blockchains like Ethereum use Merkle trees to verify transactions
received from untrusted servers before applying them to the blockchain. We
empirically show that the low throughput of such blockchains is due to the I/O
bottleneck associated with using Merkle trees for processing transactions. We
present RAINBLOCK, a new architecture for public blockchains that increases
throughput without affecting security. RAINBLOCK achieves this by tackling the
I/O bottleneck on two fronts: first, decoupling transaction processing from
I/O, and removing I/O from the critical path; second, reducing I/O
amplification by customizing storage for blockchains. RAINBLOCK uses a novel
variant of the Merkle tree, the Distributed Sharded Merkle tree (DSM-TREE) to
store system state. We evaluate RAINBLOCK using workloads based on public
Ethereum traces (including smart contracts) and show that RAINBLOCK processes
20K transactions per second in a geo-distributed setting with four regions
spread across three continents.
