Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

飞儿506
115 0 0
假设有网络中有4个节点(A,B,C,D),每个节点都发送一笔交易,交易被包含在一个event里gossip到其他节点,一次gossip会把本节点的所知道的对方不知道的交易随机发送给其他节点,每个节点维护一个完整的图谱,通过投票算法,最后对每个event打一个时间戳,讲解具体逻辑前,我们先看一下event的数据结构。
: H2 t  ~4 V: v" T% T: ]7 ~' p2 O: z9 q$ q
    typeEventstruct{
* x4 @: l5 D# z4 C/ w) C$ p+ f. p7 I* p2 p: N  T
    Transactions[][]byte//thepayload4 A' n, g. I3 R7 R

/ V5 M/ G: n3 k4 ~0 [( [    selfParentstring: z5 z  r2 D: o+ b- g

( J1 @( ]5 v) o/ _* x. \' `    otherParentstring
! i4 }' }5 N- m9 X  k' A- |+ Z9 m( \! k  L
    Creator[]byte//creator’spublickey
+ O. D) N. o$ \* i' H& b5 |
+ Y9 b! S4 q$ i7 i% F$ G    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation
1 S( _/ h$ i8 w6 l1 ?' @+ D3 A
; C& O5 V. i0 h$ {2 B/ j    roundReceived*int
5 F  T7 w  j0 n& {+ j& s) j, l' X! B/ n
    consensusTimestamptime.Time
* u4 ^" G8 I6 n, h4 S$ ^( ^
7 m: j! r% D& g, _' j* }5 I    }/ r) R* ^$ ~1 T4 u" k) x: X* U
% g5 u# X" i7 ?7 y
    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。6 l- x- ?- z) Y/ y- t
2 p# t  }3 F6 U4 S" N4 L
    接下来我们来看看具体的共识过程6 O: S) W( Y4 l3 |# j

( @) f, T1 _; Z& ~    第一步- W/ X% Q% v$ W5 e4 M

/ c- q- K8 q+ v" J% E    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最后创建的)。& M0 y- Q; M$ T3 `8 I6 E4 s% w

* v4 S; N& k0 G8 K8 h. ?. |& T; q/ ~4 Y    第二步; _1 G6 V% q3 q

- \6 b4 M; q  C# q5 B7 x    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。
/ o# d- `* F7 {. b! h& T; R. }( U9 s9 x$ t  J
    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。( V! x- x5 A" Q- c+ `
' P& L9 V' p( H0 j9 H1 L; O$ j+ Q
    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。
+ [3 A* [2 @9 \, G; J3 h% `; q& q* {5 v# V8 W# K2 t& p
    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。8 S3 \5 f5 `+ @  L1 W3 G$ f9 e

. u# C) K: e" K- N0 g0 q/ e    第三步
& W8 q% q* q, G8 `
& ?( z4 H/ N0 o    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。
3 ^6 o. k% T8 Y7 g( y' O* X- f; s4 H# Q+ o& v; P7 F
    第四步
; z+ b2 q& K% a' w; }
- c  f  j) x8 C. 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。
% C2 G& W+ e! s0 f, j+ [9 ?! [& @: s1 r
    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。
: R( R4 c5 N: y: O6 ?' W
5 {. O2 {+ C/ y3 W$ C    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/* G# L8 ^' F% U3 {; a

7 T/ s2 A5 `8 d' Z7 G* B    ②想融入区块链技术的小圈子?添加研究员微信ALabsBlockChain就好啦~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11