Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

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

0 @' \, b/ L0 T; t    typeEventstruct{0 X  x/ e8 ?  B: w
* ]+ _; W7 m8 J& O, b
    Transactions[][]byte//thepayload9 Q% Y2 \. N7 B( e& ?/ h$ P

8 c) y. U; B8 L/ C  j5 \. O    selfParentstring# M  `: C5 }4 D. }$ c  j
% C- y) x# T7 D3 P& v
    otherParentstring
6 I8 y7 K* N8 Y2 v  _! {, \, e  Z6 v
    Creator[]byte//creator’spublickey" G; y( x; w! B( ]2 Z
4 F: R3 N% ^1 }/ `( t! F" n" f8 M& u
    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation; L: ]( x" |' n% f# u

9 d8 }0 E2 v+ A0 c+ E    roundReceived*int
; u6 ~2 d1 u5 p  l) X9 |6 o5 a  z* f) ]: Y- s- s3 f
    consensusTimestamptime.Time
5 R0 i2 F7 ?) W& t! ?* B" d2 N) A
    }
$ l9 I/ V4 t& e6 |0 b. q( v7 V# e8 }9 V* G
    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。# t2 ?: e  Y  @
- q: {; k# c7 X- b) u
    接下来我们来看看具体的共识过程- r" ^" l; K8 h0 f" `

" b4 L" p. h2 S" b# o7 f  s" |, V  k    第一步) {" V# [6 T. C: V9 o

5 A* s5 F8 B3 o& Y6 E* W- A    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最后创建的)。3 k7 `9 \5 j0 J9 M
- R1 Q) r: N0 a7 C3 z4 H# e+ _/ e
    第二步) Q6 S4 o) _& j
' v/ q) r- t: X; l
    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。. J) w' |4 O% C

4 v0 V2 m5 W! F/ {+ D    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。
* d! Q% k! f, R/ R- @2 X- R( Y# l% [. v, x6 r3 [: d" {
    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。+ c( g' P0 Y3 V1 y
7 a1 |: L! v& ]+ q7 M: ~
    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。
! o% ^8 e! C  m& ]. X5 m# F9 p6 Q- b2 o$ f
    第三步( [4 }% O& ?1 M% h2 `' x9 O1 u
( Y+ J5 Y$ M/ i) y6 k9 ?
    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。
$ a9 L4 \' ]) ]  {0 c
9 z; `, I- M+ y' B' `  K1 i! A    第四步" L/ C0 C6 R8 ~! e; t0 c9 j
7 U% I4 o1 b" `6 ]7 O
    当确定了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。
- g9 {# P# Q- I, C: L
) ]2 W$ e. W" n4 L: {/ f+ i% S    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。
; C* b3 N8 a0 r. K
. O( e3 S! j5 q, r( y/ K2 ?  r    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/( D2 O* r  i; B3 z7 z+ D5 a0 ~
' P) |0 |+ i0 J/ ?" w1 M3 {
    ②想融入区块链技术的小圈子?添加研究员微信ALabsBlockChain就好啦~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11