Git Product home page Git Product logo

ziggurat's Introduction

Ziggurat

The Zcash Network Stability Framework

Ziggurat Logo

A Ziggurat is a rectangular stepped tower that uses precise measurements to ensure that each foundation can support the layers above. This metaphor can be applied to network testing by defining three layers:

  1. Conformance - adhering to the network protocol
  2. Performance - healthy throughput under pressure
  3. Resistance - avoiding malicious behavior

Ziggurat is network test suite that provides zcashd and zebra devs with this reliable foundation.

Note: This project is a work in progress.

Prerequisites

Ziggurat is written in stable Rust; you can install the Rust toolchain by following the official instructions here.

You also need to install at least one node implementation to test.

Zcashd

zcashd can be installed by using the official instructions for your operating system. We recommend building from source for consistency and to ensure you're using the right versions. Alternatively, you can use ECC's Debian/Ubuntu package or the binary tarball.

However, please note that Docker is not supported as it can theoretically produce unreliable test results and increases network complexity.

# After installing dependencies
$ git clone https://github.com/zcash/zcash
$ cd zcash
$ git checkout v4.4.1            # optional, or use master
$ ./zcutil/fetch-params.sh
$ ./zcutil/clean.sh
$ ./zcutil/build.sh -j$(nproc)   # or number of cores

After completing the above, you can skip the configuration steps, i.e. creating ~/.zcashd/zcash.conf as Ziggurat will create new configuration files for each test run. Also, syncing the blockchain is not required.

Zebra

zebra can be installed from its source code on GitHub. Although a Dockerfile is provided, Docker is not supported. We suggest following the instructions below, or similar.

# After installing dependencies
$ git clone https://github.com/ZcashFoundation/zebra
$ cd zebra
$ cargo +stable build

Similarly to zcashd, configuration is not necessary since Ziggurat generates new configurations for each test run.

Configuration

Ziggurat is configured via a config.toml file in the root directory. It must contain the following fields:

  • kind: one of zebra or zcashd.
  • path: absolute path in which to run the start command.
  • start_command: the command used to start the node

We recommend using the following ZCashd config:

kind = "zcashd"
path = "path/to/zcash/repo"
start_command = "./src/zcashd -debug=1 -printtoconsole -logips=1 -dnsseed=0 -dns=0 -listenonion=0"
# debug=1           enables debug logging
# logips=1          adds connection IP spans to the logs
# printtoconsole    logs to stdout
# dnsseed=0         disables looking for hardcoded DNS seeding nodes (we want to isolate our node to just the test)
# dns=0             disables DNS lookup
# listenonion=0     disables the Tor network

and for Zebra:

kind = "zebra"
path = "path/to/zebra/repo"
start_command = "cargo +stable r -- --verbose start"
# cargo +stable r   run Zebra using stable Rust
# --                all args after this will get passed to Zebra
# verbose           enables verbose logging
# start             starts the node

Building the docs

Ziggurat's documentation can be built with cargo doc --no-deps --open.

Running the Tests

Ziggurat currently uses rust's standard test runner, a simple cargo test -- --test-threads=1 should suffice. We use the single threaded executor as spinning up multiple test nodes isn't currently supported.

Logging

Logs are disabled by default, as they usually just add noise and slow down the test. They can be very useful for debugging and can be enabled on a test case level.

Ziggurat's SyntheticNode supports tracing - this can be enabled by inserting a call to synthetic_node::enable_tracing() inside the test case.

The test node's stdout and stderr logs can be piped to stdout by inserting a call to node.log_to_stdout(true) before starting the node. Note that logs will need to be enabled for the node as detailed in Configuration.

let mut node = Node::new().unwrap();
node.initial_action(Action::WaitForConnection)
    .log_to_stdout(true)    // pipes the node's `stdout` and `stderr` to `stdout`
    .start()
    .await
    .unwrap();

Test Status

Short overview of test cases and their current status. In case of failure, the behaviour observed for zebra and zcashd is usually documented in the test case.

These results were obtained by running the test suite against ZCashd v4.4.1 (0dade79ce) and Zebra 1.0.0-alpha.11 (6396ac2).

Legend
pass
fail
- unimplemented

Conformance

Test Case ZCashd Zebra Additional Information
001
002
003
004
005
006
007
008
009 ⚠ filters may need work (malformed), ⚠ require zcashd feedback
010
011 ⚠ todo: mempool seeding
012
013 ⚠ zcashd peering issues, zebra passes under certain conditions
014 ⚠ zcashd peering issues
015 - - ⚠ not yet implemented (blocked by mempool seeding)
016 - ⚠ todo: zebra block seeding
017 - ⚠ todo: zebra block seeding
018 ⚠ partially implemented (requires mempool seeding, and zebra block seeding)

Performance

Test Case ZCashd Zebra Additional Information
001
002

Resistance: fuzzing zeros

Test Case ZCashd Zebra Additional Information
001
002
003 Zcashd is extremely slow
004 Zcashd is extremely slow
005
006 -

Resistance: fuzzing random bytes

Test Case ZCashd Zebra Additional Information
001
002
003 Zcashd is extremely slow
004 Zcashd is extremely slow
005
006 -

Resistance: fuzzing random payloads

Test Case ZCashd Zebra Additional Information
001
002
003 Zcashd is extremely slow
004 Zcashd is extremely slow
005
006 -

Resistance: fuzzing corrupt messages

Test Case ZCashd Zebra Additional Information
001
002
003
004
005
006 -

Resistance: fuzzing corrupt checksum

Test Case ZCashd Zebra Additional Information
001
002
003
004
005
006 -

Resistance: fuzzing corrupt length

Test Case ZCashd Zebra Additional Information
001
002
003 Zcashd is extremely slow
004 Zcashd is extremely slow
005
006 -

ziggurat's People

Contributors

niklaslong avatar mirko-von-leipzig avatar aphelionz avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.