Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

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

0 l% M8 X# |, B, b. r0 t    typeEventstruct{0 W9 u! G2 B1 d3 k

% n* D7 _: g* u0 z% ?$ Y" i6 A    Transactions[][]byte//thepayload
; c5 ~/ K* B3 }& Z" s( {1 a  a  V/ I& A
    selfParentstring: Q7 ^' }+ m6 W) C0 z% K

( w( e! O: C. Y& h    otherParentstring
7 e: V, U  O7 f' Z  Z8 c! _; s5 {. ~+ Z/ |" w
    Creator[]byte//creator’spublickey
) x2 @% c* n$ U5 K# }! }
0 L- r: ]' F% f    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation+ S) L1 Q1 N" G7 J

" r; S$ y2 V4 A. C# {, Q    roundReceived*int
0 j4 c  a& p) Q9 ]5 x
% F+ ?1 {- W' a7 N5 ?8 N, m9 R$ E' L    consensusTimestamptime.Time. J5 G$ V3 z, V& Y7 R$ [" ~

: ?) D) g1 }( r1 ?6 i' q& ~- x- ?    }
, `- O( ~' B! r: x) }2 i
& S$ t! j% I8 w" }$ o) u    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。: B6 }& @7 j$ l3 |& m8 i

! _+ _4 N* y. p% G! r3 d( U    接下来我们来看看具体的共识过程/ a% b1 j+ |/ D6 p1 {
9 ~( ~; L2 k, |4 u& R$ S
    第一步5 d. v2 v1 f9 I" f8 m6 g. d6 b9 a
* T- L6 ~( o, S8 C' 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最后创建的)。5 C, r  j1 M$ D! ^
' ]$ n  S! y- ?8 T( t& v2 e
    第二步
' Y* \( l5 q; M. \8 S: m0 @7 R5 X- G1 D3 b# P
    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。( \6 @! l* C# F0 D2 h
  v9 t" {+ V9 K! {
    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。
( a9 a& g. ^& v) n# A# o" j- o# i/ V4 b& ~8 c6 C8 ?
    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。# y: c" Q) T- v) M7 M
9 P! F( N9 j9 R, ~( T& C
    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。+ a- q9 h" f/ _1 ~

. D7 p9 ?9 G5 }$ n- ~  z* r5 m    第三步' n2 A" L+ P  g( e& `, [
; s7 e* B/ T# d: ^- a
    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。
5 m. Y% p' y/ f4 E5 G& D) q% r' B9 I4 E$ L; r/ I# A
    第四步
! O1 ~( `4 k. C$ ~  E- G* O1 M' M2 L0 ]; {! 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。
" R) l9 q, l% U) ?0 F9 _% E8 C+ B5 t5 l3 j8 C/ R9 k
    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。7 y" }6 d- c1 b# J+ @0 `

: `8 p( y: }+ h+ k/ H    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/5 n! s: C+ a, ]' L! i$ l# C+ r

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

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11