区块链体系架构
http://kns.cnki.net/KCMS/detail/11.1826.TP.20171115.2302.006.html
网络层:区块链网络的 P2P 协议主要用于节点间传输交易数据和区块数据,比特币和以太坊的 P2P 协议基于 TCP 协议实现,Hyperledger Fabric 的 P2P 协议则基于 HTTP/2 协议实现。
共识层:
Q1:消息在不可靠信道上的传播问题
https://www.zhihu.com/question/23167269
A1:拜占庭容错(ByzantineFault-Tolerant,BFT)
Q2:决节点自由进出可能带来的女巫攻击问题
http://blog.csdn.net/qq_35056292/article/details/60480292
A2:比特币用了工作量证明(pow),以太坊用了基于权重的权益证明(pos)
数据层:
一、数据结构:Merkle tree / Merkle Patricia tree
比特币:
以太坊:
Merkle Patricia tree 有三种节点:
1. 扩展节点(extension node):类型前缀|公共键部分|下一节点的hash
2. 分支节点(branch node):类型前缀|后续为(0—F)的键的hash|空
二、数据模型
比特币:基于交易的模型,每一笔交易与上一级交易链接,用户余额有交易计算而来
以太币/hyperledger:基于账户的模型,维护了一个账户状态数据库,便于应用开发
三、数据存储
非结构化数据如hash值等存入非结构化数据库,比特币、以太坊、hyperledger用了levelDB;结构化数据(用户信息等)可存入结构化数据
智能合约层:
在以太坊中,部署后的合约存放在区块链上,每次被调用时才被以太坊虚拟机(EVM)加载运行;在 Hyperledger Fabric 中,部署后的合约被打包成 Docker 镜像,每个节点基于该镜像启动一个新的 Docker 容器并执行合约中的初始化方法,然后等待被调用。外部应用通过调用智能合约来实现各种交易,如果调用涉及到修改操作,需要先在全网达成共识,之后修改操作会被记录在区块链,修改结果会被存在状态数据库。
应用层
比特币平台上的应用主要是基于比特币的数字货币交易。以太坊除了基于以太币的数字货币交易外,还支持去中心化应用( DecentralizedApplication,Dapp),Dapp 是由 JavaScript 构建的Web 前端应用,通过 JSON-RPC 与运行在以太坊节点上的智能合约进行通信。
区块链工作流程
1. 准备节点:个各矿工去获取前块hash,时间戳等必要信息,填入区块头
2. 交易收集:在上一节点确定到新节点生成期间内的所有交易都被广播到全网,每个矿工 都要收集这些信息
3. 计算merkle根:当交易达到要求时计算所有交易的merkle tree的root hash,填入区块 头
4. 算力竞争(挖矿):每个节点都有自己的Nonce值,填入区块头后将区块体进行哈希两 次,映射到一个数字,如果该数字小于难度值,则该节点获得记账权即挖矿奖 励,并将该区块广播,如果该数字大于难度值则调整Nonce重新计算hash。
5. 验证:其他节点收到成功算出nonce的节点的广播(nonce,merkle root),验证该值,验 证成功则将该节点加入区块链,并进行下一轮
交易流程
A给B转钱
比特币:
1. B将自己的公钥pubkeyB,进行2次hash(sha256,ripemd160)得到自己的地址pubkeyB.hash
2. A收到pubkey.hash
3. A进行交易填写交易信息
4. A对交易签名 sig=Tx|sigA
5. 把sig和pubkeyA放入输入脚本ScriptSig
6. 完成交易,将输出广播