type Event struct {* k Z/ `8 }. p/ v z6 T" M
Transactions [][]byte //the payload! C$ o5 S2 J( D5 p
selfParent string8 k3 V6 |; K6 n& z) ]6 B) k
otherParent string( j i! b K4 i0 a( ]
Creator []byte //creator’s public key
Timestamp time.Time //creator’s claimed timestamp of the event’s creation' V0 Y8 ]% A' c6 ^, P* l
roundReceived *int5 q% Z+ U4 k! F6 w5 B7 R' V. y( h
consensusTimestamp time.Time2 ]: t/ k$ n4 w
}1 m9 W$ B6 Z* r- c
7 L0 b; t* L5 M
Transactions字段是Event里包含的所有交易,selfParent和otherParent是该Event父Event的hash,包括了自己创建的父Event和其他节点创建的父Event,Creator是创建者的公钥,Timestamp是创建Event时的时间戳,roundRecevied是Event被第几层round里的famouswitnesses所共识的,consensusTimestamp是Event被共识时的时间戳。1 m5 q* r. V2 A1 g
接下来我们来看看具体的共识过程
: ^, p- N/ y; t& F* ~! a' M
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最后创建的)。
B再随机选择A,然后把自己知道的4个Event发送给A,A创建一个新的Event,这样一直增长下去,就形成了一个图谱结构。$ P- x" j+ h3 Y, ^( q
famouswitnesses的确定,首先有几个概念我们来看一下,see和stronglysees,see就是说Event之间有祖孙关系,假设有Event(B2)和Event(A3),假设B2是A3的祖先,A3是B2的子孙,那么就说A3可以看到B2。
6 C. e& g: h0 Q
stronglysees是两个Event之间存在祖孙关系,并且这两个Event所有相连的所有路径中所过节点和超过2/3的节点,视为其中一个Event强看见另一个Event。: S9 M" r" b5 C% E5 L5 ]/ W
N# N. o6 x& k4 J; K; a$ B( w
witness是一个round中的第一个Event(rootEvent都是witness),round的确定方法是,一个Event可以强看见当前round里的2/3以上witness,那么该Event的round加一。) ]2 g) T9 ^5 j# d# ~/ s
$ @1 A) r5 J$ X( c6 l9 l
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。. G1 E' }' u' z/ X; o. S3 e
当确定了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。4 A3 [. c0 G K X5 U+ \
N" j3 y& i7 W0 b
被打上consensusTimestamp的event便是形成共识的event,然后根据roundRecevied对event进行排序。
成为第一个吐槽的人