- A+
1.区块树到区块链
权威的区块链是覆盖整个区块树的从根节点到叶子节点的路径。为了形成路径共识,我们通过最大的计算量,或者说是最重的路径来识别它。识别最重路径的一个有效的因素是叶子节点的数量,它也是路径中区块的数量,不包含没有进行挖矿的创世块 ( 创始块通过硬编码写在了代码中及区块链中)。路径越长,到达最后一个叶子节点的代价越大。这和已有的比特币及其衍生协议类似。
因为一个区块头包含难度信息,所以仅通过区块头就能验证已经做了挖矿计算。区块链中的任意一个区块都对总的计算或区块链难度有贡献。
2.区块定稿
区块定稿涉及到 4 个步骤:
(1) 验证叔链 (如果是挖矿, 确定叔链);
(2) 验证交易 (如果是挖矿, 确定交易);
(3) 应用奖励;
(4) 验证状态和随机数 (如果是挖矿, 计算有效的状态和随机数)。
2.1. 叔链验证. 验证叔链头意味着需要验证每个叔链头的有效性并且是当前区块父块的第 N 代, N 6, 最多只能有2 个叔链头.
2.2. 交易验证. 使用的燃料数量一定要和交易列表中列出的一致:区块燃料总使用量 BHg ,应该和这个区块中所有交易使用的燃料量之和相等
2.3. 奖励. 对一个区块, 会奖励当前区块的受益账户及叔链账户。以 Rb 表示当前区块受益者的固定奖励额度; 对每个叔链, 奖励当前区块受益者固定奖励的1/32, 叔链受益者的奖励额度取决于区块编号。
如果叔链和区块的受益者账号冲突(比如:两个相同的叔链受益者账户或者一个叔链受益者账户和当前区块的受益者账户相同),额外的奖励会累积。
2.4. 状态和随机数验证. 到此, 我们完成了区块转换机制以及工作量证明 PoW 的定义。
2.5. 挖矿和工作量证明. 工作量证明(PoW)通过加密安全随机数, 来保证要获得要确定满足一定条件的 n, 要花费一定量的计算资源。通过计算给定意义的数值和难度系数来增加区块链安全性。然而因为挖出一个新的区块会附带一些奖励,工作量证明不仅是保证区块链权威的安全函数,而且也是一个健康的分配机制。
出于以上原因,工作量证明函数有两个重要的目标:首先,它应该尽可能的被更多人去接受。对定制特别硬件的需求或者回报,应该被减到最小。这使得分配模型尽可能开放,理想情况是,通过挖矿消耗电力获得以太币, 在全世界各个地方都是一样的比例。第二,应该不允许获得超线性的收益,尤其是在有一个非常高的初始障碍条件下。如果允许这样, 一个资金充足的恶意者可以获得引起麻烦的网络挖矿算力, 并允许给他们获得超线性的汇报(按他们的意愿改变收益分布), 并且会弱化网络的安全性。
比特币世界中一个灾难是 ASICs。有一些计算硬件仅仅是为了做一个简单的任务而存在。在比特币的案例中,这个任务就是 SHA256 哈希函数。当 ASICs 为了工作量证明函数而存在时,两个的目标都会变得危险。因此,一个可抵抗ASIC 的工作量证明函数(比如难以在专用硬件上执行, 或者在专用硬件执行时并不划算)可以作为众所周知的银弹。
防止 ASIC 漏洞的两个方向:第一是去让它变成有序列的内存困难,比如:设计一个函数, 确定随机数需要大量的内存和带宽, 以至于这些内存不能被并行地去计算随机数。第二个方向是让计算变得更普遍化; 对于这个普遍化的计算, 使得特殊硬件和普通的桌面计算机计算起来都差不多。在以太坊 1.0 中,我们选择了第一个方向.
Ethash. Ethash 是以太坊 1.0 的 PoW 算法。它是 Dagger-Hashimoto 的最后版本;再称它为 Dagger-Hashimoto 已不大合适, 因为很多算法的最初特性已经被大量地修改。这个算法的概况如下:
通过扫描区块头得到一个种子。根据种子可以计算一个初始大小为 Jcacheinit 字节位随机数缓存。轻节点客户端可以保存这个缓存。根据缓存,我们能生成一个初始化为Jdatasetinit 字节的数据集合,数据集合中每个元素依赖于缓存中的一小部分数据。全节点客户和矿工保存着数据集合。数据集合随时间线性增长。
挖矿涉及到组合数据集合的随机碎片并将他们哈希在一起。使用少量内存就可以验证, 可以借助缓存重新产生需要的数据片段, 所以仅需要保存缓存即可。大的数据集合每Jepoch (30000) 个区块更新一次,所以大多数矿工的工作都是读取这些数据集合,而不是尝试改变它。