​​

  • 核心算法说明

    • 基于chained实现,整体上是当前轮推动下一轮共识继续下去, 如此来持续运转下去, 数据有效性证明基于(QC)实现

      • leader广播proposal消息{round, qc, propsal}
      • replica收到proposal后本地计算后发送投票信息到下一个leader
      • 下一个leader负责聚合(qc_aggrate)后再通过proposal消息广播出来进入下一轮
    • 活性证明, 数据有效性基于(TC)实现
      • 每个节点一旦进入一轮新的共识就会开始计时, 一旦超时就广播timeout_vote消息
      • 其他节点收到后本地放到pending_vote队列中, 然后开始本地等待其他节点的timeout_vote投票来名聚合, 一旦签名聚合成功, 则进入下一轮, 并计算相应轮次的leader, 给该leader发起投票,如此将重新起搏整条链的共识
    • 关于轮次
      • 每个节点的轮次是严格递增的,只有收到有效数据才会增加轮次,增加轮次的规则就是看(QC和TC)两者的高度谁高,谁高那就使用谁的轮次,因为TC/QC都是有法律效应的

活性证明【降维到传统pbft广播实现】

libra活性证明基于tc(timeoutcetificate)来实现,在每轮启动时(收到proposal处理时)本地设置一个定时器,该定时器触发后直接广播timeoutvote_msg到所有节点,每个节点自己本地聚合生成相应的timeoutcetificate,一旦聚合完成就会round+1,然后投递vote信息到round + 1的leader,这样round + 1的leader又可以驱动起来。为了对齐时间,间隔时间会随着本地timeout次数的增加而变长,每次以1.5的n个指数被递增。直到收到新的leader发出来的proposal为止。

1.触发:

本地设置timeout时间process_local_timeout在timeout时广播timeout_vote

// 处理本地超时事件
    pub async fn process_local_timeout(&mut self, round: Round) {
        // 根据当前轮次信息和base_ms设置超时, 一旦超时则抛出timeout事件, 然后又触发到proces_local_timeout
        // 注意:这里不会引起轮次增加
        pacemaker.process_local_timeout(round)
        // 根据情况广播timeout_vote
        let timeout_vote_msg = VoteMsg::new(timeout_vote, self.gen_sync_info());
        // 广播,每个节点都广播出来
        self.network.broadcast_vote(timeout_vote_msg).await
    }

2.投票处理

收到timeoutvotemsg,收到的节点自己聚合

