自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PBFT算法:有人作惡,如何達(dá)成共識(shí)?

云計(jì)算 分布式
在分布式系統(tǒng)中,節(jié)點(diǎn)可能會(huì)因?yàn)榫W(wǎng)絡(luò)故障、硬件故障,甚至惡意攻擊而產(chǎn)生不一致的狀態(tài)。因此,我們需要一種算法,即使在部分節(jié)點(diǎn)作惡或故障的情況下,系統(tǒng)也能夠達(dá)成一致——這就是 PBFT 的核心目標(biāo)。

今天我們將深入探討 PBFT(Practical Byzantine Fault Tolerance,實(shí)用拜占庭容錯(cuò)算法),這是區(qū)塊鏈技術(shù)和分布式系統(tǒng)中廣泛應(yīng)用的重要共識(shí)算法。

在分布式系統(tǒng)中,節(jié)點(diǎn)可能會(huì)因?yàn)榫W(wǎng)絡(luò)故障、硬件故障,甚至惡意攻擊而產(chǎn)生不一致的狀態(tài)。因此,我們需要一種算法,即使在部分節(jié)點(diǎn)作惡或故障的情況下,系統(tǒng)也能夠達(dá)成一致——這就是 PBFT 的核心目標(biāo)。

本文將分為以下幾個(gè)部分進(jìn)行講解:

  1. 拜占庭將軍問題的局限性
  2. PBFT的核心原理
  3. PBFT的執(zhí)行過程
  4. PBFT的Java實(shí)現(xiàn)示例與注釋
  5. PBFT的優(yōu)缺點(diǎn)
  6. 總結(jié)

一、拜占庭將軍問題的局限性

拜占庭將軍問題 提出了一種在存在不可靠節(jié)點(diǎn)的分布式環(huán)境中如何達(dá)成共識(shí)的問題。雖然該問題提出了理論解決方案,但它有以下幾個(gè)局限:

  1. 僅關(guān)注達(dá)成共識(shí),而不關(guān)注提議內(nèi)容的正確性:可能所有節(jié)點(diǎn)達(dá)成的共識(shí)是一個(gè)錯(cuò)誤的決定。
  2. 缺乏實(shí)際落地場(chǎng)景:該理論沒有考慮真實(shí)世界中的網(wǎng)絡(luò)延遲、性能開銷等問題。
  3. 無法處理動(dòng)態(tài)節(jié)點(diǎn)加入和退出:在實(shí)際的分布式系統(tǒng)中,節(jié)點(diǎn)的狀態(tài)是動(dòng)態(tài)變化的。

PBFT算法的引入

PBFT算法由 Miguel Castro 和 Barbara Liskov 在1999年提出,解決了上述問題,能夠在拜占庭錯(cuò)誤容錯(cuò)的前提下實(shí)現(xiàn)高效的共識(shí),并且更貼近實(shí)際工程需求。

二、PBFT的核心原理

PBFT的目標(biāo) 在最多容忍 f 個(gè)故障節(jié)點(diǎn)(總節(jié)點(diǎn)數(shù)為 3f+1)的情況下,確保:

  1. 安全性(Safety):即使有惡意節(jié)點(diǎn),也不會(huì)出現(xiàn)不一致的狀態(tài)。
  2. 活性(Liveness):系統(tǒng)能夠在合理時(shí)間內(nèi)達(dá)成共識(shí)。

基本思想

  • PBFT共識(shí)由一系列的消息傳遞協(xié)議組成。
  • 共識(shí)分為 Pre-prepare、Prepare 和 Commit 三個(gè)階段。
  • 需要至少 (2f+1) 個(gè)節(jié)點(diǎn)投票確認(rèn)才能達(dá)成共識(shí)。

三、PBFT的執(zhí)行過程

PBFT 的共識(shí)過程分為以下幾個(gè)階段:

  1. 請(qǐng)求階段(Request)
  • 客戶端向主節(jié)點(diǎn)發(fā)送請(qǐng)求。
  1. 預(yù)準(zhǔn)備階段(Pre-Prepare)
  • 主節(jié)點(diǎn)收到請(qǐng)求后,將請(qǐng)求廣播給所有副本節(jié)點(diǎn)。
  1. 準(zhǔn)備階段(Prepare)
  • 副本節(jié)點(diǎn)收到主節(jié)點(diǎn)的廣播后,進(jìn)行驗(yàn)證,并將 Prepare 消息廣播給其他節(jié)點(diǎn)。
  1. 提交階段(Commit)
  • 副本節(jié)點(diǎn)收到足夠的 Prepare 消息后,再次廣播 Commit 消息。
  1. 響應(yīng)階段(Reply)
  • 當(dāng)節(jié)點(diǎn)收到足夠的 Commit 消息后,執(zhí)行請(qǐng)求,并向客戶端發(fā)送響應(yīng)。
  1. 客戶端驗(yàn)證
  • 客戶端收到足夠多的節(jié)點(diǎn)響應(yīng)后,認(rèn)為請(qǐng)求執(zhí)行成功。

四、PBFT的Java實(shí)現(xiàn)示例

4.1 項(xiàng)目結(jié)構(gòu)

pbft/
│
├── Main.java           // 主程序入口
├── PBFTNode.java       // PBFT節(jié)點(diǎn)類
├── Message.java        // 消息定義類
├── State.java          // 節(jié)點(diǎn)狀態(tài)
└── Client.java         // 客戶端類

4.2 定義消息類(Message.java)

