#容错 #拜占庭 #模型 #同步 #时间 #部分 #usig

minbft

部分同步时间模型中的高效拜占庭容错

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 2023年8月16日

#200解析器实现


3 个crate中使用 (2 直接)

MIT 许可证

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.
}

联系

请通过 GitHubmatrix邮件 联系。

许可证

根据 MIT 许可证 许可。

依赖项

~4–5.5MB
~108K SLoC