// 处理投票业务
    pub async fn process_vote(&mut self, vote_msg: VoteMsg) {
        if !vote_msg.vote().is_timeout() {
            // ...非超时投票处理
        } else {
            // 添加投票信息
            self.add_vote(vote_msg.vote();
        }
    }

// 统计投票信息
    async fn add_vote(&mut self, vote: &Vote) -> anyhow::Result<()> {
        // Add the vote and check whether it completes a new QC or a TC
        let res = self.pending_votes.insert_vote(vote, &self.validators);

match res {
            VoteReceptionResult::NewQuorumCertificate(qc) => {
                // ..
                // 聚合qc签名
                self.new_qc_aggregated(qc, vote.author()).await
            }
            // 觉tc签名
            VoteReceptionResult::NewTimeoutCertificate(tc) => self.new_tc_aggregated(tc).await,
        }
    }

// tc聚合处理
    async fn new_tc_aggregated(&mut self, tc: Arc<TimeoutCertificate>) -> anyhow::Result<()> {
        // 证书处理
        self.process_certificates(
            self.block_store.highest_quorum_cert().as_ref(),
            Some(tc.as_ref()),
        )
    }

3.certificate处理

接收certificate后进行处理

async fn process_certificates(
        &mut self,
        qc: &QuorumCert,
        tc: Option<&TimeoutCertificate>,
    ) -> anyhow::Result<()> {
        // pacemaker处理证明, 触发轮次切换
        if let Some(new_round_event) = self.pacemaker.process_certificates(
            Some(qc.certified_block().round()),
            tc_round,
            highest_committed_proposal_round,
        ) {
            // 切换轮次, 如果是leader则广播proposal, 如果不是leader则等着
            self.process_new_round_event(new_round_event).await;
        }
    }

// 处理certificate的时候明确new-round,pacemaker更新本地round
    pub fn process_certificates(
        &mut self,
        hqc_round: Option<Round>,
        htc_round: Option<Round>,
        highest_committed_round: Option<Round>,
    ) -> Option<NewRoundEvent> {
        // 明确计算出新的轮次后才会更新轮次
        let new_round = std::cmp::max(qc_round, tc_round) + 1;
        if new_round > self.current_round {
            // Start a new round.
            self.current_round = new_round;
            // 新轮次重置超时
            let timeout = self.setup_timeout();
            let new_round_reason = if qc_round >= tc_round {
                NewRoundReason::QCReady
            } else {
                NewRoundReason::Timeout
            };
            let new_round_event = NewRoundEvent {
                round: self.current_round,
                reason: new_round_reason,
                timeout,
            };
            debug!("Starting new round: {}", new_round_event);
            return Some(new_round_event);
        }

}

4.切换轮次

async fn process_new_round_event(&mut self, new_round_event: NewRoundEvent) {
        // 基于roating leader选择算法选择leader
        // backup什么事情都不做
        if self
            .proposer_election
            .is_valid_proposer(self.proposal_generator.author(), new_round_event.round)
            .is_none()
        {
            return;
        } else {
            // leader广播new  proposals
            let proposal_msg = match self.generate_proposal(new_round_event).await {
                // ...
            };
            network.broadcast_proposal(proposal_msg).await;
        }
    }

5.参与新的共识

libra共识算法分析的更多相关文章

  1. 许式伟看 Facebook 发币(上): 区块链, 比特币与 Libra 币

    你好,我是七牛云许式伟. Facebook(脸书)于6月18日发布了其加密数字货币项目白皮书.该数字货币被命名为 Libra(天秤座),象征着平衡与公正.此前,BBC 报道说这个数字货币叫 Globa ...

  2. Facebook也炒币吗?Libra币是什么?

    Facebook 在上周发布了加密数字货币,称为 Libra币. 太火爆了,很多人都在关注和讨论,包括一些科技大佬们都很积极的讨论(当然,这里指的是真正的科技大佬,比如 马化腾.王兴等,而不是指哪些割 ...

  3. [转帖]技术人眼中的Facebook Libra

    技术人眼中的Facebook Libra https://www.jianshu.com/p/ddc733077749 比特币 以太坊 EOS Libra 0.8352019.07.01 14:15: ...

  4. Facebook libra开发者文档- 3 -Life of a Transaction交易生命周期

    Life of a Transaction交易的生命周期 https://developers.libra.org/docs/life-of-a-transaction 为了更深入地了解Libra交易 ...

  5. Facebook libra开发者文档- 2 -Libra Protocol: Key Concepts核心概念

    Libra Protocol: Key Concepts https://developers.libra.org/docs/libra-protocol Libra区块链是一个加密认证的分布式数据库 ...

  6. Facebook libra白皮书

    https://libra.org/en-US/white-paper/ An Introduction to Libra Libra的使命是建立一个简单的全球货币和金融基础设施,为数十亿人服务.该文 ...

  7. Facebook币Libra学习-5.Move组织目录

    Move是一种新的编程语言,旨在为Libra Blockchain提供安全可编程的基础. 组织 Move语言目录由五部分组成: 的虚拟机(VM),其中包含的字节码格式,字节码解释器,和基础设施执行事务 ...

  8. Facebook币Libra学习-2.交易生命周期

    交易生命周期 为了更加深入的理解Libra的交易生命周期,我们将跟随一个交易的全过程,从其被提交到Libra validator始,直至其被添加到区块链上止.我们将“放大”来看每个validator逻 ...

  9. Facebook币Libra学习-1.核心概念

    Libra区块链是一个基于Libra协议的加密认证的分布式数据库.本文将简略介绍Libra协议的核心概念.其详细说明请参阅Libra技术白皮书. Libra区块链由分布式的Validator节点网络维 ...

随机推荐

  1. JS代码,从一个数组中得到连号的数并显示

    JavaScript code function m() { var k = [1, 2, 7, 8, 9, 11, 22, 35, 36]; ) return; ; ; ; ; i < k.l ...

  2. OpenCV 输入输出XML和YAML文件

    #include <opencv2/core/core.hpp> #include <iostream> #include <string> using names ...

  3. libphp5.so可能遇到的问题(转摘)

    libphp5.so可能遇到的问题(转摘) 安装完APACHE和PHP5后,经常在启动APACHE载入libphp5.so时发现问题.我把遇到的问题统计下来: 1.undefined symbol:S ...

  4. c/c++ main 函数命令行参数的使用

    C程序最大的特点就是所有的程序都是用函数来装配的.main()称之为主函数,是所有程 序运行的入口.其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的是有参函数,则参数在调用 ...

  5. 公式化学习requests(第一卷)

    个人来讲我不是很喜欢REQURST这个第三方模块,一点不好用不如URLLIB,但身为技术人员,模块你可以不用但是你得会,就像生活质量我这个东西我不用但是我得有 先拿百度做个案例: 看下代码 结果为: ...

  6. 植物基因组|注释版本问题|重测序vs泛基因组

    生命组学: 细菌和其他物种比,容易发生基因漂移,duplication和重排. 泛基因组学研究的一般思路是通过comparison找到特殊基因区域orspecific gene,研究其调控机制(即通过 ...

  7. Android开发之《硬件加速》

    Intel® SDK for OpenCL™ Applications Support:https://software.intel.com/en-us/intel-opencl-support/co ...

  8. 2016年3月13日 FXStreet首席分析师:欧元/美元下周走势展望

    FX168讯 欧元/美元在经历周初沉闷的走势之后,最终在欧洲央行出台一系列措施促进通货膨胀和经济增长之后怒涨至近一个月最高位.欧洲央行决议公布之前,投资者预期存款利率将下调10至15个基点,并可能进一 ...

  9. html常用事件

    1.onblur 当窗口失去焦点时运行 2.click 点击鼠标触发的事件 3.onfocus 当窗口获得焦点时运行 4.oninput 当元素获得用户输入时运行 5.onsubmit 当提交表单时运 ...

  10. 语言发展与python

    编程语言的发展史(机械语言.汇编语言.高级语言) 机械语言:直接使用二进制与计算机沟通,直接操作硬件,执行效率高,开发效率低. 汇编语言:用简单的英文代替二进制,直接操作硬件,执行效率较机械语言低,开 ...