[TOC]算法
区块链的状态是经过带版本的键值对进行存储的,链码经过put
和get
这两种 KVS 操做进行读写。shell
状态s
由K->(V,N)
的映射组成,其中:安全
K
是键的集合V
是值的集合N
是有序版本号的集合V
和N
有一个⊥的元素,表明空类型架构
对于任意k
,咱们有:s(k)=(v,ver)
。两种KVS 操做以下:并发
put(k,v)
,以 s
做为初始撞死,以 s'
做为结束状态,知足:1.s'(k)=(v,next(s(k).version))
函数
2.对于k'!=k
,有s'(k')=s(k')
区块链
get(k)
返回 s(k)
与 OrdererLedger 的区别是,还维护了一个区别是否有效 transaction 的 bitmaskspa
特殊的接收 client 提案的 peer,叫作__endorser__code
排序服务对 clients 和 peers 提供一个共享的通讯频道(channel),channel 提供消息投递的原子性。blog
Partitioning。Orderer 提供多个 channel,clients 能够按需订阅。
Ordering service API。Peers 经过 API 链接到 orderer 提供的 channel,两个基础的 API 以下:
broadcast(blob)
,client 调用deliver(seqno, prevhash, blob)
,orderer 调用用来通知 peer排序服务特性
deliver(seqno, prevhash, blob)
,后一个块有前一个的 hash,即区块链。问题:endorser 是如何肯定的?一个 org 只有一个 endorser 么?这个 endorser 和 leader peer 是同一个么?
endorser 是合约维度的,一个合约在配置背书策略的时候,会配置 endorser,好比:
peer chaincode instantiate -C <channelid> -n mycc -P "AND('Org1.member', 'Org2.member')"
其中 Org1.member
, Org2.member
就是 endorser,这里的 endorser 表示的是哪一个 org,但 org 里面还有多个 peer。另外一种说法,实例化合约的 peer 就是 endorser。合约必须只被安装在 endorser 上以保证合约代码的机密性。
PROPOSE
消息格式<PROPOSE,tx,[anchor]>
,其中:
tx=<clientID,chaincodeID,txPayload,timestamp,clientSig>
对于不一样的交易类型,txPayload
有所不一样
调用合约交易txPayload = <operation, metadata>
operation
:调用的函数及参数metadata
:相关的属性部署合约交易txPayload = <source, metadata, policies>
source
:链码metadata
:相关的属性policies
:背书策略,须要注意的是,这里只给出背书策略的 ID 以及对应的参数anchor
client 会将tid=HASH(tx)
保存在内存中,等待 endorser 的反馈
endorser 收到请求后进行以下操做:
clientSig
anchor
则先检查 versionreadset
和 writeset
tran-proposal
发往背书模块(endorsing logic)tran-proposal
和tx
做为输入发往相关系统得到断定是否要进行背书。背书逻辑调用的是系统默认的合约 ESCC,固然也能够本身编写背书合约,可是这始终是一个同步调用操做,不用也不能由人工介入。<TRANSACTION-ENDORSED, tid, tran-proposal,epSig>
,这个大概就是endorsement
吧?tran-proposal := (epID,tid,chaincodeID,txContentBlob,readset,writeset)
,txContentBlob
是与链码/交易有关系的信息(例如:txContentBlob=tx.txPayload
)
epSig
是 endorser 对tran-proposal
的签名
(TRANSACTION-INVALID, tid, REJECTED)
根据背书策略,在收到足够的背书响应后,client 向 orderer 发起broadcast(blob)
orderer 向 peer 发送 deliver(seqno, prevhash, blob)
,peer 收到后,作以下处理:
blob.tran-proposal.chaincodeID
对应的合约检查blob.endorsement
有效性blob.endorsement.tran-proposal.readset
的版本检查,默认使用串行的隔离级别PeerLedger
的 bitmask 中标记该交易为有效,并应用结果集blob.endorsement.tran-proposal.writeset
PeerLedger
的 bitmask 中标记该交易为无效gossip主要起到如下几个做用:
每一个 org 会选举出一个 leader peer(实际上能够存在多个),负责链接到 orderer。leader peer从orderer 拿到新块的信息后分发给其余 peer。
能够在core.yaml
中配置:
peer: # Gossip related configuration gossip: useLeaderElection: false orgLeader: true
也可使用环境变量:
export CORE_PEER_GOSSIP_USELEADERELECTION=false export CORE_PEER_GOSSIP_ORGLEADER=true
须要注意的是:
选主具体算法不明,相似 raft选主,leader 须要向从节点发送心跳,动态选主只能产生1个主节点
能够在core.yaml
中配置:
peer: # Gossip related configuration gossip: useLeaderElection: true orgLeader: false # 心跳频率 election: leaderAliveThreshold: 10s
也可使用环境变量:
export CORE_PEER_GOSSIP_USELEADERELECTION=true export CORE_PEER_GOSSIP_ORGLEADER=false
点对点通讯的安全性是由TLS保证的,不须要签名,这里会不会有什么问题?