Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

飞儿506
201 0 0
假设有网络中有4个节点(A,B,C,D),每个节点都发送一笔交易,交易被包含在一个event里gossip到其他节点,一次gossip会把本节点的所知道的对方不知道的交易随机发送给其他节点,每个节点维护一个完整的图谱,通过投票算法,最后对每个event打一个时间戳,讲解具体逻辑前,我们先看一下event的数据结构。
% ^" Y$ J) a' \* M  w6 i/ u  X2 ]5 F3 c$ G
    typeEventstruct{, L! x6 o0 ~$ _6 g: `; V" d5 K

+ Y, g5 P+ u/ |% v    Transactions[][]byte//thepayload1 Z' j# ^/ p% Q7 z" i6 }! K
9 y. f  V! Z: m) j  g3 M
    selfParentstring1 p# g/ Y% m% E9 {9 r
- [3 _8 c+ _; I* B3 W
    otherParentstring7 K4 x' M2 n5 T6 p; l+ D, v3 k

# q. B' E& C0 n' p    Creator[]byte//creator’spublickey- R( @2 _" ~! M" X6 E6 X, T

" h" q0 H/ y) O) b& K. I) e& J. b    Timestamptime.Time//creator’sclaimedtimestampoftheevent’screation
! @" M1 e! b0 \. Z6 A5 J5 E4 e3 o1 E2 j! }  v' {. ~
    roundReceived*int
0 w0 U& F0 ^8 H
( ~; u# j* c' {1 @  M' T    consensusTimestamptime.Time
- E- v6 E/ J* A* b: x
5 `8 C% k9 ]  i# d' F    }5 y4 l& j3 H8 J% g# P

: ]2 |' B) E/ Y3 v1 u    Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。
7 _- O5 u& M0 ^8 V" J8 s3 d; V, g2 e( F/ j) A/ ]# {6 w0 P1 {. h- p6 H
    接下来我们来看看具体的共识过程1 I! g/ {) z1 m

% `$ T( A5 g$ F/ o. }) h. t    第一步
, [) E; h" R0 Z8 K( I- x3 Q+ \2 m, ]* q+ ^
    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最后创建的)。( I0 `7 N3 w7 c: f  E

( W  t7 b: m8 m4 e    第二步6 J$ O2 e  C2 Y1 f4 A7 K, e

0 {9 T0 A0 A; j$ e9 w( S) I    B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。
$ l- f3 T9 p- f  U
6 n" K; \; H- D0 P5 }1 H. C5 j1 d% y' _    famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。
0 p1 ^2 B; i! P7 B! X) t% S, I5 G5 X# k) F( D
    stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。
1 T2 F6 M  w1 w; j
  D/ G1 u9 @1 K, i% ^) L. \    witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。
' K, G3 C+ h' L0 l. T1 x6 j. m4 a9 {
' J% U1 A, g" z! ^6 p1 M5 z. {( a    第三步  l% _2 g- R4 ]# |7 z$ z2 l7 G

! E! s* f* e4 m  }% w    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。
9 I/ I: ]* C0 M8 t5 D2 E) q6 _' O3 U) a( e' g0 c, J* X( K
    第四步
: ]1 f$ b% v: }4 J% w* C6 T
" l( M2 o# J4 U+ |# l    当确定了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。
1 x" L" w. M' R% a0 }  U
- l! i7 J$ O  W  |    被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。
) }, M9 V, N" }' V0 n8 ^5 d
. ?; x' C! Y+ m- J$ _5 V  i; H3 P    ①这里不仅有区块链前沿技术干货,还可以帮你一键发链https://www.achainlabs.com/
" Y9 N8 b& H% ?% i( K
( b: {1 ?2 G/ y1 o/ Y' g8 o/ C    ②想融入区块链技术的小圈子?添加研究员微信ALabsBlockChain就好啦~
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

飞儿506 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11