public class Message {
    public enum Type {
        REQUEST, PRE_PREPARE, PREPARE, COMMIT, REPLY
    }

    private Type type;
    private String content;
    private int senderId;

    public Message(Type type, String content, int senderId) {
        this.type = type;
        this.content = content;
        this.senderId = senderId;
    }

    public Type getType() {
        return type;
    }

    public String getContent() {
        return content;
    }

    public int getSenderId() {
        return senderId;
    }

    @Override
    public String toString() {
        return "Message{" +
                "type=" + type +
                ", content='" + content + '\'' +
                ", senderId=" + senderId +
                '}';
    }
}

說明:

  • 定義了 PBFT 中的消息類型(REQUEST、PRE_PREPARE、PREPARE、COMMIT、REPLY)。
  • 每個(gè)消息包含消息類型、消息內(nèi)容和發(fā)送者ID。

4.3 定義節(jié)點(diǎn)類(PBFTNode.java)

import java.util.*;

public class PBFTNode {
    private int id;
    private boolean isPrimary;
    private Map<String, Integer> prepareVotes = new HashMap<>();
    private Map<String, Integer> commitVotes = new HashMap<>();

    public PBFTNode(int id, boolean isPrimary) {
        this.id = id;
        this.isPrimary = isPrimary;
    }

    public void receiveMessage(Message message) {
        switch (message.getType()) {
            case REQUEST:
                if (isPrimary) {
                    broadcastPrePrepare(message.getContent());
                }
                break;
            case PRE_PREPARE:
                broadcastPrepare(message.getContent());
                break;
            case PREPARE:
                prepareVotes.put(message.getContent(), prepareVotes.getOrDefault(message.getContent(), 0) + 1);
                if (prepareVotes.get(message.getContent()) >= 2) {
                    broadcastCommit(message.getContent());
                }
                break;
            case COMMIT:
                commitVotes.put(message.getContent(), commitVotes.getOrDefault(message.getContent(), 0) + 1);
                if (commitVotes.get(message.getContent()) >= 2) {
                    System.out.println("Node " + id + " committed message: " + message.getContent());
                }
                break;
        }
    }

    private void broadcastPrePrepare(String content) {
        System.out.println("Node " + id + " broadcasting PRE_PREPARE: " + content);
    }

    private void broadcastPrepare(String content) {
        System.out.println("Node " + id + " broadcasting PREPARE: " + content);
    }

    private void broadcastCommit(String content) {
        System.out.println("Node " + id + " broadcasting COMMIT: " + content);
    }
}

說明:

  • 主節(jié)點(diǎn)收到 REQUEST 消息后廣播 PRE_PREPARE。
  • 副本節(jié)點(diǎn)驗(yàn)證后廣播 PREPARE,達(dá)到閾值后再?gòu)V播 COMMIT。

4.4 客戶端類(Client.java)

public class Client {
    public void sendRequest(PBFTNode primary, String request) {
        System.out.println("Client sending REQUEST: " + request);
        primary.receiveMessage(new Message(Message.Type.REQUEST, request, -1));
    }
}

4.5 主程序(Main.java)

public class Main {
    public static void main(String[] args) {
        PBFTNode node1 = new PBFTNode(1, true);
        PBFTNode node2 = new PBFTNode(2, false);
        PBFTNode node3 = new PBFTNode(3, false);

        Client client = new Client();
        client.sendRequest(node1, "Operation A");
    }
}

五、PBFT的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 容錯(cuò)性強(qiáng),可容忍 f 個(gè)拜占庭節(jié)點(diǎn)。
  • 廣泛應(yīng)用于區(qū)塊鏈、金融系統(tǒng)等。

缺點(diǎn):

  • 消息開銷大,節(jié)點(diǎn)數(shù)增加時(shí)性能下降。
  • 網(wǎng)絡(luò)復(fù)雜度高。

六、總結(jié)

PBFT算法通過多輪投票和消息傳遞,在存在惡意節(jié)點(diǎn)的情況下實(shí)現(xiàn)了共識(shí)。這種算法在Hyperledger Fabric、Zilliqa等區(qū)塊鏈平臺(tái)中得到了實(shí)際應(yīng)用。

責(zé)任編輯:武曉燕 來源: 架構(gòu)師秋天
相關(guān)推薦

2023-09-12 09:00:00

2020-06-10 12:01:47

2019-10-31 10:04:54

DevOps開發(fā)團(tuán)隊(duì)

2021-05-31 08:01:11

Raft共識(shí)算法

2020-11-10 17:10:44

區(qū)塊鏈共識(shí)算法

2021-04-19 08:16:53

算法Raft 共識(shí)

2018-09-17 14:30:40

2023-10-17 16:35:05

人工智能

2021-03-04 17:55:27

算法Raft分布式

2020-02-13 17:27:31

CAPPaxos 共識(shí)算法

2009-04-24 08:35:07

iPhone蘋果移動(dòng)OS

2018-02-09 11:08:49

區(qū)塊鏈算法主流

2021-12-13 16:12:50

區(qū)塊鏈比特幣技術(shù)

2009-05-31 09:18:44

魔獸團(tuán)隊(duì)暴雪九城

2018-08-19 11:00:05

2022-10-13 08:32:26

區(qū)塊鏈共識(shí)機(jī)制

2024-03-19 09:25:32

2024-03-28 12:20:17

2020-01-22 16:50:32

區(qū)塊鏈技術(shù)智能

2013-01-16 15:10:19

云計(jì)算大數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)