Wallet Protocol
This protocol is a bidirectional protocol for communication between full nodes and wallets in the Chia system. This is also sometimes referred to as the light client protocol.
The wallet protocol contains two sub protocols by which a wallet can sync transaction from a node.
Privacy Protocol
The first is the privacy protocol, where the wallet downloads each header and checks the filter for transactions. It is more private, but much slower.
Fast Sync Protocol (recommended)
The second is the fast sync protocol, where the wallet directly asks the node to look for certain coin ids or puzzle hashes. It has less privacy but is much faster. The following is the flow for syncing for a wallet that any wallet developer should follow. It is important to connect to several random nodes to increase security. This sync protocol should be very fast for users who don't have many transactions.
- Perform a DNS lookup to obtain random node IPS:
dig dns-introducer.chia.net
. - Connect to a few nodes, to ensure the server does not omit transactions. The nodes will send a
new_peak_wallet
message with their claimed peaks. - Download a weight proof from one of the nodes (or several) with the heaviest peak
- Verify the weight proof to make sure the claimed peak is correct
- Subscribe to first 100 puzzle hashes for our key (both observer and non-observer)
- Validate the puzzle hash subscription state returned from the full node. This requires making sure the block in which these coins are included is part of the chain of SubEpochSummaries. Only the block hashes have to be checked here. Furthermore, a few block headers (around 30-50) should be validated after this block to make sure it is properly buried.
- From step 5, we obtain all coin IDs which we are interested in, and we restore any CAT wallets for coins which have our puzzle hash in the hint.
- Subscribe to interesting coin IDs
- Validate the coin subscription returned from the full node, similar to how it's done in step 5
Protocol Messages
request_puzzle_solution
A request from the wallet to the full node for the puzzle and solution of a certain spent coin ID.
class RequestPuzzleSolution(Streamable):
coin_name: bytes32 # ID of the spent coin
height: uint32 # Spent height
respond_puzzle_solution
A response to a request_puzzle_solution
request.
class RespondPuzzleSolution(Streamable):
response: PuzzleSolutionResponse
class PuzzleSolutionResponse(Streamable):
coin_name: bytes32
height: uint32
puzzle: Program
solution: Program
reject_puzzle_solution
A rejection to a request_puzzle_solution
request.
class RejectPuzzleSolution(Streamable):
coin_name: bytes32
height: uint32