Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions book/src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
- [Cross-Program Invocation](cross-program-invocation.md)
- [Rent](rent.md)
- [Inter-chain Transaction Verification](interchain-transaction-verification.md)
- [Snapshot Verification](snapshot-verification.md)

- [Implemented Design Proposals](implemented-proposals.md)
- [Blocktree](blocktree.md)
Expand Down
50 changes: 50 additions & 0 deletions book/src/snapshot-verification.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Verifying Snapshots and Account state proof
Comment thread
sakridge marked this conversation as resolved.

## Problem

When a validator boots up from a snapshot, it needs a way to verify the account set matches what the rest of the network sees quickly. A potential attacker
could give the validator an incorrect state, and then try to convince it to accept a transaction that would otherwise be rejected.

## Solution

Currently the bank hash is derived from hashing the delta state of the accounts in a slot which is then combined with the previous bank hash value. The problem with this is that the list of hashes
will grow on the order of the number of slots processed by the chain and become a burden to both transmit and verify successfully.

Another naive method could be to create a merkle tree of the account state. This has the downside that with each account update which removes an account state from the tree, the merkle
tree would have to be recomputed from the entire account state of all live accounts in the system.

To verify the snapshot, we propose the following:

On account store hash the following data:
Comment thread
sakridge marked this conversation as resolved.
* Account owner
* Account data
* Account pubkey
* Account lamports balance
* Fork the account is stored on
Comment thread
sakridge marked this conversation as resolved.

Use this resulting hash value as input to an expansion function which expands the hash value into an image value.
The function will create a 440 byte block of data where the first 32 bytes are the hash value, and the next 440 - 32 bytes
are generated from a Chacha RNG with the hash as the seed.

The account images are then combined with xor. The previous account value will be xored into the state and the new
account value also xored into the state.

Voting and sysvar hash values occur with the hash of the resulting full image value.
Comment thread
sakridge marked this conversation as resolved.

On validator boot, when it loads from a snapshot, it would verify the hash value with the accounts set. It would
then use SPV to display the percentage of the network that voted for the hash value given.

The resulting value can be verified by a validator to be the result of xoring all current account states together.

An attack on the xor state could be made to influence its value:

Thus the 440 byte image size comes from this paper, avoiding xor collision with 0 (or thus any other given bit pattern):
[https://link.springer.com/content/pdf/10.1007%2F3-540-45708-9_19.pdf]

The math provides 128 bit security in this case:
```ignore
O(k * 2^(n/(1+lg(k)))
k=2^40 accounts
n=440
2^(40) * 2^(448 * 8 / 41) ~= O(2^(128))
```