Zeno is a notariser that enables a POA group to copy messages between blockchains.
It gets a members list from an Ethereum contract, and those members participate to propagate merkle roots and PoW proofs between blockchains, using threshold n-of-m signatures.
Many of Zeno's components are built from scratch, including:
- A lightweight stateless POA consensus prototocol & P2P discovery.
- Ethereum data structures including transaction, ABI, closed Patricia merkle trie.
- ZCash Sapling transaction support.
- An Ethereum Solidity contract to proxy calls from a multisignature group.
Public Key cryptography provided by bindings to Secp256k1 from bitcoin-core.
On Ubuntu 18.04:
sudo apt-get install libsecp256k1-dev pkg-config
curl -sSL https://get.haskellstack.org/ | sh
git clone https://github.com/ssadler/zeno
cd zeno
stack install
If you are building libsecp256k1 yourself, configure with --enable-module-recovery
.
The name is from the Greek philosopher, Zeno of Elea.
Zeno coordinates a group of signatories to act as an oracle and deliver messages between blockchains.
It includes a simple consensus mechanism (with caveats), and code to interact with several different blockchains, currently including Komodo, Ethereum, and theoretically Bitcoin and ZCash.
The consensus process is a round comprised of many steps, where each step represents voting on a particular topic, or selecting a proposer when there's no obvious way to get a determinable result.
However, the limitation of the consensus process is that currently it does not provide any kind of finality, or solve the two generals problem. Zeno is itself stateless and relies on the chains it is posting messages to to provide finality instead. So at a given point in time, it can query the blockchain for the last recorded action and resume from that point.
Inventory, in general terms, is the set of votes from each member, so it's a mapping of member address to (signature, payload).
The inventory message is a tuple of {Index}{Request}{Inventory}
.
Index: a bitmask* advertising available inventory, in case peers want to query us for it.
Request: a bitmask* requesting inventory.
Inventory: A list of {20 bytes member address}{payload}
, where the payload depends on the StepNum.
- The bitmask is a bigint (encoding TBD) where each bit corresponds to the index of an address in the members list, which is sorted and supposed to be the same for all peers.