# sn_protocol
## Overview
The `sn_protocol` directory contains the core protocol logic for the Safe Network. It includes various modules that handle different aspects of the protocol, such as error handling, messages, and storage.
## Table of Contents
- [Overview](#overview)
- [Error Handling](#error-handling)
- [Messages](#messages)
- [Cmd Messages](#cmd-messages)
- [Query Messages](#query-messages)
- [Response Messages](#response-messages)
- [Storage](#storage)
- [Protobuf Definitions](#protobuf-definitions)
## Error Handling
The `error.rs` file contains the definitions for various errors that can occur within the protocol.
### Error Types
- `ChunkNotFound(ChunkAddress)`: Indicates that a chunk was not found.
- Example: `Result::Err(Error::ChunkNotFound(chunk_address))`
- `ChunkNotStored(XorName)`: Indicates that a chunk was not stored.
- Example: `Result::Err(Error::ChunkNotStored(xor_name))`
- `RegisterNotFound(Box<RegisterAddress>)`: Indicates that a register was not found.
- Example: `Result::Err(Error::RegisterNotFound(register_address))`
- `SpendNotFound(SpendAddress)`: Indicates that a spend was not found.
- Example: `Result::Err(Error::SpendNotFound(cash_note_address))`
- `DoubleSpendAttempt(Box<SignedSpend>, Box<SignedSpend>)`: Indicates a double spend attempt.
- Example: `Result::Err(Error::DoubleSpendAttempt(spend1, spend2))`
## Messages
The `messages` module contains different types of messages that can be sent or received within the protocol.
### Cmd Messages
#### `Cmd::Replicate`
- **Description**: Write operation to notify peer fetch a list of `NetworkAddress` from the holder.
- **Parameters**:
- `holder: NetworkAddress`: Holder of the replication keys.
- `keys: Vec<NetworkAddress>`: Keys of the copy that shall be replicated.
### Query Messages
#### `Query::GetStoreCost`
- **Description**: Retrieve the cost of storing a record at the given address.
- **Parameters**:
- `address: NetworkAddress`: The address where the record will be stored.
### Response Messages
#### `QueryResponse::GetStoreCost`
- **Description**: The store cost in nanos for storing the next record.
- **Parameters**:
- `store_cost: Result<Token>`: The cost of storing the record.
- `payment_address: PublicAddress`: The address to pay the store cost to.
#### `CmdResponse::Replicate`
- **Description**: Response to replication cmd.
- **Parameters**:
- `Result<()>`: The result of the replication command.
## Storage
The `storage` module handles the storage aspects of the protocol.
### API Calls
- `ChunkAddress`: Address of a chunk in the network.
- `SpendAddress`: Address of a CashNote's Spend in the network.
- `Header`: Header information for storage items.
## Protobuf Definitions
The `safenode_proto` directory contains the Protocol Buffers definitions for the Safe Network.
### Files
- `req_resp_types.proto`: Definitions for request and response types.
- `safenode.proto`: Main Protocol Buffers definitions for the Safe Network.