add some markdown text
This commit is contained in:
parent
c643c35959
commit
df97e60cd9
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1 +1 @@
|
|||
MANIFEST-000072
|
||||
MANIFEST-000075
|
||||
|
|
|
@ -1 +1 @@
|
|||
MANIFEST-000069
|
||||
MANIFEST-000072
|
||||
|
|
|
@ -314,3 +314,15 @@
|
|||
20:00:01.520372 db@open done T·23.644ms
|
||||
20:00:02.325750 db@close closing
|
||||
20:00:02.326281 db@close done T·530.5µs
|
||||
=============== Apr 24, 2024 (CST) ===============
|
||||
20:04:35.321680 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
|
||||
20:04:35.323680 version@stat F·[2 1] S·159KiB[107KiB 51KiB] Sc·[0.50 0.00]
|
||||
20:04:35.323680 db@open opening
|
||||
20:04:35.324690 journal@recovery F·1
|
||||
20:04:35.327680 journal@recovery recovering @71
|
||||
20:04:35.332680 memdb@flush created L0@73 N·20 S·54KiB "blo..9\xc2\xf4,v422":"blo..n\x01\x04,d418"
|
||||
20:04:35.332680 version@stat F·[3 1] S·213KiB[162KiB 51KiB] Sc·[0.75 0.00]
|
||||
20:04:35.348696 db@janitor F·6 G·0
|
||||
20:04:35.348696 db@open done T·25.0151ms
|
||||
20:04:36.051582 db@close closing
|
||||
20:04:36.052583 db@close done T·1.0012ms
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,11 @@
|
|||
### peer节点处理提案请求
|
||||
|
||||
1.根据ChaincodeMessage生成链码存根(ChaincodeStub)
|
||||
|
||||
2.根据ChaincodeMessage结构体中Proposal *SignedProposal验证客户端签名
|
||||
|
||||
2.解析ChaincodeMessage中的链码参数并调用链码,返回背书结果(Response)
|
||||
|
||||
3.获取事务的读写集并检测其是否存在重复地址,以及是否为不可序列化的事务
|
||||
|
||||
4.根据序列化的字节数组创建提案回复(ProposalResponse),并将序列化后的提案回复写入ChaincodeMessage结构体中的Payload字段
|
|
@ -0,0 +1,29 @@
|
|||
### peer节点返回背书结果
|
||||
|
||||
#### 将接收到的提案响应按照交易 ID 进行归类,并将它们存储到一个映射结构中
|
||||
|
||||
1.获取ChainCodeMessage结构体对象Payload字段的内容,并进行反序列化,得到pb.ProposalResponse对象
|
||||
|
||||
2.定义一个将交易ID与提案相应关联的map对象proposalResponse (cmap.ConcurrentMap[string, []*pb.ProposalResponse])
|
||||
|
||||
3.定义了一个类型为 []*pb.ProposalResponse的变量prs,用于存储提案响应。检查 proposalResponse中是否已经存在了与当前消息的交易 ID(msg.TxID)对应的提案响应数组。如果不存在,则创建一个空的数组,并将其与交易 ID 关联起来
|
||||
|
||||
4.从 proposalResponse 中获取与当前消息的交易 ID 关联的提案响应数组 prs,将当前接收到的提案响应 pr添加到 prs 数组中。将更新后的 prs数组重新关联到交易 ID 上,更新proposalResponse中的值
|
||||
|
||||
#### 解析提案请求
|
||||
|
||||
1.验证msg.Proposal.Signature字段,检查提案的签名是否正确
|
||||
|
||||
2.反序列化ChaincodeMessage类型消息(msg)的个各字段,得到签名后的提案(SignedProposal)、提案响应(ProposalResponse)等信息
|
||||
|
||||
3.验证签名头(SignatureHeader)信息与客户端身份信息是否一致
|
||||
|
||||
4.校验提案响应负载的Hash值、提案响应的状态信息和背书结果,以及背书者的签名是否有效
|
||||
|
||||
#### 生成交易(事务)并打包
|
||||
|
||||
1.将背书者存储至背书者集合([]*pb.Endorsement)中
|
||||
|
||||
2.获取交易的字节数组(txBytes),与签名头信息共同实例化Payload结构体
|
||||
|
||||
3.反序列化Payload结构体对象得到payloadBytes,并使用客户端的私钥进行签名,将签名值放入Envelope结构体中的Signature字段
|
|
@ -0,0 +1,19 @@
|
|||
### 客户端至peer节点
|
||||
|
||||
1.生成随机的交易提案参数args(模拟客户端的交易提案)
|
||||
|
||||
2.把args放入pb.ChaincodeInput结构体中
|
||||
|
||||
3.获取链码ID,根据链码ID实例化pb.ChaincodeSpec结构体
|
||||
|
||||
4.获取一个随机数,对随机数nonce和序列化后的用户身份creator进行hash运算,得到txid
|
||||
|
||||
5.根据nonce和creator实例化pb.SignatureHeader结构体
|
||||
|
||||
6.序列化pb.ChaincodeSpec结构体对象和pb.SignatureHeader结构体对象分别得到得到cisBytes,hdrBytes
|
||||
|
||||
7.根据cisBytes和hdrBytes实例化pb.Proposal结构体
|
||||
|
||||
8.序列化pb.Proposal结构体对象,并对该对象签名,实例化pb.SignedProposal结构体
|
||||
|
||||
7.实例化pb.ChaincodeMessage结构体
|
|
@ -0,0 +1,13 @@
|
|||
### 将封装好的交易交给Order节点排序
|
||||
|
||||
1.分析交易直接的依赖关系,将有依赖关系的两笔交易添加到事务组中(TransactionGroup),并删除不可序列化的交易
|
||||
|
||||
2.判断当前区块大小是否达到阈值、时间间隔是否超出阈值,确定是否满足成块条件
|
||||
|
||||
3.通过交易之间的依赖关系创建拓扑图,并对交易进行拓扑排序,将每10笔交易封装至信封中(Envelope),并返回信封切片
|
||||
|
||||
4.将信封切片序列化并填充至Block结构体中的BlockData字段,将负载(Block.Data)的内容使用用SHA256算法生成摘要值
|
||||
|
||||
5.获得区块头(Block.Header)的字节数组,并使用Order节点的私钥对该字节数组签名,得到的签名结果以及签名者的身份信息放入区块的元数据(BlockMetadata)中
|
||||
|
||||
6.将区块写入到账本数据库中(leveldb)
|
Loading…
Reference in New Issue