2022-06-23 21:45:42 +00:00
# Codex Decentralized Durability Engine
> 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.
> 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
2022-08-19 02:40:11 +00:00
For detailed instructions on preparing to build nim-codex see [*Building Codex* ](BUILDING.md ).
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
```
The executable will be placed under the `build` directory under the project root.
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
The order of priority is the same as above: Cli arguments > Env variables > Config file values.
### Environment variables
In order to set a configuration option using environment variables, first find the desired CLI option
and then transform it in the following way:
1. prepend it with `CODEX_`
2. make it uppercase
3. replace `-` with `_`
For example, to configure `--log-level` , use `CODEX_LOG_LEVEL` as the environment variable name.
### Configuration file
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:
```toml
2023-06-16 16:20:49 +00:00
log-level = "trace"
2023-05-02 13:06:34 +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
```
2022-08-19 02:40:11 +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-01-29 19:31:29 +00:00
--repo-kind Backend for main repo store (fs, sqlite) [=fs].
2023-02-15 19:40:21 +00:00
-q, --storage-quota The size of the total storage quota dedicated to the node [=8589934592].
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].
2022-08-19 02:40:11 +00:00
--persistence Enables persistence mechanism, requires an Ethereum node [=false].
2022-06-23 21:45:42 +00:00
--eth-provider The URL of the JSON-RPC API of the Ethereum node [=ws://localhost:8545].
2022-08-19 02:40:11 +00:00
--eth-account The Ethereum account that is used for storage contracts [=EthAddress.none].
2024-01-29 19:31:29 +00:00
--eth-private-key File containing Ethereum private key for storage contracts [=string.none].
--marketplace-address Address of deployed Marketplace contract [=EthAddress.none].
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].
2022-06-23 21:45:42 +00:00
Available sub-commands:
codex initNode
```
2023-05-15 07:02:57 +00:00
#### Logging
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-06-16 16:20:49 +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
2022-06-23 21:45:42 +00:00
### Example: running two Codex clients
2023-02-09 09:56:01 +00:00
To get acquainted with Codex, consider running the manual two-client test described [HERE ](docs/TWOCLIENTTEST.md ).
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
2023-03-29 12:55:17 +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 ).