Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

飞儿506
121 0 0
假设有网络中有4个节点(A,B,C,D),每个节点都发送一笔交易,交易被包含在一个event里gossip到其他节点,一次gossip会把本节点的所知道的对方不知道的交易随机发送给其他节点,每个节点维护一个完整的图谱,通过投票算法,最后对每个event打一个时间戳,讲解具体逻辑前,我们先看一下event的数据结构。
, }. o2 L+ \+ \  W# _
: w! r& e" C0 o4 t: l4 v1 r    typeEventstruct{6 o  Y4 z5 [3 E0 Y) n( q5 x

  f" Y& h0 D8 b! t7 J    Transactions[][]byte//thepayload2 Y/ S# @' f& n+ Y1 M! N
7 b: ?: n9 q3 V2 e6 ?; u
    selfParentstring
" ?: @  H# J# f: y) }9 n# K* R  w0 X5 c8 T' H( g
    otherParentstring
1 b  q% v+ _" O" }; Z
! K. \7 D! K" \1 k0 e    Creator[]byte//creator’spublickey
! ?$ t2 i! L% Z. e" C
$ ~+ f3 R  J8 I    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation& _) [3 z6 Z7 w& }* v

# O* o3 l8 l" X, p" X    roundReceived*int7 X0 a' u" `  _

5 h0 n9 h0 w$ h  R. T    consensusTimestamptime.Time
: x2 q! Y/ [# w/ U+ ^9 `: j& |5 q" ^+ [5 {2 w4 V9 L4 i/ p
    }! C$ J+ G8 K+ W" f' [

7 I0 D( T+ G; a' a$ W    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。
+ @9 ^7 z3 F8 g& g
6 d2 v/ M( S, K: O3 t+ c0 m! `    接下来我们来看看具体的共识过程+ i/ ^( h+ k) `0 ~
+ T8 n% s; [: e; {
    第一步5 y4 B6 E6 e8 m0 E3 [  `
; {. j# H2 y! _) x# n* |/ Q: H
    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最后创建的)。! L  d+ P. J3 P

& Y2 T, c/ b9 p" q) Y    第二步) d1 u  l* \/ n4 `$ X
/ K' z! j$ C* l5 p* c0 m2 c; f; B
    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。
+ ?2 Y* u  a% Y( N1 l
$ y1 H# f' D. l) o4 U9 }7 s    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。2 o2 c, v; q/ `( Z$ m+ b) Z
( x3 z0 J% r9 k" Q/ t; E3 G& b+ q
    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。  A, G( U0 ^3 M: l2 G
4 s+ _$ H# ~. \
    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。9 b% Z3 Z3 T! J# W" G" |
6 [0 D2 s; B% k& l$ V8 w3 O* n
    第三步$ q) J" W* {: r/ |8 }3 A3 `% {
1 `- a$ J( ]; I. R6 P6 N
    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, U+ h* m" d0 h+ ^

& p) t; S! w0 R$ C2 [    第四步
8 {; I) K1 f4 `: W+ p  E! a8 Y! L! W+ |5 F$ n& 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。
6 Q) g0 `) H8 p, z: O3 n% m# g0 F4 t) G
    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。
  P6 Q$ j! q! d% n
- X) T& v3 a3 v. ^* E2 N  R    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/
5 ?/ @0 f* D6 ]' E  I; J
% B# |* h! I: l% b' b    ②想融入区块链技术的小圈子?添加研究员微信ALabsBlockChain就好啦~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11