2022-06-23 21:45:42 +00:00
|
|
|
# Codex Decentralized Durability Engine
|
|
|
|
|
2024-10-02 22:00:40 +00:00
|
|
|
> The Codex project aims to create a decentralized durability engine that
|
|
|
|
> allows persisting data in p2p networks. In other words, it allows storing
|
|
|
|
> files and data with predictable durability guarantees for later retrieval.
|
2022-06-23 21:45:42 +00:00
|
|
|
|
|
|
|
> WARNING: This project is under active development and is considered pre-alpha.
|
2022-05-10 20:41:44 +00:00
|
|
|
|
|
|
|
[![License: Apache](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
|
|
|
|
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
|
|
|
|
[![Stability: experimental](https://img.shields.io/badge/stability-experimental-orange.svg)](#stability)
|
2023-08-27 04:22:09 +00:00
|
|
|
[![CI](https://github.com/codex-storage/nim-codex/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/codex-storage/nim-codex/actions/workflows/ci.yml?query=branch%3Amaster)
|
|
|
|
[![Docker](https://github.com/codex-storage/nim-codex/actions/workflows/docker.yml/badge.svg?branch=master)](https://github.com/codex-storage/nim-codex/actions/workflows/docker.yml?query=branch%3Amaster)
|
|
|
|
[![Codecov](https://codecov.io/gh/codex-storage/nim-codex/branch/master/graph/badge.svg?token=XFmCyPSNzW)](https://codecov.io/gh/codex-storage/nim-codex)
|
2022-06-23 21:45:42 +00:00
|
|
|
[![Discord](https://img.shields.io/discord/895609329053474826)](https://discord.gg/CaJTh24ddQ)
|
2023-08-27 04:22:09 +00:00
|
|
|
![Docker Pulls](https://img.shields.io/docker/pulls/codexstorage/nim-codex)
|
2022-06-23 21:45:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
## Build and Run
|
|
|
|
|
2024-09-29 14:38:57 +00:00
|
|
|
For detailed instructions on preparing to build nim-codex see [*Build Codex*](https://docs.codex.storage/learn/build).
|
2022-08-19 02:40:11 +00:00
|
|
|
|
2022-06-23 21:45:42 +00:00
|
|
|
To build the project, clone it and run:
|
|
|
|
|
|
|
|
```bash
|
2023-03-28 00:08:13 +00:00
|
|
|
make update && make
|
2022-06-23 21:45:42 +00:00
|
|
|
```
|
|
|
|
|
2024-10-02 22:00:40 +00:00
|
|
|
The executable will be placed under the `build` directory under the project
|
|
|
|
root.
|
2022-06-23 21:45:42 +00:00
|
|
|
|
|
|
|
Run the client with:
|
|
|
|
|
|
|
|
```bash
|
2022-08-19 02:40:11 +00:00
|
|
|
build/codex
|
2022-06-23 21:45:42 +00:00
|
|
|
```
|
2023-05-02 13:06:34 +00:00
|
|
|
## Configuration
|
|
|
|
|
|
|
|
It is possible to configure a Codex node in several ways:
|
|
|
|
1. CLI options
|
|
|
|
2. Env. variable
|
|
|
|
3. Config
|
|
|
|
|
2024-10-02 22:00:40 +00:00
|
|
|
The order of priority is the same as above:
|
|
|
|
Cli arguments > Env variables > Config file values.
|
2023-05-02 13:06:34 +00:00
|
|
|
|
|
|
|
### Environment variables
|
|
|
|
|
2024-10-02 22:00:40 +00:00
|
|
|
In order to set a configuration option using environment variables,
|
|
|
|
first find the desired CLI option and then transform it in the following way:
|
2023-05-02 13:06:34 +00:00
|
|
|
|
|
|
|
1. prepend it with `CODEX_`
|
|
|
|
2. make it uppercase
|
|
|
|
3. replace `-` with `_`
|
|
|
|
|
2024-10-02 22:00:40 +00:00
|
|
|
For example, to configure `--log-level`, use `CODEX_LOG_LEVEL` as the
|
|
|
|
environment variable name.
|
2023-05-02 13:06:34 +00:00
|
|
|
|
|
|
|
### Configuration file
|
|
|
|
|
2024-10-02 22:00:40 +00:00
|
|
|
A [TOML](https://toml.io/en/) configuration file can also be used to set
|
|
|
|
configuration values. Configuration option names and corresponding values are
|
|
|
|
placed in the file, separated by `=`. Configuration option names can be
|
|
|
|
obtained from the `codex --help` command, and should not include
|
|
|
|
the `--` prefix. For example, a node's log level (`--log-level`) can be
|
|
|
|
configured using TOML as follows:
|
2023-05-02 13:06:34 +00:00
|
|
|
|
|
|
|
```toml
|
2023-06-16 16:20:49 +00:00
|
|
|
log-level = "trace"
|
2023-05-02 13:06:34 +00:00
|
|
|
```
|
|
|
|
|
2024-10-02 22:00:40 +00:00
|
|
|
The Codex node can then read the configuration from this file using
|
|
|
|
the `--config-file` CLI parameter, like
|
|
|
|
`codex --config-file=/path/to/your/config.toml`.
|
2022-06-23 21:45:42 +00:00
|
|
|
|
|
|
|
### CLI Options
|
|
|
|
|
|
|
|
```
|
2024-10-02 22:00:40 +00:00
|
|
|
$ build/codex --help
|
2022-06-23 21:45:42 +00:00
|
|
|
Usage:
|
|
|
|
|
|
|
|
codex [OPTIONS]... command
|
|
|
|
|
|
|
|
The following options are available:
|
|
|
|
|
2023-05-02 13:06:34 +00:00
|
|
|
--config-file Loads the configuration from a TOML file [=none].
|
2023-06-16 16:20:49 +00:00
|
|
|
--log-level Sets the log level [=info].
|
2022-06-23 21:45:42 +00:00
|
|
|
--metrics Enable the metrics server [=false].
|
|
|
|
--metrics-address Listening address of the metrics server [=127.0.0.1].
|
|
|
|
--metrics-port Listening HTTP port of the metrics server [=8008].
|
2024-01-29 19:31:29 +00:00
|
|
|
-d, --data-dir The directory where codex will store configuration and data.
|
2022-11-15 19:16:02 +00:00
|
|
|
-i, --listen-addrs Multi Addresses to listen on [=/ip4/0.0.0.0/tcp/0].
|
|
|
|
-a, --nat IP Addresses to announce behind a NAT [=127.0.0.1].
|
|
|
|
-e, --disc-ip Discovery listen address [=0.0.0.0].
|
|
|
|
-u, --disc-port Discovery (UDP) port [=8090].
|
|
|
|
--net-privkey Source of network (secp256k1) private key file path or name [=key].
|
2024-01-29 19:31:29 +00:00
|
|
|
-b, --bootstrap-node Specifies one or more bootstrap nodes to use when connecting to the network.
|
2022-06-23 21:45:42 +00:00
|
|
|
--max-peers The maximum number of peers to connect to [=160].
|
|
|
|
--agent-string Node agent string which is used as identifier in network [=Codex].
|
2023-05-02 13:06:34 +00:00
|
|
|
--api-bindaddr The REST API bind address [=127.0.0.1].
|
2022-06-23 21:45:42 +00:00
|
|
|
-p, --api-port The REST Api port [=8080].
|
2024-10-02 22:00:40 +00:00
|
|
|
--api-cors-origin The REST Api CORS allowed origin for downloading data. '*' will allow all
|
|
|
|
origins, '' will allow none. [=Disallow all cross origin requests to download
|
|
|
|
data].
|
|
|
|
--repo-kind Backend for main repo store (fs, sqlite, leveldb) [=fs].
|
|
|
|
-q, --storage-quota The size of the total storage quota dedicated to the node [=$DefaultQuotaBytes].
|
2023-05-02 13:06:34 +00:00
|
|
|
-t, --block-ttl Default block timeout in seconds - 0 disables the ttl [=$DefaultBlockTtl].
|
|
|
|
--block-mi Time interval in seconds - determines frequency of block maintenance cycle: how
|
2024-01-29 19:31:29 +00:00
|
|
|
often blocks are checked for expiration and cleanup
|
2023-05-02 13:06:34 +00:00
|
|
|
[=$DefaultBlockMaintenanceInterval].
|
2024-01-29 19:31:29 +00:00
|
|
|
--block-mn Number of blocks to check every maintenance cycle [=1000].
|
|
|
|
-c, --cache-size The size of the block cache, 0 disables the cache - might help on slow hardrives
|
|
|
|
[=0].
|
2024-05-22 16:43:33 +00:00
|
|
|
|
|
|
|
Available sub-commands:
|
|
|
|
|
|
|
|
codex persistence [OPTIONS]... command
|
|
|
|
|
|
|
|
The following options are available:
|
|
|
|
|
2022-06-23 21:45:42 +00:00
|
|
|
--eth-provider The URL of the JSON-RPC API of the Ethereum node [=ws://localhost:8545].
|
2024-05-22 16:43:33 +00:00
|
|
|
--eth-account The Ethereum account that is used for storage contracts.
|
|
|
|
--eth-private-key File containing Ethereum private key for storage contracts.
|
|
|
|
--marketplace-address Address of deployed Marketplace contract.
|
2023-05-02 13:06:34 +00:00
|
|
|
--validator Enables validator, requires an Ethereum node [=false].
|
|
|
|
--validator-max-slots Maximum number of slots that the validator monitors [=1000].
|
2024-10-02 22:00:40 +00:00
|
|
|
If set to 0, the validator will not limit the maximum number of slots it
|
|
|
|
monitors.
|
|
|
|
--validator-groups Slot validation groups [=ValidationGroups.none].
|
|
|
|
A number indicating total number of groups into which the whole slot id space
|
|
|
|
will be divided. The value must be in the range [2, 65535]. If not provided, the
|
|
|
|
validator will observe the whole slot id space and the value of the
|
|
|
|
--validator-group-index parameter will be ignored. Powers of twos are advised
|
|
|
|
for even distribution.
|
|
|
|
--validator-group-index Slot validation group index [=0].
|
|
|
|
The value provided must be in the range [0, validatorGroups). Ignored when
|
|
|
|
--validator-groups is not provided. Only slot ids satisfying condition [(slotId
|
|
|
|
mod validationGroups) == groupIndex] will be observed by the validator.
|
2022-06-23 21:45:42 +00:00
|
|
|
|
|
|
|
Available sub-commands:
|
|
|
|
|
2024-05-22 16:43:33 +00:00
|
|
|
codex persistence prover [OPTIONS]...
|
|
|
|
|
|
|
|
The following options are available:
|
|
|
|
|
|
|
|
--circom-r1cs The r1cs file for the storage circuit.
|
|
|
|
--circom-wasm The wasm file for the storage circuit.
|
|
|
|
--circom-zkey The zkey file for the storage circuit.
|
|
|
|
--circom-no-zkey Ignore the zkey file - use only for testing! [=false].
|
|
|
|
--proof-samples Number of samples to prove [=5].
|
|
|
|
--max-slot-depth The maximum depth of the slot tree [=32].
|
|
|
|
--max-dataset-depth The maximum depth of the dataset tree [=8].
|
|
|
|
--max-block-depth The maximum depth of the network block merkle tree [=5].
|
|
|
|
--max-cell-elements The maximum number of elements in a cell [=67].
|
2022-06-23 21:45:42 +00:00
|
|
|
```
|
|
|
|
|
2023-05-15 07:02:57 +00:00
|
|
|
#### Logging
|
|
|
|
|
2024-10-02 22:00:40 +00:00
|
|
|
Codex uses [Chronicles](https://github.com/status-im/nim-chronicles) logging
|
|
|
|
library, which allows great flexibility in working with logs.
|
|
|
|
Chronicles has the concept of topics, which categorize log entries into
|
|
|
|
semantic groups.
|
2023-05-15 07:02:57 +00:00
|
|
|
|
2024-10-02 22:00:40 +00:00
|
|
|
Using the `log-level` parameter, you can set the top-level log level like
|
|
|
|
`--log-level="trace"`, but more importantly, you can set log levels for
|
|
|
|
specific topics like `--log-level="info; trace: marketplace,node; error: blockexchange"`,
|
|
|
|
which sets the top-level log level to `info` and then for topics
|
|
|
|
`marketplace` and `node` sets the level to `trace` and so on.
|
2023-05-15 07:02:57 +00:00
|
|
|
|
2024-05-22 16:43:33 +00:00
|
|
|
### Guides
|
2022-06-23 21:45:42 +00:00
|
|
|
|
2024-05-22 16:43:33 +00:00
|
|
|
To get acquainted with Codex, consider:
|
2024-10-02 22:00:40 +00:00
|
|
|
* running the simple [Codex Two-Client Test](docs/TwoClientTest.md) for
|
|
|
|
a start, and;
|
|
|
|
* if you are feeling more adventurous, try
|
|
|
|
[Running a Local Codex Network with Marketplace Support](docs/Marketplace.md)
|
|
|
|
using a local blockchain as well.
|
2022-06-23 21:45:42 +00:00
|
|
|
|
2023-03-29 12:55:17 +00:00
|
|
|
## API
|
2022-06-23 21:45:42 +00:00
|
|
|
|
2024-10-02 22:00:40 +00:00
|
|
|
The client exposes a REST API that can be used to interact with the clients.
|
|
|
|
Overview of the API can be found on [api.codex.storage](https://api.codex.storage).
|