MoodyBlues SDK For Rust

Intro

A tracer SDK for Overlord like consensus algorithm, helps you to debug or optimize the algorithm.

The consensus algorithm always plays with a distributed system, debugging or optimizing is so hard. If we can record events to describe what happens when consensus state changes, and then replay with a visualization dashboard, the debugging or optimizing would be easier.

Quick start

Let's starts with a dead simple trace. This example shows how to use the sdk for write the TracePoint in file with JSON format.

Cargo.toml

toml [dependencies] moodyblues-sdk = { git = "https://github.com/nervosnetwork/moodyblues-client-rust" }

```rust use std::fs::File; use std::io::Write; use std::sync::Mutex;

use serdejson::{json, tostring};

use moodybluessdk::event::{EventType, TraceEvent}; use moodybluessdk::point::{Metadata, TracePoint}; use moodybluessdk::trace; use moodybluessdk::time::now;

struct ConsensusStateMachine { blockheight: u64, roundid: u64, }

impl ConsensusStateMachine { fn newblock(&mut self, blockheight: u64) { self.blockheight = &self.blockheight + 1; self.roundid = 0; // create a trace point mark as starts with block trace::startblock(block_height); }

fn new_round(&mut self, round_id: u64) {
    self.round_id = round_id;

    // create a trace point mark as starts with round
    trace::start_round(self.round_id, self.block_height);
}

}

struct Consensus;

impl Consensus { fn verifysignature(signature: String, hash: String) { trace::custom( "verifysignature".to_string(), Some(json!({ "hash": hash, "signature": signature })), ) } }

struct WriteReporter { reporter: Mutex, }

impl WriteReporter { fn new(writable: W) -> Box> { Box::new(WriteReporter { reporter: Mutex::new(writable), }) } }

impl trace::Trace for WriteReporter { fn report(&self, point: TracePoint) { let mut file = self.reporter.lock().unwrap(); file.writeall(tostring(&point).unwrap().as_bytes()); }

fn metadata(&self) -> Metadata {
    // information of current node
    Metadata {
        address: "0x0000000000000000000000000000000000000000".to_string(),
    }
}

fn now(&self) -> u64 {
    // timestamp for each point
    now()
}

}

fn main() { trace::setboxedtracer(WriteReporter::new(File::create("log.log").unwrap())); trace::start_block(1); } ```

Documentation

TODO for now, jump to trace.rs for more information. The API may be frequent changes before the first release version.