https://github.com/nervosnetwork/moodyblues-client-rust
Replay overlord
https://github.com/nervosnetwork/moodyblues-client-rust
Last synced: over 1 year ago
JSON representation
Replay overlord
- Host: GitHub
- URL: https://github.com/nervosnetwork/moodyblues-client-rust
- Owner: nervosnetwork
- License: mit
- Created: 2019-11-22T12:28:11.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2019-12-23T15:23:33.000Z (over 6 years ago)
- Last Synced: 2025-03-09T05:52:02.433Z (over 1 year ago)
- Language: Rust
- Homepage:
- Size: 20.5 KB
- Stars: 1
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# MoodyBlues SDK For Rust
## Intro
A tracer SDK for [Overlord][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 serde_json::{json, to_string};
use moodyblues_sdk::event::{EventType, TraceEvent};
use moodyblues_sdk::point::{Metadata, TracePoint};
use moodyblues_sdk::trace;
use moodyblues_sdk::time::now;
struct ConsensusStateMachine {
epoch_id: u64,
round_id: u64,
}
impl ConsensusStateMachine {
fn new_epoch(&mut self, epoch_id: u64) {
self.epoch_id = &self.epoch_id + 1;
self.round_id = 0;
// create a trace point mark as starts with epoch
trace::start_epoch(epoch_id);
}
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.epoch_id);
}
}
struct Consensus;
impl Consensus {
fn verify_signature(signature: String, hash: String) {
trace::custom(
"verify_signature".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.write_all(to_string(&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::set_boxed_tracer(WriteReporter::new(File::create("log.log").unwrap()));
trace::start_epoch(1);
}
```
## Documentation
TODO for now, jump to `trace.rs` for more information. The API may be frequent changes before the first release version.
[overlord]: https://github.com/nervosnetwork/overlord