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.
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
impl
impl
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); } ```
TODO for now, jump to trace.rs
for more information. The API may be frequent changes before the first release version.