-
Notifications
You must be signed in to change notification settings - Fork 2
/
committer.go
109 lines (93 loc) · 3.5 KB
/
committer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//<developer>
// <name>linapex 曹一峰</name>
// <email>linapex@163.com</email>
// <wx>superexc</wx>
// <qqgroup>128148617</qqgroup>
// <url>https://jsq.ink</url>
// <role>pku engineer</role>
// <date>2019-03-16 19:40:11</date>
//</624456020088852480>
/*
版权所有IBM公司。保留所有权利。
SPDX许可证标识符:Apache-2.0
**/
package tests
import (
"testing"
"github.com/golang/protobuf/proto"
"github.com/hyperledger/fabric/core/ledger"
"github.com/hyperledger/fabric/protos/common"
"github.com/stretchr/testify/assert"
)
//Committer帮助切割块并将块(带有pvt数据)提交到分类帐。
type committer struct {
lgr ledger.PeerLedger
blkgen *blkGenerator
assert *assert.Assertions
}
func newCommitter(lgr ledger.PeerLedger, t *testing.T) *committer {
return &committer{lgr, newBlockGenerator(lgr, t), assert.New(t)}
}
//CutBlockAndCommitWithPvtData从给定的“TxandPvtData”中剪切下一个块,并将该块(带有Pvt数据)提交到分类帐。
//此函数返回已提交到分类帐以提交的“ledger.blockAndPvtData”的副本。
//返回副本而不是实际的副本,因为分类帐在提交前对提交的块进行了一些更改
//(例如设置元数据)和测试代码将希望具有提交到的块的准确副本
//分类帐
func (c *committer) cutBlockAndCommitWithPvtdata(trans ...*txAndPvtdata) *ledger.BlockAndPvtData {
blk := c.blkgen.nextBlockAndPvtdata(trans...)
blkCopy := c.copyOfBlockAndPvtdata(blk)
c.assert.NoError(
c.lgr.CommitWithPvtData(blk),
)
return blkCopy
}
func (c *committer) cutBlockAndCommitExpectError(trans ...*txAndPvtdata) (*ledger.BlockAndPvtData, error) {
blk := c.blkgen.nextBlockAndPvtdata(trans...)
blkCopy := c.copyOfBlockAndPvtdata(blk)
err := c.lgr.CommitWithPvtData(blk)
c.assert.Error(err)
return blkCopy, err
}
func (c *committer) copyOfBlockAndPvtdata(blk *ledger.BlockAndPvtData) *ledger.BlockAndPvtData {
blkBytes, err := proto.Marshal(blk.Block)
c.assert.NoError(err)
blkCopy := &common.Block{}
c.assert.NoError(proto.Unmarshal(blkBytes, blkCopy))
return &ledger.BlockAndPvtData{Block: blkCopy, PvtData: blk.PvtData,
MissingPvtData: blk.MissingPvtData}
}
/////////////////block生成代码
//BLKGenerator帮助创建分类帐的下一个块
type blkGenerator struct {
lastNum uint64
lastHash []byte
assert *assert.Assertions
}
//NewBlockGenerator构造“BlkGenerator”并初始化“BlkGenerator”
//从分类帐中可用的最后一个块开始,以便可以填充下一个块
//具有正确的块号和上一个块哈希
func newBlockGenerator(lgr ledger.PeerLedger, t *testing.T) *blkGenerator {
assert := assert.New(t)
info, err := lgr.GetBlockchainInfo()
assert.NoError(err)
return &blkGenerator{info.Height - 1, info.CurrentBlockHash, assert}
}
//NextBlock和PvtData将剪切下一个块
func (g *blkGenerator) nextBlockAndPvtdata(trans ...*txAndPvtdata) *ledger.BlockAndPvtData {
block := common.NewBlock(g.lastNum+1, g.lastHash)
blockPvtdata := make(map[uint64]*ledger.TxPvtData)
for i, tran := range trans {
seq := uint64(i)
envelopeBytes, _ := proto.Marshal(tran.Envelope)
block.Data.Data = append(block.Data.Data, envelopeBytes)
if tran.Pvtws != nil {
blockPvtdata[seq] = &ledger.TxPvtData{SeqInBlock: seq, WriteSet: tran.Pvtws}
}
}
block.Header.DataHash = block.Data.Hash()
g.lastNum++
g.lastHash = block.Header.Hash()
setBlockFlagsToValid(block)
return &ledger.BlockAndPvtData{Block: block, PvtData: blockPvtdata,
MissingPvtData: make(ledger.TxMissingPvtDataMap)}
}