Serai is a new DEX, built from the ground up, initially planning on listing Bitcoin, Ethereum, DAI, and Monero, offering a liquidity-pool-based trading experience. Funds are stored in an economically secured threshold-multisig wallet.
Find a file
Luke Parker 96f1d26f7a
Add a cosigning protocol to ensure finalizations are unique (#433)
* Add a function to deterministically decide which Serai blocks should be co-signed

Has a 5 minute latency between co-signs, also used as the maximal latency
before a co-sign is started.

* Get all active tributaries we're in at a specific block

* Add and route CosignSubstrateBlock, a new provided TX

* Split queued cosigns per network

* Rename BatchSignId to SubstrateSignId

* Add SubstrateSignableId, a meta-type for either Batch or Block, and modularize around it

* Handle the CosignSubstrateBlock provided TX

* Revert substrate_signer.rs to develop (and patch to still work)

Due to SubstrateSigner moving when the prior multisig closes, yet cosigning
occurring with the most recent key, a single SubstrateSigner can be reused.
We could manage multiple SubstrateSigners, yet considering the much lower
specifications for cosigning, I'd rather treat it distinctly.

* Route cosigning through the processor

* Add note to rename SubstrateSigner post-PR

I don't want to do so now in order to preserve the diff's clarity.

* Implement cosign evaluation into the coordinator

* Get tests to compile

* Bug fixes, mark blocks without cosigners available as cosigned

* Correct the ID Batch preprocesses are saved under, add log statements

* Create a dedicated function to handle cosigns

* Correct the flow around Batch verification/queueing

Verifying `Batch`s could stall when a `Batch` was signed before its
predecessors/before the block it's contained in was cosigned (the latter being
inevitable as we can't sign a block containing a signed batch before signing
the batch).

Now, Batch verification happens on a distinct async task in order to not block
the handling of processor messages. This task is the sole caller of verify in
order to ensure last_verified_batch isn't unexpectedly mutated.

When the processor message handler needs to access it, or needs to queue a
Batch, it associates the DB TXN with a lock preventing the other task from
doing so.

This lock, as currently implemented, is a poor and inefficient design. It
should be modified to the pattern used for cosign management. Additionally, a
new primitive of a DB-backed channel may be immensely valuable.

Fixes a standing potential deadlock and a deadlock introduced with the
cosigning protocol.

* Working full-stack tests

After the last commit, this only required extending a timeout.

* Replace "co-sign" with "cosign" to make finding text easier

* Update the coordinator tests to support cosigning

* Inline prior_batch calculation to prevent panic on rotation

Noticed when doing a final review of the branch.
2023-11-15 16:57:21 -05:00
.github Dockerfile Parts (#428) 2023-11-12 23:55:15 -05:00
audits Add coins/bitcoin audit by Cypher Stack 2023-08-21 01:20:09 -04:00
coins Make the output distribution cache only available under a feature 2023-11-13 00:24:54 -05:00
common Use a single long-lived RPC connection when authenticated 2023-11-07 17:42:19 -05:00
coordinator Add a cosigning protocol to ensure finalizations are unique (#433) 2023-11-15 16:57:21 -05:00
crypto Explicitly set features in modular-frost 2023-11-13 05:31:47 -05:00
docs Dockerfile Parts (#428) 2023-11-12 23:55:15 -05:00
message-queue Don't default to basic-auth if it's enabled, yet require it to be specified 2023-11-06 10:42:01 -05:00
mini Add support for multiple multisigs to the processor (#377) 2023-09-25 09:48:15 -04:00
orchestration Dockerfile Parts (#428) 2023-11-12 23:55:15 -05:00
processor Add a cosigning protocol to ensure finalizations are unique (#433) 2023-11-15 16:57:21 -05:00
substrate Add a cosigning protocol to ensure finalizations are unique (#433) 2023-11-15 16:57:21 -05:00
tests Add a cosigning protocol to ensure finalizations are unique (#433) 2023-11-15 16:57:21 -05:00
.gitattributes Correct audit file upload 2023-03-20 17:35:45 -04:00
.gitignore E2E test coordinator KeyGen 2023-08-14 06:54:17 -04:00
.rustfmt.toml .rustmfmt.toml: add edition 2023-07-20 15:28:03 -04:00
AGPL-3.0 Add an initial Substrate instantiation 2022-07-15 00:05:00 -04:00
Cargo.lock Convert coordinator/tributary/nonce_decider to use create_db macro (#423) 2023-11-12 12:04:34 -05:00
Cargo.toml Replace reqwest with simple-request 2023-11-06 09:47:12 -05:00
CONTRIBUTING.md Clarify identation policy 2022-10-11 00:40:50 -05:00
deny.toml Dex improvements (#422) 2023-11-12 06:37:31 -05:00
LICENSE Update licenses 2023-01-11 23:05:31 -05:00
README.md README.md: Add links to Reddit, Telegram and Website 2023-10-07 13:32:52 -04:00

Serai

Serai is a new DEX, built from the ground up, initially planning on listing Bitcoin, Ethereum, DAI, and Monero, offering a liquidity-pool-based trading experience. Funds are stored in an economically secured threshold-multisig wallet.

Getting Started

Layout

  • audits: Audits for various parts of Serai.

  • docs: Documentation on the Serai protocol.

  • common: Crates containing utilities common to a variety of areas under Serai, none neatly fitting under another category.

  • crypto: A series of composable cryptographic libraries built around the ff/group APIs, achieving a variety of tasks. These range from generic infrastructure, to our IETF-compliant FROST implementation, to a DLEq proof as needed for Bitcoin-Monero atomic swaps.

  • coins: Various coin libraries intended for usage in Serai yet also by the wider community. This means they will always support the functionality Serai needs, yet won't disadvantage other use cases when possible.

  • message-queue: An ordered message server so services can talk to each other, even when the other is offline.

  • processor: A generic chain processor to process data for Serai and process events from Serai, executing transactions as expected and needed.

  • coordinator: A service to manage processors and communicate over a P2P network with other validators.

  • substrate: Substrate crates used to instantiate the Serai network.

  • orchestration: Dockerfiles and scripts to deploy a Serai node/test environment.

  • tests: Tests for various crates. Generally, crate/src/tests is used, or crate/tests, yet any tests requiring crates' binaries are placed here.

Security

Serai hosts a bug bounty program via Immunefi. For in-scope critical vulnerabilities, we will reward whitehats with up to $30,000.

Anything not in-scope should still be submitted through Immunefi, with rewards issued at the discretion of the Immunefi program managers.