Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

飞儿506
176 0 0
假设有网络中有4个节点(A,B,C,D),每个节点都发送一笔交易,交易被包含在一个event里gossip到其他节点,一次gossip会把本节点的所知道的对方不知道的交易随机发送给其他节点,每个节点维护一个完整的图谱,通过投票算法,最后对每个event打一个时间戳,讲解具体逻辑前,我们先看一下event的数据结构。
6 P. v1 s6 z* Z" R. V
$ X0 h' a  R# P3 M3 X9 j4 d    typeEventstruct{3 h8 Q# j2 q' ^- U

! b( e/ x. s4 ~, |2 m  l    Transactions[][]byte//thepayload
5 M! ~) }5 [$ r6 |
( r5 R2 }; v2 W* q/ f' Y    selfParentstring
2 [* _4 D  u1 B9 A% k3 F0 @: z5 K$ \
    otherParentstring6 o! k6 B) K! A2 Q2 k/ E# o9 g0 P

( T  I5 J( ]( ]' G. l! @  T    Creator[]byte//creator’spublickey
! q, `7 O, q$ n7 k; g
# y6 b1 I5 y- m4 F# c    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation
$ @: z" b$ ]6 ]% B8 O) N9 U
6 x, e) W' L( s% B- I1 H    roundReceived*int
5 }) j2 n6 X. C, C- ]0 ?1 s$ m* ~; Q4 ]( g  t
    consensusTimestamptime.Time6 ]* @/ Z" q# b* Y

' O3 Z- r% B) T! n: m    }5 n  G1 q" B4 t
. w6 z) E1 M- Z6 y8 ^6 q
    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。& U, k6 c; Z. [/ P, f; b; q

) j8 N2 v$ H$ J$ n* R) W    接下来我们来看看具体的共识过程/ d9 W1 n) o* q3 d) T5 I8 o

, j: }9 f4 p: C5 V1 e2 }" J  ]+ {    第一步3 e$ H4 B8 i4 E0 t2 T- Y3 x( g  j

" D- U! D! @+ w0 h, w7 W    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最后创建的)。
+ x3 k8 w( ]  r) ]; w* N% ]4 E# v- V+ d8 H. ^
    第二步
1 f9 ]1 s$ X) Q
: `* X6 s2 w) ?5 ^' w, T    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。8 v) @- U8 [0 O! T! ~. J) w  ^% J" l

) v! ^) Y8 f1 E) ~& t( C( b    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。5 g8 G7 A/ c+ s2 E

# l0 Y# I: {* R$ X- T    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。( H% j( d& n9 O" g0 r

1 G: C, @# G( b# q/ R; W1 `" T    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。: u7 D7 E# G. @

1 O/ a* K1 z: ?) n0 T    第三步0 z2 k; M; }1 h( @0 A
: L9 c' C% N4 @+ I! l% V, K- a" X0 u) ~
    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。
2 C! k; f0 I  c8 J+ z) a% J" t
5 S$ M' F' x  H" w2 Z( K, i    第四步
6 W% }: `) ]5 Z4 v7 g3 i* x4 U& E1 t7 V8 u2 {7 b
    当确定了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。
3 r$ [* y+ z) H# y# a& e
7 l' w- y7 a  _' M8 r% D    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。- C, L; N3 r$ `# p$ y

/ P  j1 ]" ~6 }* R% a1 I! h* K    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/
" b+ j, R' b& Z( n& @2 s* e: Q- d3 b  b% X) b2 |9 K
    ②想融入区块链技术的小圈子?添加研究员微信ALabsBlockChain就好啦~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11