Skip to content

Commit 64e6ce4

Browse files
committed
Fixes in ledger code for new transaction structure
https://jira.hyperledger.org/browse/FAB-1199 This commit fixes the ledger code as per new transaction structure. Also removed the explicit dependency on the msp security code by moving the code to a separate testutil for a better reuse. Change-Id: I60d3968ae26684747435c195bbe45a78697f4803 Signed-off-by: manish <[email protected]>
1 parent 61affa0 commit 64e6ce4

File tree

11 files changed

+243
-187
lines changed

11 files changed

+243
-187
lines changed

core/committer/committer_test.go

+1-20
Original file line numberDiff line numberDiff line change
@@ -24,29 +24,10 @@ import (
2424
"github.com/hyperledger/fabric/core/ledger/testutil"
2525
"github.com/stretchr/testify/assert"
2626

27-
"fmt"
28-
29-
"github.com/hyperledger/fabric/core/crypto/primitives"
30-
"github.com/hyperledger/fabric/msp"
3127
pb "github.com/hyperledger/fabric/protos/peer"
3228
)
3329

3430
func TestKVLedgerBlockStorage(t *testing.T) {
35-
primitives.SetSecurityLevel("SHA2", 256)
36-
37-
// setup the MSP manager so that we can sign/verify
38-
mspMgrConfigFile := "../../msp/peer-config.json"
39-
msp.GetManager().Setup(mspMgrConfigFile)
40-
mspId := "DEFAULT"
41-
id := "PEER"
42-
signingIdentity := &msp.IdentityIdentifier{Mspid: msp.ProviderIdentifier{Value: mspId}, Value: id}
43-
signer, err := msp.GetManager().GetSigningIdentity(signingIdentity)
44-
if err != nil {
45-
os.Exit(-1)
46-
fmt.Printf("Could not initialize msp/signer")
47-
return
48-
}
49-
5031
conf := kvledger.NewConf("/tmp/tests/ledger/", 0)
5132
defer os.RemoveAll("/tmp/tests/ledger/")
5233

@@ -70,7 +51,7 @@ func TestKVLedgerBlockStorage(t *testing.T) {
7051
simulator.Done()
7152

7253
simRes, _ := simulator.GetTxSimulationResults()
73-
block1 := testutil.ConstructBlockForSimulationResults(t, [][]byte{simRes}, signer)
54+
block1 := testutil.ConstructBlockForSimulationResults(t, [][]byte{simRes}, true)
7455

7556
err = committer.CommitBlock(block1)
7657
assert.NoError(t, err)

core/ledger/blkstorage/fsblkstorage/blockfile_mgr.go

+25-10
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ import (
2525
"github.com/hyperledger/fabric/core/ledger/blkstorage"
2626
"github.com/hyperledger/fabric/core/ledger/util"
2727
"github.com/hyperledger/fabric/core/ledger/util/db"
28-
"github.com/op/go-logging"
29-
28+
"github.com/hyperledger/fabric/protos/common"
3029
pb "github.com/hyperledger/fabric/protos/peer"
30+
putil "github.com/hyperledger/fabric/protos/utils"
31+
"github.com/op/go-logging"
3132
)
3233

3334
var logger = logging.MustGetLogger("kvledger")
@@ -466,16 +467,12 @@ func (mgr *blockfileMgr) fetchSerBlock(lp *fileLocPointer) (*pb.SerBlock2, error
466467
}
467468

468469
func (mgr *blockfileMgr) fetchTransaction(lp *fileLocPointer) (*pb.Transaction, error) {
469-
txBytes, err := mgr.fetchRawBytes(lp)
470-
if err != nil {
471-
return nil, err
472-
}
473-
tx := &pb.Transaction{}
474-
err = proto.Unmarshal(txBytes, tx)
475-
if err != nil {
470+
var err error
471+
var txEnvelopeBytes []byte
472+
if txEnvelopeBytes, err = mgr.fetchRawBytes(lp); err != nil {
476473
return nil, err
477474
}
478-
return tx, nil
475+
return extractTransaction(txEnvelopeBytes)
479476
}
480477

481478
func (mgr *blockfileMgr) fetchBlockBytes(lp *fileLocPointer) ([]byte, error) {
@@ -560,6 +557,24 @@ func scanForLastCompleteBlock(rootDir string, fileNum int, startingOffset int64)
560557
return blockStream.currentOffset, numBlocks, errRead
561558
}
562559

560+
func extractTransaction(txEnvelopeBytes []byte) (*pb.Transaction, error) {
561+
var err error
562+
var txEnvelope *common.Envelope
563+
var txPayload *common.Payload
564+
var tx *pb.Transaction
565+
566+
if txEnvelope, err = putil.GetEnvelope(txEnvelopeBytes); err != nil {
567+
return nil, err
568+
}
569+
if txPayload, err = putil.GetPayload(txEnvelope); err != nil {
570+
return nil, err
571+
}
572+
if tx, err = putil.GetTransaction(txPayload.Data); err != nil {
573+
return nil, err
574+
}
575+
return tx, nil
576+
}
577+
563578
// checkpointInfo
564579
type checkpointInfo struct {
565580
latestFileChunkSuffixNum int

core/ledger/blkstorage/fsblkstorage/blockfile_mgr_test.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,12 @@ func TestBlockfileMgrGetTxById(t *testing.T) {
143143
blocks := testutil.ConstructTestBlocks(t, 10)
144144
blkfileMgrWrapper.addBlocks(blocks)
145145
for i, blk := range blocks {
146-
for j, txBytes := range blk.Transactions {
146+
for j, txEnvelopeBytes := range blk.Transactions {
147147
// blockNum starts with 1
148148
txID := constructTxID(uint64(i+1), j)
149149
txFromFileMgr, err := blkfileMgrWrapper.blockfileMgr.retrieveTransactionByID(txID)
150150
testutil.AssertNoError(t, err, "Error while retrieving tx from blkfileMgr")
151-
tx := &pb.Transaction{}
152-
err = proto.Unmarshal(txBytes, tx)
151+
tx, err := extractTransaction(txEnvelopeBytes)
153152
testutil.AssertNoError(t, err, "Error while unmarshalling tx")
154153
testutil.AssertEquals(t, txFromFileMgr, tx)
155154
}

core/ledger/blkstorage/fsblkstorage/blockindex_test.go

+2-5
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,8 @@ import (
2020
"fmt"
2121
"testing"
2222

23-
"github.com/golang/protobuf/proto"
2423
"github.com/hyperledger/fabric/core/ledger/blkstorage"
2524
"github.com/hyperledger/fabric/core/ledger/testutil"
26-
27-
pb "github.com/hyperledger/fabric/protos/peer"
2825
)
2926

3027
type noopIndex struct {
@@ -144,8 +141,8 @@ func testBlockIndexSelectiveIndexing(t *testing.T, indexItems []blkstorage.Index
144141
tx, err := blockfileMgr.retrieveTransactionByID(constructTxID(1, 0))
145142
if testutil.Contains(indexItems, blkstorage.IndexableAttrTxID) {
146143
testutil.AssertNoError(t, err, "Error while retrieving tx by id")
147-
txOrig := &pb.Transaction{}
148-
proto.Unmarshal(blocks[0].Transactions[0], txOrig)
144+
txOrig, err := extractTransaction(blocks[0].Transactions[0])
145+
testutil.AssertNoError(t, err, "")
149146
testutil.AssertEquals(t, tx, txOrig)
150147
} else {
151148
testutil.AssertSame(t, err, blkstorage.ErrAttrNotIndexed)

core/ledger/kvledger/example/app.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import (
2222
"github.com/golang/protobuf/proto"
2323
"github.com/hyperledger/fabric/core/ledger"
2424

25+
"github.com/hyperledger/fabric/core/util"
2526
"github.com/hyperledger/fabric/protos/common"
26-
pb "github.com/hyperledger/fabric/protos/peer"
27-
putils "github.com/hyperledger/fabric/protos/utils"
27+
ptestutils "github.com/hyperledger/fabric/protos/testutils"
2828
)
2929

3030
// App - a sample fund transfer app
@@ -39,7 +39,7 @@ func ConstructAppInstance(ledger ledger.ValidatedLedger) *App {
3939
}
4040

4141
// Init simulates init transaction
42-
func (app *App) Init(initialBalances map[string]int) (*pb.Transaction, error) {
42+
func (app *App) Init(initialBalances map[string]int) (*common.Envelope, error) {
4343
var txSimulator ledger.TxSimulator
4444
var err error
4545
if txSimulator, err = app.ledger.NewTxSimulator(); err != nil {
@@ -58,8 +58,7 @@ func (app *App) Init(initialBalances map[string]int) (*pb.Transaction, error) {
5858
}
5959

6060
// TransferFunds simulates a transaction for transferring fund from fromAccount to toAccount
61-
func (app *App) TransferFunds(fromAccount string, toAccount string, transferAmt int) (*pb.Transaction, error) {
62-
61+
func (app *App) TransferFunds(fromAccount string, toAccount string, transferAmt int) (*common.Envelope, error) {
6362
// act as endorsing peer shim code to simulate a transaction on behalf of chaincode
6463
var txSimulator ledger.TxSimulator
6564
var err error
@@ -102,6 +101,7 @@ func (app *App) QueryBalances(accounts []string) ([]int, error) {
102101
if queryExecutor, err = app.ledger.NewQueryExecutor(); err != nil {
103102
return nil, err
104103
}
104+
defer queryExecutor.Done()
105105
balances := make([]int, len(accounts))
106106
for i := 0; i < len(accounts); i++ {
107107
var balBytes []byte
@@ -113,9 +113,9 @@ func (app *App) QueryBalances(accounts []string) ([]int, error) {
113113
return balances, nil
114114
}
115115

116-
func constructTransaction(simulationResults []byte) *pb.Transaction {
117-
tx, _ := putils.CreateTx(common.HeaderType_ENDORSER_TRANSACTION, nil, nil, simulationResults, []*pb.Endorsement{})
118-
return tx
116+
func constructTransaction(simulationResults []byte) *common.Envelope {
117+
txEnv, _ := ptestutils.ConstructSingedTxEnvWithDefaultSigner(util.GenerateUUID(), "foo", simulationResults, nil, nil)
118+
return txEnv
119119
}
120120

121121
func toBytes(balance int) []byte {

core/ledger/kvledger/example/consenter.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package example
1919
import (
2020
"github.com/golang/protobuf/proto"
2121

22+
"github.com/hyperledger/fabric/protos/common"
2223
pb "github.com/hyperledger/fabric/protos/peer"
2324
)
2425

@@ -32,7 +33,7 @@ func ConstructConsenter() *Consenter {
3233
}
3334

3435
// ConstructBlock constructs a block from a list of transactions
35-
func (c *Consenter) ConstructBlock(transactions ...*pb.Transaction) *pb.Block2 {
36+
func (c *Consenter) ConstructBlock(transactions ...*common.Envelope) *pb.Block2 {
3637
logger.Debugf("Construct a block based on the transactions")
3738
block := &pb.Block2{}
3839
for _, tx := range transactions {

core/ledger/kvledger/example/marble_app.go

+3-5
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ import (
2424

2525
ledger "github.com/hyperledger/fabric/core/ledger"
2626

27-
pb "github.com/hyperledger/fabric/protos/peer"
28-
27+
"github.com/hyperledger/fabric/protos/common"
2928
logging "github.com/op/go-logging"
3029
)
3130

@@ -55,7 +54,7 @@ type Marble struct {
5554
}
5655

5756
// CreateMarble simulates init transaction
58-
func (marbleApp *MarbleApp) CreateMarble(args []string) (*pb.Transaction, error) {
57+
func (marbleApp *MarbleApp) CreateMarble(args []string) (*common.Envelope, error) {
5958
// 0 1 2 3
6059
// "asdf", "blue", "35", "bob"
6160
logger.Debugf("===COUCHDB=== Entering ----------CreateMarble()----------")
@@ -126,8 +125,7 @@ func init_marble(args []string) ([]byte, error) {
126125
}
127126

128127
// TransferMarble simulates transfer transaction
129-
func (marbleApp *MarbleApp) TransferMarble(args []string) (*pb.Transaction, error) {
130-
128+
func (marbleApp *MarbleApp) TransferMarble(args []string) (*common.Envelope, error) {
131129
// 0 1
132130
// "name", "bob"
133131
if len(args) < 2 {

core/ledger/kvledger/kv_ledger_test.go

+2-23
Original file line numberDiff line numberDiff line change
@@ -20,31 +20,10 @@ import (
2020
"testing"
2121

2222
"github.com/hyperledger/fabric/core/ledger/testutil"
23-
24-
"fmt"
25-
"os"
26-
27-
"github.com/hyperledger/fabric/core/crypto/primitives"
28-
"github.com/hyperledger/fabric/msp"
2923
pb "github.com/hyperledger/fabric/protos/peer"
3024
)
3125

3226
func TestKVLedgerBlockStorage(t *testing.T) {
33-
primitives.SetSecurityLevel("SHA2", 256)
34-
35-
// setup the MSP manager so that we can sign/verify
36-
mspMgrConfigFile := "../../../msp/peer-config.json"
37-
msp.GetManager().Setup(mspMgrConfigFile)
38-
mspId := "DEFAULT"
39-
id := "PEER"
40-
signingIdentity := &msp.IdentityIdentifier{Mspid: msp.ProviderIdentifier{Value: mspId}, Value: id}
41-
signer, err := msp.GetManager().GetSigningIdentity(signingIdentity)
42-
if err != nil {
43-
os.Exit(-1)
44-
fmt.Printf("Could not initialize msp/signer")
45-
return
46-
}
47-
4827
env := newTestEnv(t)
4928
defer env.cleanup()
5029
ledger, _ := NewKVLedger(env.conf)
@@ -60,7 +39,7 @@ func TestKVLedgerBlockStorage(t *testing.T) {
6039
simulator.SetState("ns1", "key3", []byte("value3"))
6140
simulator.Done()
6241
simRes, _ := simulator.GetTxSimulationResults()
63-
block1 := testutil.ConstructBlockForSimulationResults(t, [][]byte{simRes}, signer)
42+
block1 := testutil.ConstructBlockForSimulationResults(t, [][]byte{simRes}, false)
6443
ledger.RemoveInvalidTransactionsAndPrepare(block1)
6544
ledger.Commit()
6645

@@ -76,7 +55,7 @@ func TestKVLedgerBlockStorage(t *testing.T) {
7655
simulator.SetState("ns1", "key3", []byte("value6"))
7756
simulator.Done()
7857
simRes, _ = simulator.GetTxSimulationResults()
79-
block2 := testutil.ConstructBlockForSimulationResults(t, [][]byte{simRes}, signer)
58+
block2 := testutil.ConstructBlockForSimulationResults(t, [][]byte{simRes}, false)
8059
ledger.RemoveInvalidTransactionsAndPrepare(block2)
8160
ledger.Commit()
8261

core/ledger/testutil/test_helper.go

+13-41
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,17 @@ import (
2020
"testing"
2121

2222
"github.com/golang/protobuf/proto"
23-
2423
"github.com/hyperledger/fabric/core/util"
25-
"github.com/hyperledger/fabric/msp"
2624
"github.com/hyperledger/fabric/protos/common"
2725
pb "github.com/hyperledger/fabric/protos/peer"
28-
putils "github.com/hyperledger/fabric/protos/utils"
26+
ptestutils "github.com/hyperledger/fabric/protos/testutils"
2927
)
3028

3129
// ConstructBlockForSimulationResults constructs a block that includes a number of transactions - one per simulationResults
32-
func ConstructBlockForSimulationResults(t *testing.T, simulationResults [][]byte, signer msp.SigningIdentity) *pb.Block2 {
30+
func ConstructBlockForSimulationResults(t *testing.T, simulationResults [][]byte, sign bool) *pb.Block2 {
3331
envs := []*common.Envelope{}
3432
for i := 0; i < len(simulationResults); i++ {
35-
env, err := ConstructTestTransaction(t, simulationResults[i], signer)
33+
env, err := ConstructTestTransaction(t, simulationResults[i], sign)
3634
if err != nil {
3735
t.Fatalf("ConstructTestTransaction failed, err %s", err)
3836
}
@@ -52,38 +50,22 @@ func ConstructTestBlocks(t *testing.T, numBlocks int) []*pb.Block2 {
5250

5351
// ConstructTestBlock constructs a block with 'numTx' number of transactions for testing
5452
func ConstructTestBlock(t *testing.T, numTx int, txSize int, startingTxID int) *pb.Block2 {
55-
txs := []*pb.Transaction{}
53+
txEnvs := []*common.Envelope{}
5654
for i := startingTxID; i < numTx+startingTxID; i++ {
57-
tx, _ := putils.CreateTx(common.HeaderType_ENDORSER_TRANSACTION, []byte{}, []byte{}, ConstructRandomBytes(t, txSize), []*pb.Endorsement{})
58-
txs = append(txs, tx)
55+
txEnv, _ := ConstructTestTransaction(t, ConstructRandomBytes(t, txSize), false)
56+
txEnvs = append(txEnvs, txEnv)
5957
}
60-
return newBlock(txs)
58+
return newBlockEnv(txEnvs)
6159
}
6260

6361
// ConstructTestTransaction constructs a transaction for testing
64-
func ConstructTestTransaction(t *testing.T, simulationResults []byte, signer msp.SigningIdentity) (*common.Envelope, error) {
65-
ss, err := signer.Serialize()
66-
if err != nil {
67-
return nil, err
68-
}
69-
70-
uuid := util.GenerateUUID()
71-
prop, err := putils.CreateChaincodeProposal(uuid, &pb.ChaincodeInvocationSpec{ChaincodeSpec: &pb.ChaincodeSpec{ChaincodeID: &pb.ChaincodeID{Name: "foo"}}}, ss)
72-
if err != nil {
73-
return nil, err
74-
}
75-
76-
presp, err := putils.CreateProposalResponse(prop.Header, prop.Payload, simulationResults, nil, nil, signer)
77-
if err != nil {
78-
return nil, err
79-
}
80-
81-
env, err := putils.CreateSignedTx(prop, signer, presp)
82-
if err != nil {
83-
return nil, err
62+
func ConstructTestTransaction(t *testing.T, simulationResults []byte, sign bool) (*common.Envelope, error) {
63+
ccName := "foo"
64+
txID := util.GenerateUUID()
65+
if sign {
66+
return ptestutils.ConstructSingedTxEnvWithDefaultSigner(txID, ccName, simulationResults, nil, nil)
8467
}
85-
86-
return env, nil
68+
return ptestutils.ConstructUnsingedTxEnv(txID, ccName, simulationResults, nil, nil)
8769
}
8870

8971
// ComputeBlockHash computes the crypto-hash of a block
@@ -93,16 +75,6 @@ func ComputeBlockHash(t testing.TB, block *pb.Block2) []byte {
9375
return serBlock.ComputeHash()
9476
}
9577

96-
func newBlock(txs []*pb.Transaction) *pb.Block2 {
97-
block := &pb.Block2{}
98-
block.PreviousBlockHash = []byte{}
99-
for i := 0; i < len(txs); i++ {
100-
txBytes, _ := proto.Marshal(txs[i])
101-
block.Transactions = append(block.Transactions, txBytes)
102-
}
103-
return block
104-
}
105-
10678
func newBlockEnv(env []*common.Envelope) *pb.Block2 {
10779
block := &pb.Block2{}
10880
block.PreviousBlockHash = []byte{}

0 commit comments

Comments
 (0)