Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

飞儿506
116 0 0
假设有网络中有4个节点(A,B,C,D),每个节点都发送一笔交易,交易被包含在一个event里gossip到其他节点,一次gossip会把本节点的所知道的对方不知道的交易随机发送给其他节点,每个节点维护一个完整的图谱,通过投票算法,最后对每个event打一个时间戳,讲解具体逻辑前,我们先看一下event的数据结构。7 q& K8 c* ]; w

" v" E) S( V; |1 j5 w7 s    typeEventstruct{
5 |* m& V0 D- a* f1 `
3 S( ]. y( i& \2 G) R# o5 S    Transactions[][]byte//thepayload( R2 B' X) d5 h, H- g' x7 z% l

$ Y! [) g+ ~' M    selfParentstring
4 F" V$ v3 j' z% T7 M" k; ]5 [  A# a& k* m/ k
    otherParentstring4 l1 U/ b2 W2 y4 A  P7 ?

) }0 k6 r% {9 Y9 }7 O    Creator[]byte//creator’spublickey( q5 h+ {4 Y% P# |! I. s0 U0 J
8 r& r5 P1 M. |# M2 a- Q6 {8 B8 ]' j
    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation4 N' F; W5 r$ y6 w2 O  d
' I! t# [+ R4 J) ~- {# m
    roundReceived*int
! j4 l) p2 [9 q6 i% h" S4 H4 I) k: y  h6 N# C0 U5 ?$ H2 e
    consensusTimestamptime.Time
" m* i$ ^7 y5 V2 I" s5 B7 A. d9 [. |" o3 L
    }2 T9 y3 e; h( \, O! `. ~

% U* `6 F! H9 O% p' ^    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。1 L; U; {* _, N
0 k( o  E; x! G% o/ w/ Q* Z
    接下来我们来看看具体的共识过程" t  A( u) q3 i0 \

  |. c* t- o2 ?    第一步
- _3 S6 ?  L" I& |% O( t  N3 I  b- T- E
    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最后创建的)。
4 A9 P, P, q5 P* o* H" K4 G& A2 R! S
    第二步
& N' a# h1 V; c9 k1 f9 Z6 v/ \' T0 h+ g; \
    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。4 }" O: {" Q) {8 N, l+ M  m
& H! y% C. W6 x. Q5 x
    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。
- v9 Q& F; Y& W, W9 a6 d9 v( a! f5 e( X) t3 G5 T/ z2 o5 c
    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。4 s# k8 ~/ d* [( y

2 M* Y5 X) l! e4 {9 D4 v    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。
  t' e& r3 q1 c$ z* t- p% I$ H( I* p. x$ V5 q
    第三步, n# R+ X: r* t' n. S

' Y4 U/ O! f4 V6 _7 D* @1 D7 L% 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。7 N# _% e9 `- I
/ b8 n7 \, ?. p* x
    第四步# U5 c" ~* n5 _. ~1 m

+ U! L0 u1 m5 }- c& r    当确定了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。% Z- e, w) w( b. J
# M- t; i% s9 r( h2 J
    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。
% W* ]+ C( X; Y9 @% R" `
6 D1 u' ^# Y9 I3 q6 I    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/4 y* @9 H7 l& h) U3 l: M
" _; p4 V, y  p
    ②想融入区块链技术的小圈子?添加研究员微信ALabsBlockChain就好啦~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11