DarkFi Node Architecture (DNA) ============================== The DarkFi ecosystem runs as a network of P2P nodes, where these nodes interact with each other over specific programs (or layers). In this section, we'll explain how each of the layers fit together and when combined create a functioning network that becomes DarkFi. The layers are organized as a bottom-up pyramid, much like the DarkFi logo: $$ \setminus validatord / $$ $$ \setminus darkfid / $$ $$ \setminus drk / $$ We will start with the top-level daemon - `validatord` - which serves as the consensus and data storage layer, then we will explain `darkfid` and its communication with the layer above (`validatord`), and the layer below (`drk`). An abstract view of the network looks like the following: ``` [drk] <--> [darkfid] <--> [validatord] <-+ | [drk] <--> [darkfid] <--> [validatord] <-+ ``` ## validatord `validatord` is the DarkFi consensus and data storage layer. Everyone that runs a validator participates in the network as a data archive, and is able to store incoming transactions, and relay them to other validators over the P2P network and protocol. Additionally, storing this data allows others to replicate it and participate in the same way. Provided there is a locked stake on a running validator, the node can also participate in the Proof-of-Stake consensus, enabling the ability to vote on incoming transactions rather than just relaying (and validating) them. In case the node is not participating in the consensus, it should still relay incoming transactions to other (ideally consensus-participating) validators in the network. ### Inner workings In its database, `validatord` stores transactions and blocks that have reached consensus. This is commonly known as a _"blockchain"_. The blockchain is a shared state that is replicated between all validators in the network. Additionally, validators keep a pool of incoming transactions and proposed blocks, which get validated and voted on by the consensus-participating validators. The lifetime of an incoming transaction (and block) is as follows: 1. Wait for a transaction 2. Validate incoming transaction (and go back to 1. if invalid) 3. Broadcast transaction to other validators in the network 4. Other validators validate transaction (and go back to 1. if invalid) 5. Leader validates the state transition and proposes a block 6. Consensus-participating nodes validate the state transition and vote on the proposed block if the state transition is valid. 7. If the block is confirmed, it is appended to the _blockchain_ and is replicated between all validators in the network. ## darkfid `TODO: Initial sync and retrieving wallet state?` `darkfid` is the client layer of DarkFi used for wallet management and transaction broadcasting. The wallet keeps a history of balances, _coins_, _nullifiers_, and _merkle roots_ that are necessary in order to create new transactions. By design, `darkfid` is a light client, since `validatord` stores all the blockchain data, and `darkfid` can simply query for anything it is interested in. This allows us to avoid data duplication and simply utilize our modular architecture. This also means that `darkfid` can easily be replaced with more specific tooling, if need be. ### Inner workings Using the P2P network and protocol, `darkfid` can subscribe to `validatord` in order to receive new _nullifiers_ and _merkle roots_ whenever a new block is confirmed. This allows `darkfid` to update its local state and enables it to create new valid transactions. `darkfid` exposes a JSON-RPC endpoint for clients to interact with it. This allows a number of things, such as: listing balances, creating and submitting transactions, key management, and more. When creating a new transactions, `darkfid` uses the local synced state in order to create new _coins_ and combine them in a transaction. This transaction is then submitted to the above validator layer where the transaction will get validated and voted on in order to be included into a block. ## drk `drk` is a client tool that interacts with `darkfid` in a user-friendly way and provides a command-line interface to the DarkFi network and its functionality. The interaction with `darkfid` is done over the JSON-RPC protocol and communicates with the endpoint exposed by `darkfid`.