以太坊中的区块结构具备的独特之处:
1.交易的列表[0,…,n-1]和最近区块的状态(parent_Block_Merkleroot_Hash)会在以太坊的区块链中存储 2.以太坊中区块的数量和挖矿难度也会保存在区块链中
以太坊的状态转换函数,Apply(State[n],Tx)=State[n+1],状态State[n+1]基于当前状态State[n]由交易Tx经过转换函数Apply得到
矿工挖矿过程的区块验证:
1.parentHash检查。收到新的区块后,验证区块的上一个区块是否存在并且有效 2.timeStamp检查。检查当前区块的时间戳是否大于上一个区块并且小于当前时间15min(900s) 3.blockHead字段检查。检查区块号、交易根、叔根、gasLiimit是否有效 4.Pow验证。验证pow的有效值【查看具体的源码,后续需要补充】 5.令S[0]为上一区块的最终状态 6.令Tx为包含当前区块n个交易的列表[0,…,n-1]. 对于交易列表中的所有交易i,计算状态转换,S[i+1]=Apply(S[i],Tx[i])。计算过程如果任一转换函数返回错误或者gas的消耗超出额度,直接返回错误。 7.令S[n]为当前验证的最终状态S_FINAL,并且向矿工支付奖励 8.检查在验证过程S_FINAL在Merkle tree中的根节点和当前区块链最后一个区块的状态在Merkle tree的根节点是否一致,如果一致,那么区块有效。
在以上的区块验证过程中存在的问题:
1.在步骤6.7.8中每个区块都需要存储当前所有状态信息,但是事实上以太坊的确认效率可以不低 于比特币。原因是状态存储在树结构中,每经过一个区块后,只需要改变树结构的一小部分。因此,一般而言,两个相邻的区块的树结构绝大部分是相同的,因此存储一次数据,可以利用指针(即子树哈希)引用两次。 2.“帕特里夏树”(Patricia Tree)的树结构可以实现这一点,其中包括对Merkle树概念的修改,不仅允许改变节点,而且还可以插入和删除节点。另外,因为所有的状态信息是最后 一个区块的一部分,所以不用存储全部的区块历史
在物理硬件层面上,合约代码在哪里执行。简单的回答是,合约代码的执行过程是状态转换函 数定义的一部分,是区块确认算法的一部分,所以如果一笔交易被加入到区块B中,那么这个交易引发的代码执行将会在所有目前和将来会下载与验证区块B的节点 中进行
|