本文参考文件为:Conflux白皮书,试图解决blockID的计算,并了解Conflux具体结构和数据。
0. Value
1.Accounts and States
Account=(αaddr,αstate);αaddr=4+公钥哈希值的大端排序的低位156位。
αstate = (αbasic,αcode,αstorage,αdeposit,αvote)
αbasic ≡ (αn,αb,αc,αt,αo,αr,αa,αp),8个分量
对于αn,这里的nonce指有这个账户发起的活动数的计数器。
1.2 RLP structure
对三种类型的数据的编码,最终都转化为对字节数组的编码;
参考以太坊黄页附录B
Recursive Length Prefix,递归长度前缀,这是一个序列化函数,将任意长数据加密为结构化的二进制数据。
B指Byte Array,L指序列列表
第一个结果的第一个字节总是小于192,而第二个总是大于192。
第二行,输出结果=(字节数组长度+128)表示为一个BYTE,作为输入数据的前缀。
BE将非负整数值扩展到最小长度的大端字节数组;由于是字节数组,所以这里的底数是256=2的8次。
不能对包含2的64次或更多字节的字节数组进行编码。此限制确保编码的第一个字节字节数组的值总是小于192(183+64/8=191),因此可以很容易地将其与L中的序列编码区分开来。
2.Hash Digest of World-State
五种状态的6个条目
1 | (k,v) |
2.2 多版本MP Trie
T0,T1,T2,分别表示快照、中间集合和变化集合。后者是前者的缓存。在交易执行时,只有T2更新,
每10W个epoch,T1合并到T0上,T1被赋值成T0,T0取空集。
MPTMerge函数更新T0中那些在T1中值不再相同的条目。对于初始值的条目,T0会移除它们。
epoch i的执行实际意味着epoch(i-5)中的交易被执行。
epoch i的状态根并不在epoch i的pivot block中。
3. Transacitions
- to an account address:转移价值 ,导致message call,至少发生其中一个事件。
- to “nowhere”:创建新合约
交易T由12项构成,其中共用11个域。(>167bytes)
1 | ''' |
3.2 可恢复的ECDSA签名
4.Blocks
B=H+ a list of Ts,H可划分为16项;
1 | 这16项大小一定>336bytes |
4.1 交易收据
Transaction Receipt,9个域的元组
4.1.2 Bloom fifilter
针对问题:如何查看一个东西是否在有大量数据的池子里面
Bloom fifilter,二进制向量数据结构,被用来检测一个元素是不是集合中的一个成员。
如果检测结果为是,该元素不一定在集合中;但如果检测结果为否,该元素一定不在集合中。因此Bloom filter具有100%的召回率。这样每个检测请求返回有“在集合内(可能错误)”和“不在集合内(绝对不在集合内)”两种情况,可见 Bloom filter 是牺牲了正确率和时间以节省空间。
计算方法
参考简书博客
图来自于上面的参考博客
以上图为例,具体的操作流程:假设集合里面有3个元素{x, y, z},哈希函数的个数为3。首先将位数组进行初始化,将里面每个位都设置位0。对于集合里面的每一个元素,将元素依次通过3个哈希函数进行映射,每次映射都会产生一个哈希值,这个值对应位数组上面的一个点,然后将位数组对应的位置标记为1。查询W元素是否存在集合中的时候,同样的方法将W通过哈希映射到位数组上的3个点。如果3个点的其中有一个点不为1,则可以判断该元素一定不存在集合中。反之,如果3个点都为1,则该元素可能存在集合中。注意:此处不能判断该元素是否一定存在集合中,可能存在一定的误判率。可以从图中可以看到:假设某个元素通过映射对应下标为4,5,6这3个点。虽然这3个点都为1,但是很明显这3个点是不同元素经过哈希得到的位置,因此这种情况说明元素虽然不在集合中,也可能对应的都是1,这是误判率存在的原因。
插入和查询时间都是常数,当插入的元素越多,错判“在集合内”的概率就越大了,另外 Bloom filter 也不能删除一个元素
4.2 校验Block的Header的8条件
•Height增加一;
•timestamp增加;
•规范的gas limit变化不大(不大于1/1024),并且保持在10的7次方以上;
•the target diffificulty设置正确
•工作量证明超出目标难度;
•根据GHAST规则从B的过去视图中正确选择了父亲;
•基于PAST(B),根据GHAST规则正确设置自适应权重标志adaptiveWeight;
•参考列表RefereeHash正确分解为块头
其中,well-formed指:
H是否有效只与块总顺序共识的建立有关,不依赖deferredStateRoot, deferredReceiptsRoot, deferredLogsBloomHash and blame.这四个域错误时,这个块对共识的贡献仍被计算在内????,但是作者没有reward,因为他没有合适地维护好状态和执行交易。
&&部分无效的块的贡献
1.什么叫做部分有/无效的块?
4.3 违反GHAST的块的三种部分无效情形
H(B)p不正确;
H(B)w ;
H(B)d;
部分有效的块在发布后的几个小时内可能不会被诚实块引用。当一个块变旧并失去影响枢轴链的能力时,我们不在乎一个块是否部分有效。 一旦接受了部分有效的块,则将其视为完全有效的块,但计时器链的决定除外???
2.deferredStateRoot, deferredReceiptsRoot, deferredLogsBloomHash and blame.这四个域对块的有效性无影响。
3.这四个域错了影响奖金,因为对状态的承诺错了。
只要目标难度合法且工作证明有效,部分有效的块对交易量也有贡献。这是因为Conflux允许引用部分有效的块,并且其中的事务将是按照任何完全有效的块进行处理。由于部分有效区块的生产者无权获得reward,所以
如果这些交易仅在部分有效的区块中收集,则可能会烧掉transaction fee。
4.4 Blaming Mechanism
Hm设置为最小的非负整数。
父亲错,祖父对设置为1。B到Hm+1之间的块都被认为状态无效。
而H(B)m+1责备的块又被B间接责备,我们就可以确定整个CHAIN(B)了。
若CHAIN(B‘)和CHAIN(B)有相交的块,它们若意见不一致,那么B’也被B责备。若B‘离开了主链,就不用再检查下去了。
Hm>0时的deferredStateRoot, deferredReceiptsRoot, deferredLogsBloomHash的求解:
4.2 Keccak 哈希算法
5.共识
有关共识的两个问题:
- 块是否有效能否上链;
- 上链的块如何排序
5.1 块校验
5.2 GHAST
5.3 Checkpoint机制
Era Genesis时代创世块,一个时代对应5W的高度。
50000 ·N is called the era genesis block of Era N*
Stable Era Geneses
- 创世块第一个有效
- G的子树有240个连续的计时器块,记最终的那个计时器块为B
- B之后有240个连续的计时器块(这些块不一定在G的子树上)