*以太坊客户端 P2P 协议是一个相当标准的加密货币协议,并且能够容易地为其它加密货币使用;仅有的改动是引入了上述的“幽灵“协
议。以太坊客户端基本上是被动的;如果没有被触发,它自己做的仅有工作是调用网络守护进程维护连接及定期发送消息索要以当前
区块为父区块的区块。然而,该客户端同时会更强大;与只存储与块链相关的有限数据的 bitcoind 不同,以太坊客户端将同时扮演一
个功能完整的区块浏览器的后台的角色**
步骤如下:
1. 哈希该数据,并且检查该数据与其哈希是否已经接收过,如果是,退出,否则将数据发送给数据分析器。
2. 确认数据类型。如果该数据项是一个交易,如果交易合法则将其加入本地交易列表,加入当前区块并发布至网络。如果该数
据项是一个消息,作出回应。如果该数据项是一个区块,转入步骤 3。
//虚拟后端处理,源码位于ethereum/go-ethereum/accounts/abi/bind/backends
3. 检查区块中的“父区块“参数是否已存储于数据库中。如果没有,退出。
4. 检查该区块头以及其“叔区块列表”中所有区块头中的工作量证明是否合法,如有任意一个非法,退出。
5. 检查“叔区块列表”中每一个区块的区块头以确定其是否以该区块的“祖父区块”为父区块。如有任何否,退出。注意叔区
块头并不必须在数据库中;他们只需有共同的父区块并有合法的工作量证明。
6.检查区块中的时间戳是否最后至未来 15 分钟并且在其父区块的时间戳之后。检查该区块的难度与区块号码匹配。如任何检
查失败,退出。
7.由该区块的父区块的状态开始,加上该区块中的每一笔合法交易。最后,加上矿工奖励。如果结果状态树的根哈希与区块头
中的状态根不匹配,退出。如匹配,将该区块加入数据库并前进至下一步。
8.为新区块确定 TD(block) (“总难度”)。TD 由 TD(genesis_block) = 0 及 TD(B) = TD(B.parent) + sum(u.difficulty for u in
B.uncles) + B.difficulty 递归定义。如新区块拥有比现区块更高的总难度,则新区块将成为“现区块“并进入下一步,否则,
退出
9.如果新区块被改动,向其中加入交易列表中的所有交易,废除交易列表中的所有变为不合法的交易,将该区块及这些交易向
全网重新广播.
具体流程图
ps:翻译自以太坊白皮书