Now we're back to using regular bdk types, which is a big advantage.
Side BFT-CRDT PoC
This is a proof of concept implementation of a BFT-CRDT blockchain system.
Prerequisites
Install a recent version of Rust.
Running in development
Run the watcher first:
cd side-watcher
cargo watch -x run
To init a Side node:
cd side-node
cargo run -- init node1
cargo run -- init node2
cargo run -- init node3
cargo run -- init node4
To start a node with a cargo watch for development purposes (from the side-node dir), open up a few terminals and run:
cargo watch -x "run -- run -- node1"
cargo watch -x "run -- run -- node2"
cargo watch -x "run -- run -- node3"
cargo watch -x "run -- run -- node4"
You can then type directly into each of the Side Node consoles. Messages will be relayed to each Side Node, and the transaction history will end up being the same on all nodes.
Discussion
What we have here is a very simple system comprised of two key parts: the Side Node, and the Side Watcher.
Side Node(s)
The Side Nodes make up a system of BFT-CRDT-producing nodes that can make a blockchain. Currently they can reliably send transactions to each other in a secure way, such that all nodes they communicate with can tell whether received transactions are obeying the rules of the system.
The Side Node does not download any chain state, and if one goes off-line it will miss transactions. This is expected at the moment and fairly easy to fix, with a bit of work.
Next dev tasks:
- we don't need a Watcher, the first node can act as a leader until people decide they don't want to trust it any more
- the leader node can have a timer in it for block creation
- code up the ability to switch leaders (can be a human decision at first, later an (optional) automated choice)
- pick a commit and reveal scheme to remove MEV. One thing to investigate is single-use seals
- enable Side Nodes to download current P2P chain state so that they start - out with a consistent copy of transaction data, and also do catch-up after going off-line
- remove the proc macro code from bft-json-crdt
- add smart contract execution engine (CosmWasm would be a good first choice)
- enable Side Nodes to download contract code for a given contract
- enable Side Nodes to download current contract state for a given contract
- switch to full P2P messaging instead of websockets
Side Watcher
The Side Watcher is a simple relayer node that sits between the Side Chain (Cosmos) and the decentralized Side Nodes. At the moment, it simply relays transactions between nodes via a websocket. We aim to eliminate this component from the architecture, but for the moment it simplifies networking and consensus agreement while we experiment with higher-value concepts.
To fulfill the promises in the Lite Paper, the Side Watcher needs to:
- make a block for the BFT-CRDT chain when the Side Chain creates a block
- submit BFT-CRDT chain data to the Side Chain
Later, we will aim to remove the Side Watcher from the architecture, by (a) moving to pure P2P transactions between Side Nodes, and (b) doing leader election of a Side Node to reach agreement on the submitted block.
Bitcoin integration
There is an Esplora Bitcoin client integrated into the node
Simple coin transfers
The client can do simple coin transfers using esplora and the Mutinynet server's Signet (30 second blocktime).
The client's demo driver can be run by doing:
cargo run -- init dave
cargo run -- init sammy
cargo run -- btc-transfer
You'll need to have funded the "dave" address prior to running the btc command - otherwise the transfer will fail gracefully.
I have been using this primarily as a way to experiment with constructing and broadcasting Bitcoin transactions, with the hope that it would be possible to move on to more advanced constructions (e.g. state channels).
HTLCs (in progress)
An experimental driver for Bitcoin Hash Time Locked Contracts (HTLCs).
Possible uses
DKG
It strikes me that there are many, many systems which rely on a trusted setup, and which might be able to use Distributed Key Generation (DKG) instead. SNARK systems for instance all have this problem.
It is not necessarily the case that e.g. signer participants and validators are the same entities. Being able to quickly spin up a blockchain and use it to sign (potentially temporary or ephemeral) keyshare data might be pretty useful.
Cross chain transfers
The ability to be part of multiple consensus groups at once might provide new opportunities for cross-chain transfers.