From 50468780b86b25bad28a362765a5c3dec10f59bd Mon Sep 17 00:00:00 2001 From: "Andreas M. Antonopoulos" Date: Sun, 20 Jul 2014 21:49:14 -0500 Subject: [PATCH] SPV nodes --- ch06.asciidoc | 30 +++++++++++++++++++++++++++- images/InventorySynchronization.png | Bin 19646 -> 19496 bytes 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/ch06.asciidoc b/ch06.asciidoc index ebd1b0ec..70c9b88e 100644 --- a/ch06.asciidoc +++ b/ch06.asciidoc @@ -151,10 +151,38 @@ This process of comparing the local blockchain with the peers and retrieving any .Node synchronizing the blockchain by retrieving blocks from a peer image::images/InventorySynchronization.png["InventorySynchronization"] -=== Simple Payment Verification Nodes +=== Simple Payment Verification (SPV) Nodes + +Not all nodes have the ability to store the full blockchain. Many bitcoin clients are designed to run on space- and power-constrained devices, such as smartphones, tablets or embedded systems. For such devices, a _simple payment verification_ (SPV) method is used to allow them to operate without storing the full blockchain. These types of clients are called SPV clients or lightweight clients. As bitcoin adoption surges, the SPV node is becoming the most common form of bitcoin node, especially for bitcoin wallets. + +SPV nodes operate the same as full-blockchain nodes, they route network messages, validate transactions and blocks, and construct transactions in the same way. The main difference is that they lack a full copy of the blockchain and verify transactions using a slightly different methodology that relies on peers to provide partial views of relevant parts of the blockchain on-demand. + +Simple Payment Verification verifies transactions by reference to their _depth_ in the blockchain instead of their _height_. Whereas a full-blockchain node will construct a fully verified chain of thousands of blocks and transactions reaching down the blockchain (back in time) all the way to the genesis block, an SPV node will verify the chain of a few blocks layered over the one containing a transaction of interest. + +For example, when examining a transaction in block 300,000, a full node links all 300,000 blocks down to the genesis block, establishing the validity of the transaction by confirming to a height from zero to 300,000. An SPV node instead waits until is sees the six blocks 300,001 through 300,006 piled on top of the block containing the transaction and verifies it by establishing its depth under blocks 300,006 to 300,001. The fact that other nodes on the network accepted block 300,000 and then did the necessary work to produce 6 more blocks on top of it is proof enough. + +The SPV node still verifies the transaction and the chain of blocks above it independently. It is not depending on the authority of another system for verification. However, it's verification process depends on a small sample of the total blockchain. As a result it is vulnerable to manipulation if all the information it receives is falsified. SPV nodes depend on connecting to enough randomly selected peers to ensure they are not being spoon-fed disinformation. + +Still, SPV nodes can be compromised if their network connection or operating environment is thoroughly compromised and simulated by an adversary. Since they do not verify the totality of the proof-of-work that comprises bitcoin's security proof, they cannot defend against all attacks. They can be given a misleading chain of blocks that has been calculated specifically to falsify a transaction and they can be prevented from connecting to an honest node to see through the ruse. They lack a local blockchain with which to establish a deep history of the bitcoin ledger which would be impossible to fabricate. A sandboxed SPV node is like a denizen of the Matrix, in that it thinks it is experiencing objective reality even though it is in simulation. + +For most practical purposes, well-connected SPV nodes are secure enough, striking the right balance between resource needs, practicality and security. For the truly security conscious, however, nothing beats running a full blockchain node. + +[TIP] +==== +A full blockchain node verifies a transaction by checking the chain of thousands of blocks below it, whereas an SPV node checks how deep the block is buried by a handful of blocks above it. +==== + +Since SPV nodes need to retrieve specific blocks and transaction chains in order to selectively verify a single transaction, they also create a privacy risk. Unlike full-blockchain nodes that collect all blocks and transactions, SPV node requests for specific data can inadvertently reveal the addresses that are in use in a wallet. For example, a third party monitoring a network could keep track of all the transactions and blocks requested by a wallet on an SPV node and use those to associate bitcoin addresses with the user of that wallet, destroying the user's privacy. + +Shortly after the introduction of SPV/lightweight nodes, the bitcoin developers added a feature called _bloom filters_ to address the privacy risks of SPV nodes. Bloom filters allow SPV nodes to receive a subset of the blocks and transactions without revealing precisely which addresses they are interested in, through a filtering mechanism that uses probabilities rather than fixed patterns. === Bloom Filters + + + + + === Independent Verification of Transactions In the previous chapter we saw how wallet software creates transactions by collecting UTXO, providing the appropriate unlocking scripts and then constructing new outputs assigned to a new owner. The resulting transaction is then sent to the neighboring nodes in the bitcoin network so that it may be propagated across the entire bitcoin network. diff --git a/images/InventorySynchronization.png b/images/InventorySynchronization.png index c17af95fa2144a4d9a0e89f3c33484c394ff6e73..72cde37fe1d863630e9805ed5cea5a37ca576079 100644 GIT binary patch literal 19496 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 S@fw|V*GS)7uk4)bt^W_m6?|j> literal 19646 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