Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

飞儿506
207 0 0
假设有网络中有4个节点(A,B,C,D),每个节点都发送一笔交易,交易被包含在一个event里gossip到其他节点,一次gossip会把本节点的所知道的对方不知道的交易随机发送给其他节点,每个节点维护一个完整的图谱,通过投票算法,最后对每个event打一个时间戳,讲解具体逻辑前,我们先看一下event的数据结构。
2 x! e. w  Y, x0 t( @1 r7 ]' Z, a3 m$ f, z2 h' t: C+ J
    typeEventstruct{; D* G* C% @! P. }' O4 j3 y) c
; }5 @% x. Q$ Y  }) ?6 w
    Transactions[][]byte//thepayload
% Q* R5 F: ^, x" P4 p+ R8 |4 t- B# H* Y1 `1 v/ }
    selfParentstring3 }. ^' M" S  E; q4 q
1 A9 F0 V" j: r$ y' f# i# ~
    otherParentstring+ N$ P3 F' @7 E) A# D+ _& I) e
" O" w# D3 R6 g- h9 Q
    Creator[]byte//creator’spublickey9 ?1 k/ G6 I1 |$ a6 l" Z3 x
/ t. {, p; {5 k( W0 N0 Q
    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation
3 H5 N" a+ \8 L7 ?- V. `1 |
( g8 m' ?1 @5 F9 z% B    roundReceived*int. u% d% V0 d' o" k6 G
+ g- [$ `+ ^) g
    consensusTimestamptime.Time, J  j1 u0 V% z4 l4 L

; |2 H& P4 k+ ^- ^9 H    }
% c/ E* R* F$ E3 X1 R- h: P+ g6 }* S8 E9 J* j' H
    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。& Z( g7 M: r) z
: Y& F2 \0 A  Y% R! L9 C) v
    接下来我们来看看具体的共识过程
  i$ M5 W; Y1 W. d) }, }0 ]& {3 q
    第一步( R$ W7 H+ d9 x: \0 z7 K& g5 {7 n

; J4 a  E7 P  N5 H; I! ^3 {# k    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最后创建的)。6 I$ [9 X& Y8 L& I+ L" D0 m
$ ~2 p/ [/ |5 z2 I& t
    第二步
  p+ ?% w) X. j" }' e' @* M4 b+ I# ?/ C. Q9 m$ R
    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。
6 l; I* F" S6 O4 s  V# L' p, W: \1 r6 |+ P# z, D
    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。
% |% j3 M4 i6 E$ v' Y& M, H1 R/ H5 v$ `/ G. E9 p
    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。& m8 A9 J9 o3 q  `3 t* K
3 R# v& y: t0 e& j: U3 n2 @$ y
    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。
7 c% m7 g  M: {/ U" n! G/ t2 R7 j) v4 v* i, m, p: ^; n/ ]
    第三步, r3 l# J1 z4 @: m/ X
5 B2 w9 w8 [1 D) E3 j  ?* A
    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。
# B1 ?; K: K; _$ m0 s5 b7 x( X$ @/ d: g8 A* [( w# T
    第四步5 ]+ o) d0 `5 ?4 i$ g4 @- k& S' J
' t1 U4 h4 ~2 m' j
    当确定了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。* R+ i% k9 z! N% E$ q
2 m5 g  _$ E& L7 d' N' V
    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。' q* u$ @7 a4 F# p

$ O4 P& E: ?! H/ T% t& \7 v; a    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/
3 l1 m$ D8 n* V6 ^4 D
. W/ [+ \- L6 `: ^/ r7 S3 \    ②想融入区块链技术的小圈子?添加研究员微信ALabsBlockChain就好啦~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11