Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

飞儿506
120 0 0
假设有网络中有4个节点(A,B,C,D),每个节点都发送一笔交易,交易被包含在一个event里gossip到其他节点,一次gossip会把本节点的所知道的对方不知道的交易随机发送给其他节点,每个节点维护一个完整的图谱,通过投票算法,最后对每个event打一个时间戳,讲解具体逻辑前,我们先看一下event的数据结构。& q: _0 ^, q: B$ M. r
1 {( v1 w6 V- h/ ?' p* Z
    typeEventstruct{
1 v9 q. o5 h- X9 m0 ?4 Q, Z1 B8 H
$ o  [; S- Y7 W' g7 R    Transactions[][]byte//thepayload
% u) V" l; a" `* X  ~! r7 Q: h
& b4 k: P: S  S) x- I    selfParentstring
" q0 M0 ^3 U: D. ?& c) m( S6 O7 s# g0 K$ z+ p# p/ A
    otherParentstring! o9 J6 V1 _5 e
) A& i: S* U' k7 `/ x3 N
    Creator[]byte//creator’spublickey
5 @7 ^" V/ X7 \  x: a
9 Z. L) o, v- u6 Y) j: ~' h    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation# w; x* I8 D" B( z" V' [# J/ ^9 N

4 T. k$ s' ^  c  w- f3 d8 h    roundReceived*int: t% a* O1 y& f9 t- _

% B) X. k/ E: d) h: X3 e    consensusTimestamptime.Time% n7 v9 P3 I8 E3 V1 _& m
6 g4 U5 @' `- G% k
    }4 a1 [& \, [5 b' D0 a. c2 O

( h& C; C! T; a2 T  C. a    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。! g: N- }/ i( F3 V/ @- q
% e- M7 O- S* [6 j* t6 W
    接下来我们来看看具体的共识过程5 n$ @+ T7 s9 F: r6 X, j

9 r  Y) o2 p6 W/ s; Z! K    第一步
7 J0 g1 I$ g- b
0 o: |: B0 }6 \& _  c) h8 B% o    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最后创建的)。" j1 s6 J0 x  O- ?
& [" Y  N0 D8 \6 P& c; W* W
    第二步
) d' j0 [* t( D3 e+ t# n8 z/ v$ K5 R. Z; V% v
    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。
- |- E5 Y' {1 k5 D6 Q
6 P8 D6 ]1 O0 X3 N/ q    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。" h+ C" ?. I: M) D- a

. Z. l. s9 ~: ?+ v+ `1 f6 D6 j    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。& w$ j( V' L, U3 _6 w% C1 z

( ?( r9 [- S* J  T/ D0 F) ]    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。# p" c$ }9 O- i4 [6 [' p* o7 E
; H/ k! H9 F- B. _- S) _+ s6 Q% q
    第三步
$ R% \: b5 q& {) c) K4 Y
% k/ m# w6 V) I% v, w/ q" x3 `    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。
  s, f% P, I% u1 J3 `( |4 V3 G6 g
    第四步) c: T4 _1 h- r8 ]2 Y' b8 x

) l, S$ h7 v- j' C    当确定了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。
& m% w5 C6 m' A3 L: u! S: j
( t& C2 c4 g5 X1 A9 S' {+ v- w  a1 {    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。0 R' `' i) `" G, f) C2 b

# ^% {3 H3 b; ?/ L; @7 c! u$ R- c* V    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/
& Q# `2 x7 W, x$ S- ^1 U8 B5 l: K6 q3 F4 O3 ?% }
    ②想融入区块链技术的小圈子?添加研究员微信ALabsBlockChain就好啦~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11