Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

小白学习区块链之:DAG的算法逻辑

飞儿506
183 0 0
假设有网络中有4个节点(A,B,C,D),每个节点都发送一笔交易,交易被包含在一个event里gossip到其他节点,一次gossip会把本节点的所知道的对方不知道的交易随机发送给其他节点,每个节点维护一个完整的图谱,通过投票算法,最后对每个event打一个时间戳,讲解具体逻辑前,我们先看一下event的数据结构。9 ]- |. U* P+ r$ a0 o
( C: y$ a4 c& L0 O" w
    typeEventstruct{% O& y$ l' m& p- ?

3 \& X: U& P6 R0 D    Transactions[][]byte//thepayload& ~& b! I1 w7 V* g+ J! q

8 X1 g% U! s% I9 F5 I- d    selfParentstring
( o( c" E$ |/ J  q8 N9 a5 ]: @4 h
3 ?* q- D+ x: n2 o" w+ M2 s/ Q    otherParentstring
4 Z4 a: h  p6 H3 ]1 ~5 e: B; o0 I% r9 U
    Creator[]byte//creator’spublickey
! z* ~* H2 n+ h1 }6 z! \; e1 }6 E1 }& I# J5 F3 j
    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation
5 P$ X" T$ d& `& j
8 B" `0 k* }7 I  C2 N5 d- E    roundReceived*int/ Z( P+ ]" J/ ?3 H+ ~

4 F" G, ^# S' n" y# Y  Y# [    consensusTimestamptime.Time
; x9 J2 r4 i. U6 u5 [/ [" {# v# u
7 B- ?, Y" j7 X3 [/ X    }# a9 x& m" ~. V% J1 a. c1 G" V1 N+ o

. x1 u8 e% T2 T7 p    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。' b9 o7 H0 R4 Q1 G
6 T8 Z$ z/ H0 u+ c3 s2 a! M
    接下来我们来看看具体的共识过程
1 _( f0 ?/ {; X4 x; m, k( _5 S1 W7 N  u; H
    第一步
% P1 z. {* ]- s; t
; m, ]: `  E' ?3 D: q* @/ g    A,B,C,D在初始化时,各自创建一个rootEvent,然后B随机选择一个节点(假设选中的是D),然后B把自己所知道的D不知道的所有Events发送给D(这里只有B在一开始创建的rootEvent),D创建一个新的Event(该Event的selfParent为D的rootEvent,otherParent是B的rootEvent),然后D再随机把自己知道的Event(包括新创建的)全部发送给B,B再创建一个新的Event,这样B就知道了4个Event(自己创建的两个和D创建的两个),D知道3个Event(不包括B最后创建的)。/ g7 s: ^1 t) P; P. J7 _. C, Y* F

; l- M7 y( f% g; c# g6 L) G7 U& l    第二步3 [5 _! x9 f6 q/ g9 u
7 R$ ^+ N3 S- R; q4 }
    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。* F* D  w6 u" h" G4 S2 y
, Y! k/ S5 R, [  X# u
    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。% F$ L$ M6 C) d+ d  U

4 ]  ^9 S. l6 |) H    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。. ]" k/ a/ X& x  u! S. |: s1 l
) }" Q, h2 |3 f
    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。
  D1 R  c6 s) k% Z% c8 h9 [& ~1 I5 s5 x; l& }
    第三步8 l, j& U9 U0 g1 D% G: s

* H& A3 \! H2 H' g    famouswitness的确定机制是,下一层round里的witness对上一层可见的witness进行投票,再下一层round里的witness来计票,具体规则是,如果一个witness(A3)对上一层里的witness(B2)可见,那么投YES,当所有投票的witness(A3,B3,C3,D3)对被投票的witness(B2)投了YES,那么被投票的witness(B2)声明为famous,再下一层的witness(B4)对参与投票的witness(A3,B3,C3,D3)如果是强可见的,那么计票为YES,那么该投票是有效的,当有效的票数超过2/3,那么被投票的witness(B2)选为famouswitness。# e6 z1 W* W7 A3 i$ R' ?: p

3 t' \, ^6 F5 J; T, Q9 k    第四步
; W" o5 R, r1 p% T) t
8 ]% p% O8 M1 ?; K( b  D& C5 }    当确定了famouswitnesses,我们就可以为events找到一个consensusTimestamp和一个roundRecevied,规则是,当一个event(X)可以被下一层round里的所有famouswitnesses看见,那么该event(X)的roundRecevied便是看见它所有famouswitnesses所在的round值,该event(X)的consensusTimestamp确定规则是,找出所有famouswitness的祖先event,并且是该event(X)的子孙的events,把这些events的时间戳排序,然后找中间的那个时间戳作为该event(X)的consensusTimestamp。) U3 F' l, {# u/ ]

7 k( _4 t0 G: X& G/ {    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。: B+ B6 b; j' N1 o9 {: B
8 `: s5 _3 d5 l, ~
    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/
/ Z: |% A8 N/ e) j# M4 y$ J9 `) a8 \, c" |3 M
    ②想融入区块链技术的小圈子?添加研究员微信ALabsBlockChain就好啦~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11