Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

飞儿506
199 0 0
假设有网络中有4个节点(A,B,C,D),每个节点都发送一笔交易,交易被包含在一个event里gossip到其他节点,一次gossip会把本节点的所知道的对方不知道的交易随机发送给其他节点,每个节点维护一个完整的图谱,通过投票算法,最后对每个event打一个时间戳,讲解具体逻辑前,我们先看一下event的数据结构。
' H& @: _3 c# M- y2 Y; a
3 Y$ R1 p& n, h- l( \$ Y    typeEventstruct{
* ]4 `0 K+ [" y2 ~1 \) ?5 h
+ ~1 ?7 J/ M/ j; j    Transactions[][]byte//thepayload! ?0 i( Y7 l9 ~& v) {
4 s$ F0 G5 G% W) L1 E
    selfParentstring
% }: z  `& e0 ?  D- l2 Y* z
( [( `/ T3 v# O- e8 l6 w8 j    otherParentstring
7 R2 z" p2 W2 A0 ?0 P: Y& C8 m# Y$ R- G: ]4 r$ `  {
    Creator[]byte//creator’spublickey6 V( p) ^  m, O" g) M
4 R  K! D$ g- m) ^
    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation* n! U5 T9 x& \1 y7 Q0 J! R

/ E- V3 w, O- I' \  d    roundReceived*int5 ^9 b& l+ P7 P& X- ~! w$ l' C

5 s, D1 i3 |3 C5 }: _% K& R- a5 Q    consensusTimestamptime.Time
$ _( N' D5 S0 }" a) g& c$ w6 o  X
# f  `9 X( O$ F& W( N; Y    }0 _8 G2 S( k3 _; z9 m
4 `9 c; P& c5 P7 Z
    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。
( v! `% F! c! l) A3 }) q; G  W/ U% \+ A9 L2 n
    接下来我们来看看具体的共识过程3 i9 ]! _( u7 o2 L

0 S( l( r) r& [    第一步
' ~! q' [  [: v1 m
4 d; @/ ~# Q6 ]9 T2 X  O4 Y8 r& Y    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最后创建的)。
" U- d; K% o, j" I! E$ e0 _% E& w. B+ u, W( n" q/ a  q
    第二步
. k9 R6 y4 R* k5 R# a7 c9 T
2 h& o5 w3 i! x+ Z4 e: L    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。( f) `* z* ]- m7 n$ u! T  J3 q

* t1 m. ]% W- `. ?5 \2 d% U1 c, e    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。- P0 ^" c: v: y: m8 ]# {4 q

# r5 F  a* H+ E) Z7 H    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。4 Z4 R/ f. L( @+ _) t' l
" o0 i2 r/ R  c/ R8 L
    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。( ?0 p# u9 E; w' ?" c: n

# N; d- L# W& N: A    第三步
6 A8 @0 f. U% |- b( k0 Q: q/ [" O% h8 c! o7 h. L# N) `& C2 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。
4 T$ d* M) j; ?" b/ q4 h6 ^' _. Z& s" _" n% O  _' B8 R  C
    第四步
: X0 [4 e& B4 h9 y- U/ B# X! f3 v4 p; n- `8 s0 x% ]/ z: M' F- P
    当确定了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。
( D+ i1 ], \  Q0 j& {
" ?9 S, E* T9 ^" v: v    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。% F8 c4 o( G: W0 q( S0 p/ A
5 L" l. F) i  a1 `+ A
    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/6 k) O5 Z7 t: P( T2 J/ R
3 r) t5 r  P9 e! V. s8 M
    ②想融入区块链技术的小圈子?添加研究员微信ALabsBlockChain就好啦~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11