4 个版本 (稳定)
1.0.3 | 2024年5月29日 |
---|---|
1.0.2 | 2024年5月10日 |
1.0.0 | 2024年4月26日 |
0.10.0 | 2023年9月29日 |
0.0.0-reserved |
|
#200 在 解析器实现
545KB
10K SLoC
MinBFT
MinBFT 是基于同名的拜占庭容错共识算法的 Rust 实现,该算法在论文 Efficient Byzantine Fault-Tolerance 中提出。
MinBFT 需要一个独特的顺序标识符生成器 (USIG) 实现。一个与这个 MinBFT 实现兼容的 USIG 实现可以在 这里 找到。请注意,此实现不使用可信执行环境,因此不应在不受信任的环境中使用。
此实现是作为 ABCperf 项目 的一部分创建的。在 ABCperf 中的集成也存在 这里。
MinBFT 应用实例
use anyhow::Result;
use std::{num::NonZeroU64, time::Duration};
use serde::{Deserialize, Serialize};
use shared_ids::{ReplicaId, ClientId, RequestId};
use usig::{Usig, noop::UsigNoOp};
use minbft::{MinBft, Config, Output, RequestPayload, PeerMessage, timeout::{TimeoutType}};
// The payload of a client request must be implemented by the user.
#[derive(Deserialize, Serialize, Clone, Debug, Eq, PartialEq)]
struct SamplePayload {}
impl RequestPayload for SamplePayload {
fn id(&self) -> RequestId {
todo!()
}
fn verify(&self, id: ClientId) -> Result<()> {
todo!()
}
}
// The output should be handled by the user.
fn handle_output<U: Usig>(output: Output<SamplePayload, U>) {
let Output { broadcasts, responses, timeout_requests, .. } = output;
for broadcast in broadcasts.iter() {
// broadcast message to all peers, i.e., send messages contained
// in `broadcasts` of struct Output over the network to other
// replicas.
todo!();
}
for response in responses.iter() {
todo!();
}
for timeout_request in timeout_requests.iter() {
todo!();
}
}
fn main() {
// define the amount of replicas that form the atomic broadcast
let n = NonZeroU64::new(10).unwrap();
// define the maximum amount of faulty replicas (`n >= t / 2 + 1`)
let t = n.get() / 2;
// define the ID of one of the replicas
let replica_id = ReplicaId::from_u64(0);
let config = Config {
n: n.try_into().unwrap(),
t,
id: replica_id,
max_batch_size: Some(1.try_into().expect("> 0")),
batch_timeout: Duration::from_secs(1),
initial_timeout_duration: Duration::from_secs(1),
checkpoint_period: NonZeroU64::new(2).unwrap(),
};
// can be exchanged with a different USIG implementation
let usig = UsigNoOp::default();
let (mut minbft, output) = MinBft::<SamplePayload, _>::new(
usig,
config,
)
.unwrap();
// handle output to setup connection with peers
handle_output(output);
// all peers are now ready for client requests as they have
// successfully communicated with each replica for the first time.
// create and send client message to be handled by replicas.
let some_client_message: SamplePayload = todo!();
let output = minbft.handle_client_message(ClientId::from_u64(0), some_client_message);
handle_output(output);
// after the atomic broadcast achieves consensus,
// a response to the client request can be seen in the output struct.
}
联系
许可证
根据 MIT 许可证 许可。
依赖项
~4–5.5MB
~108K SLoC