Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

飞儿506
150 0 0
假设有网络中有4个节点(A,B,C,D),每个节点都发送一笔交易,交易被包含在一个event里gossip到其他节点,一次gossip会把本节点的所知道的对方不知道的交易随机发送给其他节点,每个节点维护一个完整的图谱,通过投票算法,最后对每个event打一个时间戳,讲解具体逻辑前,我们先看一下event的数据结构。/ Y  m) H  Z5 [# z! f8 i
( {# P  w; r& K0 P
    typeEventstruct{! P: m; ^. V/ \* H; s, L. [- z
! L2 |6 W( X- ^2 ~0 m
    Transactions[][]byte//thepayload
. M6 t+ W$ u( ]
) c. l+ s. r% w8 V3 Q! Y# e    selfParentstring2 J' w$ j0 i1 y+ @

: s# ], l$ \, |* q0 m4 ]9 q% j: b    otherParentstring& y0 t0 k4 \, o* ~& L/ K1 d
5 E+ B$ [) ~+ z9 O+ w1 q
    Creator[]byte//creator’spublickey
+ @3 v' ~2 ~$ w! \6 F, H7 V, r# J8 Y
  S7 p7 M/ Y! s    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation3 C, Q8 E) `, V$ N. X

0 b4 N1 [: c5 q# T3 M* g2 F/ j    roundReceived*int" q* L% p3 A- G# _( q

$ R0 h/ Q6 z& M- j    consensusTimestamptime.Time
' t+ Q, d+ e( f4 y4 {8 }2 U: @! @% G& G" K; i8 x# s6 u' V
    }5 d2 A  t' E' W7 N& w) c

& b2 Q! b, |9 f4 ]) W    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。
& D9 X$ m( \2 k/ o& a8 O' R$ ]& M. A$ S" O2 I7 Y0 b; b/ F8 _6 P
    接下来我们来看看具体的共识过程' D+ d# L* k. |$ m! _4 ?& e
0 l; @8 g) ]" T' |
    第一步
% C7 i8 m7 q+ \& ^' O
% ?" E% J, ?6 ^8 v) v, m    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最后创建的)。0 N! {. }; T0 y* y$ ^* O
8 w+ q2 N" i+ W7 G2 j! c
    第二步3 w5 Y) g1 ]9 k$ ~  Z. _
2 B; J! @6 t5 J& R
    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。
4 Q  [6 ^' [1 w6 {9 K) j
0 K6 T* _; M$ A1 j$ u) p    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。2 a+ {) C. W: m1 q

" x6 b. r% h* a2 L/ N. b    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。1 S6 L9 R5 V! ?' {+ p

; ~/ v3 q8 [" k; g+ h5 F( I    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。
/ d# e7 u! B6 f5 D' A$ H
8 ^: j3 k& s9 G) M, _/ W- ]    第三步
# R5 g  o, H; y0 a5 B+ S9 ?+ t: |- m5 c0 n! F. I2 {1 l
    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。/ {4 u! g% B- }5 w

: X, l1 T' f# Z* H8 j6 d* t& E  T; F    第四步- z6 T. u0 `" H+ U2 D4 W1 v

6 a" R. ~! E3 b% t% ~+ Z    当确定了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。8 U, e1 p& h3 ]% F( M5 }. ]: p, a

: ?/ T8 l* {) @/ r6 n: g    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。$ D- M, E) R$ d6 a* P
; c% v: ], z$ W: d
    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/* V8 F9 j, k9 i: K3 y* }* h

. ]7 L9 O9 K# D4 c    ②想融入区块链技术的小圈子?添加研究员微信ALabsBlockChain就好啦~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11