Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

飞儿506
200 0 0
假设有网络中有4个节点(A,B,C,D),每个节点都发送一笔交易,交易被包含在一个event里gossip到其他节点,一次gossip会把本节点的所知道的对方不知道的交易随机发送给其他节点,每个节点维护一个完整的图谱,通过投票算法,最后对每个event打一个时间戳,讲解具体逻辑前,我们先看一下event的数据结构。
! Q. o& |- q& F& [3 M
+ l* X1 g/ S/ o2 {( v! C    typeEventstruct{5 _* \% R8 z8 d" F# r* U5 x* y
$ G$ X& D& h7 z9 n
    Transactions[][]byte//thepayload2 \( G% U$ x7 _- t) u: O+ m$ v

/ `  y! v( G; d+ c8 z3 [7 `0 N5 q    selfParentstring: \' ^, o! p" f8 S5 \3 a: |- i
9 d2 L1 I( u' p  E1 P9 t
    otherParentstring
* U* h- |) S7 ?. Z
8 \, }, J; f1 r& h! g: v6 d/ z" g    Creator[]byte//creator’spublickey
7 B3 t0 ]7 b$ _/ w: g( i" u) ~+ i9 x" e6 R& P" U3 ~  k
    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation
3 V# t( t" x( N' k: w3 t9 Y- g
. ]8 j  H7 d6 x    roundReceived*int
- ?' |4 n) O# V3 J: @" Q+ k
( J+ t6 d3 S; \( f    consensusTimestamptime.Time
. g9 u! y& f0 K8 r' c1 E: @' ?% X4 n( B5 E) f& a. {. g/ H2 {! F
    }0 @4 \1 `$ l  B9 Y4 @
/ y2 z. v8 V3 v& ^. H6 O) u! }1 m
    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。
% ~0 }" I! H% J4 J. j; E; z" B- ^! K
/ L; r4 d$ C+ \: ^+ Y6 \. J0 p    接下来我们来看看具体的共识过程
! R- w  l4 B& N. O8 e& F7 ~* W6 `/ E/ M
    第一步
% ]0 p/ f. U5 }9 f6 M4 g9 F9 R& a: T0 b  R
    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最后创建的)。  S( M' b" E( X! |6 G1 k
) S# p+ A+ g2 V( N
    第二步1 c; }4 t0 Q& |" _6 f2 x+ E
$ }2 x) F, n0 U
    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。( ]2 s/ V) B8 p& _. E8 c- c+ k
  Y% e! Z2 {% K5 M
    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。: ^1 t% I4 j9 X! s% u  ]

( `! f) v: R1 ~* ^    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。- x" {& ]1 {9 r& Z6 |' P- `- R

" k, u/ A& A% l. p, c    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。
. h( t! w! R1 j4 {1 }! h) z5 g5 A0 i! Y+ ?
    第三步  c! \3 M/ m3 r* V! `

& g9 d8 ?+ s7 G' s  [    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 b% _9 J' R% |* G1 o
$ z& J9 N9 y# v" ?5 o    第四步
3 U7 S" t- s( w2 m  v) G: o- e: j8 a1 R9 K( G
    当确定了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。0 i2 z; W' E4 G/ J" q* ]4 T4 z
4 q. I9 h, E6 o( F7 `
    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。
$ _" z/ C* p0 S/ \2 g; |3 {5 W9 n3 b3 ~. f0 a+ T
    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/) E8 P* ]( e1 J& |; V" F8 l5 `
3 K8 R; e: Y( y' H# `
    ②想融入区块链技术的小圈子?添加研究员微信ALabsBlockChain就好啦~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11