2023-01-09 10:32:37 +00:00
|
|
|
Codex Contracts
|
2021-11-08 15:07:43 +00:00
|
|
|
================
|
|
|
|
|
2023-01-31 14:14:45 +00:00
|
|
|
An experimental implementation of the smart contracts that underlay the Codex
|
|
|
|
storage network. Its goal is to experiment with the rules around the bidding
|
|
|
|
process, the storage contracts, the storage proofs and the host collateral.
|
|
|
|
Neither completeness nor correctness are guaranteed at this moment in time.
|
2021-11-08 15:07:43 +00:00
|
|
|
|
|
|
|
Running
|
|
|
|
-------
|
|
|
|
|
|
|
|
To run the tests, execute the following commands:
|
|
|
|
|
|
|
|
npm install
|
|
|
|
npm test
|
|
|
|
|
2023-06-19 12:54:31 +00:00
|
|
|
You can also run fuzzing tests (using [Echidna][echidna]) on the contracts:
|
|
|
|
|
|
|
|
npm run fuzz
|
|
|
|
|
2021-11-16 15:15:11 +00:00
|
|
|
To start a local Ethereum node with the contracts deployed, execute:
|
|
|
|
|
|
|
|
npm start
|
|
|
|
|
|
|
|
This will create a `deployment-localhost.json` file containing the addresses of
|
|
|
|
the deployed contracts.
|
|
|
|
|
2021-11-08 15:07:43 +00:00
|
|
|
Overview
|
|
|
|
--------
|
|
|
|
|
2023-01-09 10:32:37 +00:00
|
|
|
The Codex storage network depends on hosts offering storage to clients of the
|
2021-11-08 15:07:43 +00:00
|
|
|
network. The smart contracts in this repository handle interactions between
|
2023-01-31 14:14:45 +00:00
|
|
|
client and hosts as they negotiate and fulfill a contract to store data for a
|
2021-11-08 15:07:43 +00:00
|
|
|
certain amount of time.
|
|
|
|
|
2023-01-31 14:14:45 +00:00
|
|
|
When all goes well, the client and hosts perform the following steps:
|
2021-11-08 15:07:43 +00:00
|
|
|
|
2023-01-09 15:01:43 +00:00
|
|
|
Client Host Marketplace Contract
|
2022-03-15 09:17:55 +00:00
|
|
|
| | |
|
|
|
|
| |
|
|
|
|
| --------------- request (1) -------------> |
|
|
|
|
| |
|
2022-06-13 11:33:18 +00:00
|
|
|
| ----- data (2) ---> | |
|
|
|
|
| | |
|
2023-01-31 14:14:45 +00:00
|
|
|
| ----- fill (3) ----> |
|
2021-11-08 15:07:43 +00:00
|
|
|
| |
|
2022-06-13 11:33:18 +00:00
|
|
|
| ---- proof (4) ----> |
|
2021-11-08 15:07:43 +00:00
|
|
|
| |
|
2022-06-13 11:33:18 +00:00
|
|
|
| ---- proof (4) ----> |
|
2021-11-08 15:07:43 +00:00
|
|
|
| |
|
2022-06-13 11:33:18 +00:00
|
|
|
| ---- proof (4) ----> |
|
2021-11-08 15:07:43 +00:00
|
|
|
| |
|
2022-06-13 11:33:18 +00:00
|
|
|
| <-- payment (5) ---- |
|
2021-11-08 15:07:43 +00:00
|
|
|
|
2022-03-15 09:17:55 +00:00
|
|
|
1. Client submits a request for storage, containing the size of the data that
|
|
|
|
it wants to store and the length of time it wants to store it
|
2022-06-13 11:33:18 +00:00
|
|
|
2. Client makes the data available to hosts
|
2023-01-31 14:14:45 +00:00
|
|
|
3. Hosts submit storage proofs to fill slots in the contract
|
|
|
|
4. While the storage contract is active, host prove that they are still
|
2022-03-15 09:17:55 +00:00
|
|
|
storing the data by responding to frequent random challenges
|
2023-01-31 14:14:45 +00:00
|
|
|
5. At the end of the contract the hosts are paid
|
2021-11-08 15:07:43 +00:00
|
|
|
|
|
|
|
Contracts
|
|
|
|
---------
|
|
|
|
|
2023-01-31 14:14:45 +00:00
|
|
|
A storage contract contains of a number of slots. Each of these slots represents
|
|
|
|
an agreement with a storage host to store a part of the data. Hosts that want to
|
|
|
|
offer storage can fill a slot in the contract.
|
|
|
|
|
|
|
|
A contract can be negotiated through requests. A request contains the size of
|
|
|
|
the data, the length of time during which it needs to be stored, and a number of
|
|
|
|
slots. It also contains the reward that a client is willing to pay and proof
|
|
|
|
requirements such as how often a proof will need to be submitted by hosts. A
|
|
|
|
random nonce is included to ensure uniqueness among similar requests.
|
2021-11-08 15:07:43 +00:00
|
|
|
|
|
|
|
When a new storage contract is created the client immediately pays the entire
|
|
|
|
price of the contract. The payment is only released to the host upon successful
|
|
|
|
completion of the contract.
|
|
|
|
|
2022-02-15 16:54:19 +00:00
|
|
|
Collateral
|
2021-11-08 15:07:43 +00:00
|
|
|
------
|
|
|
|
|
2022-02-15 16:54:19 +00:00
|
|
|
To motivate a host to remain honest, it must put up some collateral before it is
|
|
|
|
allowed to participate in storage contracts. The collateral may not be withdrawn
|
|
|
|
as long as a host is participating in an active storage contract.
|
2021-11-08 15:07:43 +00:00
|
|
|
|
2022-02-15 16:54:19 +00:00
|
|
|
Should a host be misbehaving, then its collateral may be reduced by a certain
|
2021-11-08 15:07:43 +00:00
|
|
|
percentage (slashed).
|
|
|
|
|
|
|
|
Proofs
|
|
|
|
------
|
|
|
|
|
2023-01-31 14:14:45 +00:00
|
|
|
Hosts are required to submit frequent proofs while a contract is active. These
|
|
|
|
proofs ensure with a high probability that hosts are still holding on to the
|
|
|
|
data that they were entrusted with.
|
2021-11-08 15:07:43 +00:00
|
|
|
|
2023-01-31 14:14:45 +00:00
|
|
|
To ensure that hosts are not able to predict and precalculate proofs, these
|
2022-03-15 09:17:55 +00:00
|
|
|
proofs are based on a random challenge. Currently we use ethereum block hashes
|
2021-11-08 15:07:43 +00:00
|
|
|
to determine two things: 1) whether or not a proof is required at this point in
|
2023-01-31 14:14:45 +00:00
|
|
|
time, and 2) the random challenge for the proof. Although hosts will not be able
|
|
|
|
to predict the exact times at which proofs are required, the frequency of proofs
|
|
|
|
averages out to a value that was set by the client in the request for storage.
|
2021-11-08 15:07:43 +00:00
|
|
|
|
|
|
|
Hosts have a small period of time in which they are expected to submit a proof.
|
|
|
|
When that time has expired without seeing a proof, validators are able to point
|
|
|
|
out the lack of proof. If a host misses too many proofs, it results into a
|
2022-02-15 16:54:19 +00:00
|
|
|
slashing of its collateral.
|
2021-11-08 15:07:43 +00:00
|
|
|
|
2023-01-31 14:14:45 +00:00
|
|
|
References
|
|
|
|
----------
|
|
|
|
|
|
|
|
* [A marketplace for storage
|
2023-05-25 09:56:04 +00:00
|
|
|
durability](https://github.com/codex-storage/codex-research/blob/master/design/marketplace.md)
|
2023-01-31 14:14:45 +00:00
|
|
|
(design document)
|
|
|
|
* [Timing of Storage
|
2023-05-25 09:56:04 +00:00
|
|
|
Proofs](https://github.com/codex-storage/codex-research/blob/master/design/storage-proof-timing.md)
|
2023-01-31 14:14:45 +00:00
|
|
|
(design document)
|
|
|
|
|
2021-11-08 15:07:43 +00:00
|
|
|
To Do
|
|
|
|
-----
|
|
|
|
|
|
|
|
* Actual proofs
|
|
|
|
|
|
|
|
Because the actual proof of retrievability algorithm hasn't been determined yet
|
|
|
|
we're using a dummy algorithm for now.
|
|
|
|
|
2023-01-31 14:14:45 +00:00
|
|
|
* Contract repair
|
2021-11-08 15:07:43 +00:00
|
|
|
|
2023-01-31 14:14:45 +00:00
|
|
|
Allow another host to take over a slot in the contract when the original
|
|
|
|
host missed too many proofs.
|
2021-11-08 15:07:43 +00:00
|
|
|
|
|
|
|
* Reward validators
|
|
|
|
|
|
|
|
A validator that points out missed proofs should be compensated for its
|
|
|
|
vigilance and for the gas costs of invoking the smart contract.
|
|
|
|
|
|
|
|
* Analysis and optimization of gas usage
|
|
|
|
|
2023-06-19 12:54:31 +00:00
|
|
|
[echidna]: https://github.com/crytic/echidna
|