111

- 1 min

classDiagram
    class Certificate {
        <<enumeration>>
        V1(CertificateV1)
        V2(CertificateV2)
    }
    
    class `CertificateV1\n当足够多的验证节点对交易进行了签名\n(即满足拜占庭容错机制所需的数量),\n这些签名会被聚合成一个certificate。` {
        Header header
        AggregateSignatureBytes aggregated_signature
        roaring::RoaringBitmap signed_authorities
        Metadata metadata
    }

    class Bullshark {
        Committee committee
        ProtocolConfig protocol_config
        Arc~ConsensusStore~ store
        Round max_inserted_certificate_round
        Arc~ConsensusMetrics~ metrics
        Instant last_successful_leader_election_timestamp
        u64 num_sub_dags_per_schedule
        LeaderSchedule leader_schedule
    }


    class LeaderSchedule {
        Committee committee
        Arc~RwLock~LeaderSwapTable~~ leader_swap_table
    }
    class LeaderSwapTable {
        Round round
        Vec~Authority~ good_nodes
        HashMap~AuthorityIdentifier, Authority~ bad_nodes
    }
    LeaderSwapTable-->round



    class Authority {
        AuthorityIdentifier id
        PublicKey protocol_key
        PublicKeyBytes protocol_key_bytes
        Stake stake
        Multiaddr primary_address
        NetworkPublicKey network_key
        String hostname
        bool initialised
    }


    class ConsensusStore {
        DBMap~AuthorityIdentifier, Round~ last_committed
        DBMap~SequenceNumber, ConsensusCommit~ committed_sub_dags_by_index_v2
    }

    class `Proposer按照轮次` {
        AuthorityIdentifier authority_id#58; 当前 Proposer 的标识符,用于标识哪个节点在提议新的 Header。\n
        Committee committee
        usize header_num_of_batches_threshold#58;触发 Header 创建的批处理数量阈值。当可用的批处理数量至少达到这个值时,将尝试提议新的 Header。\n
        usize max_header_num_of_batches#58;Header 中可以包含的最大批处理数量,限制 Header 的大小。\n
        Duration max_header_delay
        Duration min_header_delay
        Option~Duration~ header_resend_timeout
        ConditionalBroadcastReceiver rx_shutdown#58;接收关闭信号的通道。\n
        Receiver~(Vec~Certificate~, Round) ~ rx_parents#58;从核心模块接收要包含在下一个 Header 中的父节点及其轮次信息的通道。\n
        Receiver~OurDigestMessage~ rx_our_digests#58; 从工作节点接收批处理摘要的通道。\n
        Sender~Header~ tx_headers#58;向 Certifier(认证器)发送新创建的 Header 的通道。\n
        ProposerStore proposer_store#58;持久化存储最后一个 Header 的存储。\n
        Round round#58;当前 DAG 的轮次。\n
        Option~TimestampMs~ last_round_timestamp
        watch:#58;Sender~Round~ tx_narwhal_round_updates#58;向其他模块信号发送新的 Narwhal 轮次的通道。\n
        Vec~Certificate~ last_parents#58;等待包含在下一个 Header 中的父节点 ID 集合。\n
        Option~Certificate~ last_leader#58;上一个轮次的领导者(如果有的话)的证书。\n
        VecDeque~OurDigestMessage~ digests#58;等待包含在下一个 Header 中的批处理摘要。按照 FIFO(先进先出)顺序保存。\n
        BTreeMap~Round, (Header, VecDeque~OurDigestMessage~) ~ proposed_headers#58; 保存前一轮次提议的 Header 及其摘要信息的映射,确保所有包含的批处理摘要最终都会被重新发送。\n
        Receiver~(Round, Vec~Round~) ~ rx_committed_own_headers#58;接收关于哪些自己的 Header 已被提交的更新的通道。\n
        Arc~PrimaryMetrics~ metrics 指标处理器,用于收集和报告性能指标。\n
        LeaderSchedule leader_schedule
    }
    `Proposer按照轮次`-->round

    class Committee {
        BTreeMap~PublicKey, Authority~ authorities
        BTreeMap~AuthorityIdentifier, Authority~ authorities_by_id
        Epoch epoch
        Stake quorum_threshold
        Stake validity_threshold
    }


    Committee-->epoch

    class `ProposerStore对数据库的写入` {
        DBMap~ProposerKey, Header~ last_proposed
    }

    class Header {
        <<enumeration>>
        V1
    }

    class HeaderV1 {
        AuthorityIdentifier author创建这个header的节点的标识,确保这是由一个合法的节点创建和广播的。\n
        Round round当前共识流程中的轮次号,用于区分不同的共识轮次。\n
        Epoch epoch当前区块链的纪元(epoch),用于区分不同的时间段。每个纪元可以有不同的验证节点集合。\n
        TimestampMs created_at
        IndexMap~BatchDigest, (WorkerId, TimestampMs) 其中包含了多个批处理数据的摘要(BatchDigest),IndexMap 是一个按插入顺序保存的键值对数据结构,确保数据的顺序性。\n\n
        BTreeSet~CertificateDigest~ parents#58; 父header的集合,通常用于构建DAG(有向无环图)结构,确保当前header的继承性和依赖性。\n
        OnceCell~HeaderDigest~ digest#58;当前header的哈希摘要(HeaderDigest),用于快速验证该header的完整性。OnceCell是一种懒加载机制,只有在需要时才会计算哈希值,并且一旦计算完成,就不会再改变。\n
    }



    %% Relationships
    Bullshark --> Committee

    Bullshark --> ConsensusStore
    Bullshark --> LeaderSchedule

    LeaderSchedule --> Committee
    LeaderSchedule --> LeaderSwapTable

    LeaderSwapTable --> Authority : bad_nodes


    LeaderSwapTable --> Authority : good_nodes



    `Proposer按照轮次` --> Committee
    `Proposer按照轮次` --> `ProposerStore对数据库的写入`
    `Proposer按照轮次` --> LeaderSchedule : leader_schedule

    Committee --> Authority

    Certificate --> `CertificateV1\n当足够多的验证节点对交易进行了签名\n(即满足拜占庭容错机制所需的数量),\n这些签名会被聚合成一个certificate。`

    `Proposer按照轮次` --> Certificate : last_parents

    `ProposerStore对数据库的写入` --> Header
    `CertificateV1\n当足够多的验证节点对交易进行了签名\n(即满足拜占庭容错机制所需的数量),\n这些签名会被聚合成一个certificate。` --> Header : header


    Header --> HeaderV1

    `Proposer按照轮次` --> Certificate : last_leader


epoch: commitee,

epoch –> round

round: leader_swap_talbe(good_nodes, bad_nodes), proposer(DAG)