Bỏ qua

Đồng thuận BFT

Tổng quan

Thành phần này cần caller tích hợp riêng. Chạy nhiều node API hoặc đặt BFT_ENABLED không tự nối PBFT vào MainChain/Sub-Chain.

Thành phần thư viện BFT được export và demo độc lập sử dụng PBFT 3 pha. Nó yêu cầu n >= 3f + 1 để chịu được f node lỗi hoặc gian lận. Luồng runtime MainChain và SubChain hiện tại không khởi tạo BFT; bên gọi sử dụng tường minh BFTConsensus.request().

Với chi tiết PoA và PoF, xem Cơ chế Đồng thuận.

Yêu cầu hệ thống: tối thiểu 4 node để chịu 1 lỗi Byzantine (n=4, f=1: 3x1+1=4).

Biểu đồ luồng: PBFT 3 pha

sequenceDiagram
    autonumber
    participant C as Client
    participant L as Primary
    participant R1 as Replica 1
    participant R2 as Replica 2
    participant R3 as Replica 3

    rect rgb(0, 0, 0, 0)
        Note over L,R3: PHASE 1 — PRE-PREPARE
        C->>L: request(operation)
        L->>L: Hash full canonical request and record local PREPARE
        L->>R1: PRE-PREPARE(view, seq, digest, request)
        L->>R2: PRE-PREPARE(view, seq, digest, request)
        L->>R3: PRE-PREPARE(view, seq, digest, request)
    end

    rect rgb(0, 0, 0, 0)
        Note over L,R3: PHASE 2 — PREPARE
        R1->>R1: Recompute digest and record local PREPARE
        R2->>R2: Recompute digest and record local PREPARE
        R3->>R3: Recompute digest and record local PREPARE
        R1->>L: PREPARE(view, seq, digest)
        R2->>L: PREPARE(view, seq, digest)
        R3->>L: PREPARE(view, seq, digest)
        Note over L,R3: Each node records its local COMMIT after 2f unique PREPARE votes
    end

    rect rgb(0, 0, 0, 0)
        Note over L,R3: PHASE 3 — COMMIT
        L->>R1: COMMIT(view, seq, digest)
        R1->>L: COMMIT(view, seq, digest)
        R2->>L: COMMIT(view, seq, digest)
        Note over L,R3: Apply after 2f+1 unique COMMIT votes, including the local vote
        R1->>R1: Apply event to the attached chain
    end

Primary và replica mỗi node đếm đúng một phiếu giai đoạn có chữ ký của chính mình. PRE-PREPARE bị từ chối nếu nội dung request không khớp với digest đã ký. Nếu thao tác ghi vào chain được gắn vào phát sinh lỗi hoặc trả về False, node giữ các message quorum và event ổn định trong bộ nhớ; một COMMIT hợp lệ được gửi lại có thể thử lại thao tác ghi. Node chỉ đánh dấu sequence đã cam kết sau khi thao tác ghi thành công.

Khi không gắn application chain, thành phần chạy ở chế độ chỉ đồng thuận và ghi nhận trạng thái consensus mà không ghi event, như demo độc lập.

Tiếp nhận yêu cầu xảy ra trước commit. Trạng thái thử lại nằm trong bộ nhớ và không bảo đảm áp dụng đúng một lần sau kết quả ghi không rõ ràng hoặc khởi động lại. Xem Thành phần BFT để biết giới hạn truyền tải, cấu hình, phát lại và ZK.

Biểu đồ luồng: Thay đổi phiên (View Change)

sequenceDiagram
    autonumber
    participant ledger as 🖥️ Validator 1
    participant VM as 🔄 BFTViewChangeManager
    participant NEW as 👑 New Leader

    Note over ledger: Leader timeout detected (no PRE-PREPARE received)

    ledger->>VM: initiate_view_change(new_view)
    VM->>VM: Broadcast VIEW-CHANGE to all validators
    VM->>VM: Collect and validate 2f+1 VIEW-CHANGE votes
    VM->>NEW: Elect new leader: Validators[new_view % n]
    NEW->>NEW: Broadcast NEW-VIEW message
    NEW->>NEW: Activate the new view

Các bước chi tiết

Bước Mô tả
PRE-PREPARE Primary gán số thứ tự, băm toàn bộ request chuẩn, ký digest và phát request.
PREPARE Mỗi node tính lại digest và ghi nhận đúng một phiếu PREPARE của mình. Mỗi node chuyển sang COMMIT sau 2f phiếu PREPARE duy nhất, bao gồm phiếu của chính nó.
COMMIT Mỗi node đã PREPARED ghi nhận và phát đúng một phiếu COMMIT của mình. Node áp dụng event sau 2f + 1 phiếu COMMIT duy nhất, bao gồm phiếu của chính nó.
View Change Nếu leader im lặng quá timeout, manager thu thập 2f + 1 phiếu VIEW-CHANGE có chữ ký trước khi chấp nhận view mới.

So sánh thuật toán đồng thuận

Thuật toán Cơ chế Khả năng chịu lỗi Trường hợp dùng
PoA Dựa trên danh tính, node có thẩm quyền ký khối Danh tiếng validator Mạng riêng / nội bộ
PoF Luân phiên leader height % n; xác thực thông thường kiểm tra chữ ký của leader Phân tán niềm tin Mạng liên doanh / đa tổ chức
BFT Thành phần thư viện PBFT 3 pha Chịu tới f node Byzantine trong 3f+1 Bên gọi tường minh và demo độc lập

Xử lý lỗi

Tình huống Hành vi
Leader không phản hồi Kích hoạt View Change; primary mới là all_nodes[new_view % n]
Validator gửi digest không hợp lệ Phiếu bị loại, không tính vào quorum
Đạt quorum COMMIT có chữ ký Việc áp dụng cần 2f + 1 phiếu khác nhau cho cùng yêu cầu
Thiếu phiếu COMMIT Yêu cầu chưa được áp dụng cho đến khi đủ phiếu hợp lệ
Ghi chain được gắn vào thất bại Giữ quorum COMMIT hiện tại và thử lại cùng event khi COMMIT hợp lệ được gửi lại

Lớp và phương thức chính

Bước Lớp / Phương thức Tệp
Request và PRE-PREPARE BFTConsensus.request() consensus/bft/consensus.py
Xác thực PRE-PREPARE và PREPARE cục bộ BFTConsensusEngine.handle_pre_prepare() consensus/bft/engine.py
Quorum PREPARE và COMMIT cục bộ BFTConsensusEngine.handle_prepare() consensus/bft/engine.py
Quorum COMMIT và áp dụng event BFTConsensusEngine.process_commit_quorum() consensus/bft/engine.py
View Change BFTViewChangeManager.initiate_view_change() consensus/bft/view_change.py
Giao thức mạng BFTMessageDispatcher.broadcast_msg() consensus/bft/dispatcher.py

Liên quan