// Copyright Fuzamei Corp. 2018 All Rights Reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package blockchain_test import ( "bytes" "encoding/hex" "errors" "fmt" "testing" "time" "github.com/33cn/chain33/blockchain" "github.com/33cn/chain33/client" "github.com/33cn/chain33/common" "github.com/33cn/chain33/common/crypto" "github.com/33cn/chain33/common/log" "github.com/33cn/chain33/common/log/log15" "github.com/33cn/chain33/common/merkle" _ "github.com/33cn/chain33/system" "github.com/33cn/chain33/types" "github.com/33cn/chain33/util" "github.com/33cn/chain33/util/testnode" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func init() { types.Init("local", nil) } var TxHeightOffset int64 = 0 var sendTxWait = time.Millisecond * 5 var chainlog = log15.New("module", "chain_test") func addTx(priv crypto.PrivKey, api client.QueueProtocolAPI) ([]*types.Transaction, string, error) { txs := util.GenCoinsTxs(priv, 1) hash := common.Bytes2Hex(txs[0].Hash()) reply, err := api.SendTx(txs[0]) if err != nil { return nil, hash, err } if !reply.GetIsOk() { return nil, hash, errors.New("sendtx unknow error") } return txs, hash, nil } func addTxTxHeigt(priv crypto.PrivKey, api client.QueueProtocolAPI, height int64) ([]*types.Transaction, string, error) { txs := util.GenTxsTxHeigt(priv, 1, height+TxHeightOffset) hash := common.Bytes2Hex(txs[0].Hash()) reply, err := api.SendTx(txs[0]) if err != nil { return nil, hash, err } if !reply.GetIsOk() { return nil, hash, errors.New("sendtx unknow error") } return txs, hash, nil } func TestBlockChain(t *testing.T) { log.SetLogLevel("crit") mock33 := testnode.New("", nil) defer mock33.Close() blockchain := mock33.GetBlockChain() //等待共识模块增长10个区块 testProcAddBlockMsg(t, mock33, blockchain) testGetBlock(t, blockchain) testGetTx(t, blockchain) testGetTxHashList(t, blockchain) testProcQueryTxMsg(t, blockchain) testGetBlocksMsg(t, blockchain) testProcGetHeadersMsg(t, blockchain) testProcGetLastHeaderMsg(t, blockchain) testGetBlockByHash(t, blockchain) testProcGetLastSequence(t, blockchain) testGetBlockSequences(t, blockchain) testGetBlockByHashes(t, blockchain) testGetSeqByHash(t, blockchain) testPrefixCount(t, mock33, blockchain) testAddrTxCount(t, mock33, blockchain) // QM add testGetBlockHerderByHash(t, blockchain) testProcGetTransactionByHashes(t, blockchain) textProcGetBlockOverview(t, blockchain) testProcGetAddrOverview(t, blockchain) testProcGetBlockHash(t, blockchain) // testSendDelBlockEvent(t, blockchain) testGetOrphanRoot(t, blockchain) testRemoveOrphanBlock(t, blockchain) testDelBlock(t, blockchain) //testLoadBlockBySequence(t, blockchain) testProcDelParaChainBlockMsg(t, mock33, blockchain) testProcAddParaChainBlockMsg(t, mock33, blockchain) testProcBlockChainFork(t, blockchain) } func testProcAddBlockMsg(t *testing.T, mock33 *testnode.Chain33Mock, blockchain *blockchain.BlockChain) { chainlog.Info("testProcAddBlockMsg begin --------------------") curheight := blockchain.GetBlockHeight() addblockheight := curheight + 10 _, err := blockchain.GetBlock(curheight) if err != nil { require.NoError(t, err) } for { _, _, err = addTx(mock33.GetGenesisKey(), mock33.GetAPI()) require.NoError(t, err) curheight = blockchain.GetBlockHeight() chainlog.Info("testProcAddBlockMsg ", "curheight", curheight) _, err = blockchain.GetBlock(curheight) require.NoError(t, err) if curheight >= addblockheight { break } time.Sleep(sendTxWait) } chainlog.Info("testProcAddBlockMsg end --------------------") } func testGetBlock(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("testGetBlock begin --------------------") curheight := blockchain.GetBlockHeight() block, err := blockchain.GetBlock(curheight) require.NoError(t, err) if curheight != block.Block.Height { t.Error("get block height error") } chainlog.Info("testGetBlock end --------------------") } func testGetTx(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("TestGetTx begin --------------------") //构建txhash curheight := blockchain.GetBlockHeight() block, err := blockchain.GetBlock(curheight) require.NoError(t, err) chainlog.Info("testGetTx :", "curheight", curheight) txResult, err := blockchain.GetTxResultFromDb(block.Block.Txs[0].Hash()) require.NoError(t, err) if err == nil && txResult != nil { Execer := string(txResult.GetTx().Execer) if "coins" != Execer { t.Error("ExecerName error") } } chainlog.Info("TestGetTx end --------------------") } func testGetTxHashList(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("TestGetTxHashList begin --------------------") var txhashlist types.TxHashList total := 10 Txs := make([]*types.Transaction, total) // 构建当前高度的tx信息 i := blockchain.GetBlockHeight() for j := 0; j < total; j++ { var transaction types.Transaction payload := fmt.Sprintf("Payload :%d:%d!", i, j) signature := fmt.Sprintf("Signature :%d:%d!", i, j) transaction.Payload = []byte(payload) var signature1 types.Signature signature1.Signature = []byte(signature) transaction.Signature = &signature1 Txs[j] = &transaction txhash := Txs[j].Hash() //chainlog.Info("testGetTxHashList", "height", i, "count", j, "txhash", txhash) txhashlist.Hashes = append(txhashlist.Hashes, txhash[:]) } duptxhashlist, err := blockchain.GetDuplicateTxHashList(&txhashlist) if err != nil { t.Error(err) return } if duptxhashlist != nil { for _, duptxhash := range duptxhashlist.Hashes { if duptxhash != nil { chainlog.Info("testGetTxHashList", "duptxhash", duptxhash) } } } chainlog.Info("TestGetTxHashList end --------------------") } func checkDupTx(cacheTxs []*types.Transaction, blockchain *blockchain.BlockChain) (*types.TxHashList, error) { var txhashlist types.TxHashList i := blockchain.GetBlockHeight() for j, tx := range cacheTxs { txhash := tx.Hash() chainlog.Info("checkDupTx", "height", i, "count", j, "txhash", txhash) txhashlist.Hashes = append(txhashlist.Hashes, txhash[:]) } //count 现在是高度,当前的高度 txhashlist.Count = i duptxhashlist, err := blockchain.GetDuplicateTxHashList(&txhashlist) if err != nil { return nil, err } return duptxhashlist, nil } func checkDupTxHeight(cacheTxsTxHeigt []*types.Transaction, blockchain *blockchain.BlockChain) (*types.TxHashList, error) { var txhashlist types.TxHashList i := blockchain.GetBlockHeight() for j, tx := range cacheTxsTxHeigt { txhash := tx.Hash() chainlog.Info("checkDupTxHeight", "height", i, "count", j, "txhash", txhash) txhashlist.Hashes = append(txhashlist.Hashes, txhash[:]) txhashlist.Expire = append(txhashlist.Expire, tx.Expire) } txhashlist.Count = i duptxhashlist, err := blockchain.GetDuplicateTxHashList(&txhashlist) if err != nil { return nil, err } return duptxhashlist, nil } //构造10个区块,10笔交易不带TxHeight,缓存size128 func TestCheckDupTxHashList01(t *testing.T) { types.S("TxHeight", true) mock33 := testnode.New("", nil) defer func() { defer mock33.Close() types.S("TxHeight", false) }() chainlog.Info("TestCheckDupTxHashList01 begin --------------------") blockchain := mock33.GetBlockChain() curheight := blockchain.GetBlockHeight() addblockheight := curheight + 10 var txs []*types.Transaction for { txlist, _, err := addTx(mock33.GetGenesisKey(), mock33.GetAPI()) require.NoError(t, err) txs = append(txs, txlist...) curheight := blockchain.GetBlockHeight() chainlog.Info("testCheckDupTxHashList01", "curheight", curheight, "addblockheight", addblockheight) _, err = blockchain.GetBlock(curheight) require.NoError(t, err) if curheight >= addblockheight { break } time.Sleep(sendTxWait) } time.Sleep(time.Second) //重复交易 duptxhashlist, err := checkDupTx(txs, blockchain) assert.Nil(t, err) assert.Equal(t, len(duptxhashlist.Hashes), len(txs)) //非重复交易 txs = util.GenCoinsTxs(mock33.GetGenesisKey(), 50) duptxhashlist, err = checkDupTx(txs, blockchain) assert.Nil(t, err) assert.Equal(t, len(duptxhashlist.Hashes), 0) txlist := util.GenTxsTxHeigt(mock33.GetGenesisKey(), 50, 10) txs = append(txs, txlist...) duptxhashlist, err = checkDupTxHeight(txs, blockchain) assert.Nil(t, err) assert.Equal(t, len(duptxhashlist.Hashes), 0) chainlog.Info("TestCheckDupTxHashList01 end --------------------") } //构造10个区块,10笔交易带TxHeight,缓存size128 func TestCheckDupTxHashList02(t *testing.T) { types.S("TxHeight", true) mock33 := testnode.New("", nil) defer func() { defer mock33.Close() types.S("TxHeight", false) }() chainlog.Info("TestCheckDupTxHashList02 begin --------------------") blockchain := mock33.GetBlockChain() curheight := blockchain.GetBlockHeight() addblockheight := curheight + 10 var txs []*types.Transaction for { txlist, _, err := addTxTxHeigt(mock33.GetGenesisKey(), mock33.GetAPI(), int64(curheight)) txs = append(txs, txlist...) require.NoError(t, err) curheight := blockchain.GetBlockHeight() chainlog.Info("testCheckDupTxHashList02", "curheight", curheight, "addblockheight", addblockheight) _, err = blockchain.GetBlock(curheight) require.NoError(t, err) if curheight >= addblockheight { break } time.Sleep(sendTxWait) } time.Sleep(time.Second) //重复交易 duptxhashlist, err := checkDupTxHeight(txs, blockchain) assert.Nil(t, err) assert.Equal(t, len(duptxhashlist.Hashes), len(txs)) //非重复交易 txs = util.GenCoinsTxs(mock33.GetGenesisKey(), 50) duptxhashlist, err = checkDupTxHeight(txs, blockchain) assert.Nil(t, err) assert.Equal(t, len(duptxhashlist.Hashes), 0) txlist := util.GenTxsTxHeigt(mock33.GetGenesisKey(), 50, 10) txs = append(txs, txlist...) duptxhashlist, err = checkDupTxHeight(txs, blockchain) assert.Nil(t, err) assert.Equal(t, len(duptxhashlist.Hashes), 0) chainlog.Info("TestCheckDupTxHashList02 end --------------------") } //构造130个区块,130笔交易不带TxHeight,缓存满 func TestCheckDupTxHashList03(t *testing.T) { types.S("TxHeight", true) mock33 := testnode.New("", nil) defer func() { defer mock33.Close() types.S("TxHeight", false) }() chainlog.Info("TestCheckDupTxHashList03 begin --------------------") blockchain := mock33.GetBlockChain() curheight := blockchain.GetBlockHeight() addblockheight := curheight + 130 var txs []*types.Transaction for { txlist, _, err := addTx(mock33.GetGenesisKey(), mock33.GetAPI()) txs = append(txs, txlist...) require.NoError(t, err) curheight := blockchain.GetBlockHeight() chainlog.Info("testCheckDupTxHashList03", "curheight", curheight, "addblockheight", addblockheight) _, err = blockchain.GetBlock(curheight) require.NoError(t, err) if curheight >= addblockheight { break } time.Sleep(sendTxWait) } time.Sleep(time.Second) //重复交易,不带TxHeight,cache没有会检查db duptxhashlist, err := checkDupTx(txs, blockchain) assert.Nil(t, err) assert.Equal(t, len(duptxhashlist.Hashes), len(txs)) txs = util.GenCoinsTxs(mock33.GetGenesisKey(), 50) duptxhashlist, err = checkDupTx(txs, blockchain) assert.Nil(t, err) assert.Equal(t, len(duptxhashlist.Hashes), 0) txlist := util.GenTxsTxHeigt(mock33.GetGenesisKey(), 50, 10) txs = append(txs, txlist...) duptxhashlist, err = checkDupTxHeight(txs, blockchain) assert.Nil(t, err) assert.Equal(t, len(duptxhashlist.Hashes), 0) chainlog.Info("TestCheckDupTxHashList03 end --------------------") } //构造130个区块,130笔交易带TxHeight,缓存满 func TestCheckDupTxHashList04(t *testing.T) { types.S("TxHeight", true) mock33 := testnode.New("", nil) defer func() { defer mock33.Close() types.S("TxHeight", false) }() chainlog.Info("TestCheckDupTxHashList04 begin --------------------") blockchain := mock33.GetBlockChain() curheight := blockchain.GetBlockHeight() addblockheight := curheight + 130 curheightForExpire := curheight var txs []*types.Transaction for { txlist, _, err := addTxTxHeigt(mock33.GetGenesisKey(), mock33.GetAPI(), int64(curheightForExpire)) txs = append(txs, txlist...) require.NoError(t, err) curheightForExpire = blockchain.GetBlockHeight() chainlog.Info("testCheckDupTxHashList04", "curheight", curheightForExpire, "addblockheight", addblockheight) _, err = blockchain.GetBlock(curheightForExpire) require.NoError(t, err) if curheightForExpire >= addblockheight { break } time.Sleep(sendTxWait) } time.Sleep(time.Second) duptxhashlist, err := checkDupTx(txs, blockchain) assert.Nil(t, err) assert.Equal(t, len(duptxhashlist.Hashes), len(txs)) //非重复交易 txs = util.GenCoinsTxs(mock33.GetGenesisKey(), 50) duptxhashlist, err = checkDupTx(txs, blockchain) assert.Nil(t, err) assert.Equal(t, len(duptxhashlist.Hashes), 0) txlist := util.GenTxsTxHeigt(mock33.GetGenesisKey(), 50, 10) txs = append(txs, txlist...) duptxhashlist, err = checkDupTxHeight(txs, blockchain) assert.Nil(t, err) assert.Equal(t, len(duptxhashlist.Hashes), 0) chainlog.Info("TestCheckDupTxHashList04 end --------------------") } //异常:构造10个区块,10笔交易带TxHeight,TxHeight不满足条件 size128 func TestCheckDupTxHashList05(t *testing.T) { types.S("TxHeight", true) mock33 := testnode.New("", nil) defer func() { defer mock33.Close() types.S("TxHeight", false) }() chainlog.Info("TestCheckDupTxHashList05 begin --------------------") TxHeightOffset = 60 //发送带TxHeight交易且TxHeight不满足条件 for i := 1; i < 10; i++ { _, _, err := addTxTxHeigt(mock33.GetGenesisKey(), mock33.GetAPI(), int64(i)) require.EqualError(t, err, "ErrTxExpire") time.Sleep(sendTxWait) } chainlog.Info("TestCheckDupTxHashList05 end --------------------") } func testProcQueryTxMsg(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("TestProcQueryTxMsg begin --------------------") curheight := blockchain.GetBlockHeight() var merkleroothash []byte var txhash []byte var txindex int //获取当前高度的block信息 block, err := blockchain.GetBlock(curheight) if err == nil { merkleroothash = block.Block.TxHash for index, transaction := range block.Block.Txs { txhash = transaction.Hash() txindex = index } } txproof, err := blockchain.ProcQueryTxMsg(txhash) require.NoError(t, err) //证明txproof的正确性 brroothash := merkle.GetMerkleRootFromBranch(txproof.GetProofs(), txhash, uint32(txindex)) if !bytes.Equal(merkleroothash, brroothash) { t.Error("txproof roothash error") } chainlog.Info("TestProcQueryTxMsg end --------------------") } func testGetBlocksMsg(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("TestGetBlocksMsg begin --------------------") curheight := blockchain.GetBlockHeight() var reqBlock types.ReqBlocks if curheight >= 5 { reqBlock.Start = curheight - 5 } reqBlock.End = curheight reqBlock.IsDetail = true checkheight := reqBlock.Start blocks, err := blockchain.ProcGetBlockDetailsMsg(&reqBlock) if err == nil && blocks != nil { for _, block := range blocks.Items { if checkheight != block.Block.Height || block.Receipts == nil { t.Error("testGetBlocksMsg Block Height or Receipts check error") } checkheight++ } } chainlog.Info("TestGetBlocksMsg end --------------------") } func testProcGetHeadersMsg(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("TestProcGetHeadersMsg begin --------------------") curheight := blockchain.GetBlockHeight() var reqBlock types.ReqBlocks if curheight >= 5 { reqBlock.Start = curheight - 5 } reqBlock.End = curheight checkheight := reqBlock.Start blockheaders, err := blockchain.ProcGetHeadersMsg(&reqBlock) if err == nil && blockheaders != nil { for _, head := range blockheaders.Items { if checkheight != head.Height { t.Error("testProcGetHeadersMsg Block header check error") } checkheight++ } } chainlog.Info("TestProcGetHeadersMsg end --------------------") } func testProcGetLastHeaderMsg(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("TestProcGetLastHeaderMsg begin --------------------") curheight := blockchain.GetBlockHeight() blockheader, err := blockchain.ProcGetLastHeaderMsg() if err == nil && blockheader != nil { if curheight != blockheader.Height { t.Error("testProcGetLastHeaderMsg Last Header check error") } } chainlog.Info("TestProcGetLastHeaderMsg end --------------------") } func testGetBlockByHash(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("TestGetBlockByHash begin --------------------") curheight := blockchain.GetBlockHeight() block1, err := blockchain.GetBlock(curheight - 5) require.NoError(t, err) blockhash1 := block1.Block.Hash() block2, err := blockchain.GetBlock(curheight - 4) require.NoError(t, err) if !bytes.Equal(blockhash1, block2.Block.ParentHash) { fmt.Println("block.ParentHash != prehash: nextParentHash", blockhash1, block2.Block.ParentHash) } block3, err := blockchain.ProcGetBlockByHashMsg(block2.Block.Hash()) require.NoError(t, err) if !bytes.Equal(block2.Block.Hash(), block3.Block.Hash()) { t.Error("testGetBlockByHash Block Hash check error") } chainlog.Info("TestGetBlockByHash end --------------------") } func testProcGetLastSequence(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("testProcGetLastSequence begin --------------------") curheight := blockchain.GetBlockHeight() lastSequence, err := blockchain.GetStore().LoadBlockLastSequence() require.NoError(t, err) if curheight != lastSequence { t.Error("testProcGetLastSequence Last Sequence check error") } chainlog.Info("testProcGetLastSequence end --------------------") } func testGetBlockSequences(t *testing.T, chain *blockchain.BlockChain) { chainlog.Info("testGetBlockSequences begin --------------------") lastSequence, _ := chain.GetStore().LoadBlockLastSequence() var reqBlock types.ReqBlocks if lastSequence >= 5 { reqBlock.Start = lastSequence - 5 } reqBlock.End = lastSequence reqBlock.IsDetail = true Sequences, err := chain.GetBlockSequences(&reqBlock) if err == nil && Sequences != nil { for _, sequence := range Sequences.Items { if sequence.Type != blockchain.AddBlock { t.Error("testGetBlockSequences sequence type check error") } } } chainlog.Info("testGetBlockSequences end --------------------") } func testGetBlockByHashes(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("testGetBlockByHashes begin --------------------") lastSequence, _ := blockchain.GetStore().LoadBlockLastSequence() var reqBlock types.ReqBlocks if lastSequence >= 5 { reqBlock.Start = lastSequence - 5 } reqBlock.End = lastSequence reqBlock.IsDetail = true hashes := make([][]byte, 6) Sequences, err := blockchain.GetBlockSequences(&reqBlock) if err == nil && Sequences != nil { for index, sequence := range Sequences.Items { hashes[index] = sequence.Hash } } blocks, err := blockchain.GetBlockByHashes(hashes) if err == nil && blocks != nil { for index, block := range blocks.Items { if !bytes.Equal(hashes[index], block.Block.Hash()) { t.Error("testGetBlockByHashes block hash check error") } } } chainlog.Info("testGetBlockByHashes end --------------------") } func testGetSeqByHash(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("testGetSeqByHash begin --------------------") lastSequence, _ := blockchain.GetStore().LoadBlockLastSequence() var reqBlock types.ReqBlocks reqBlock.Start = lastSequence reqBlock.End = lastSequence reqBlock.IsDetail = true hashes := make([][]byte, 1) Sequences, err := blockchain.GetBlockSequences(&reqBlock) if err == nil && Sequences != nil { for index, sequence := range Sequences.Items { hashes[index] = sequence.Hash } } seq, err := blockchain.ProcGetSeqByHash(hashes[0]) if seq != -1 { t.Error("testGetSeqByHash only para chain GetSeqByHash ") } chainlog.Info("testGetSeqByHash end --------------------") } func testPrefixCount(t *testing.T, mock33 *testnode.Chain33Mock, blockchain *blockchain.BlockChain) { chainlog.Info("testPrefixCount begin --------------------") msgGen := mock33.GetClient().NewMessage("blockchain", types.EventLocalPrefixCount, &types.ReqKey{Key: []byte("TxAddrHash:14KEKbYtKKQm4wMthSK9J4La4nAiidGozt:")}) mock33.GetClient().Send(msgGen, true) Res, _ := mock33.GetClient().Wait(msgGen) count := Res.GetData().(*types.Int64).Data if count == 0 { t.Error("testPrefixCount count check error ") } chainlog.Info("testPrefixCount end --------------------") } func testAddrTxCount(t *testing.T, mock33 *testnode.Chain33Mock, blockchain *blockchain.BlockChain) { chainlog.Info("testAddrTxCount begin --------------------") var reqkey types.ReqKey reqkey.Key = []byte(fmt.Sprintf("AddrTxsCount:%s", "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt")) count, err := mock33.GetAPI().Query(types.ExecName("coins"), "GetAddrTxsCount", &reqkey) if err != nil { t.Error(err) return } if count.(*types.Int64).GetData() == 0 { t.Error("testAddrTxCount count check error ") } chainlog.Info("testAddrTxCount end --------------------") } func testGetBlockHerderByHash(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("testGetBlockHerderByHash begin --------------------") curheight := blockchain.GetBlockHeight() block, err := blockchain.GetBlock(curheight - 5) require.NoError(t, err) blockhash := block.Block.Hash() block, err = blockchain.GetBlock(curheight - 4) require.NoError(t, err) if !bytes.Equal(blockhash, block.Block.ParentHash) { fmt.Println("block.ParentHash != prehash: nextParentHash", blockhash, block.Block.ParentHash) } header, err := blockchain.GetStore().GetBlockHeaderByHash(block.Block.Hash()) require.NoError(t, err) if !bytes.Equal(header.Hash, block.Block.Hash()) { t.Error("testGetBlockHerderByHash block header hash check error") } chainlog.Info("testGetBlockHerderByHash end --------------------") } func testProcGetTransactionByHashes(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("textProcGetTransactionByHashes begin --------------------") parm := &types.ReqAddr{ Addr: "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt", Height: -1, } txinfos, err := blockchain.ProcGetTransactionByAddr(parm) require.NoError(t, err) var Hashes [][]byte if txinfos != nil { for _, receipt := range txinfos.TxInfos { Hashes = append(Hashes, receipt.Hash) } } TxDetails, err := blockchain.ProcGetTransactionByHashes(Hashes) require.NoError(t, err) if TxDetails != nil { for index, tx := range TxDetails.Txs { if tx.Tx != nil { if !bytes.Equal(Hashes[index], tx.Tx.Hash()) { t.Error("testProcGetTransactionByHashes hash check error") } } } } chainlog.Info("textProcGetTransactionByHashes end --------------------") } func textProcGetBlockOverview(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("textProcGetBlockOverview begin --------------------") curheight := blockchain.GetBlockHeight() block, err := blockchain.GetBlock(curheight - 5) require.NoError(t, err) parm := &types.ReqHash{ Hash: block.Block.Hash(), } blockOverview, err := blockchain.ProcGetBlockOverview(parm) require.NoError(t, err) if blockOverview != nil { if !bytes.Equal(block.Block.Hash(), blockOverview.Head.Hash) { t.Error("textProcGetBlockOverview block hash check error") } } chainlog.Info("textProcGetBlockOverview end --------------------") } func testProcGetAddrOverview(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("testProcGetAddrOverview begin --------------------") curheight := blockchain.GetBlockHeight() block, err := blockchain.GetBlock(curheight - 5) require.NoError(t, err) blockhash := block.Block.Hash() block, err = blockchain.GetBlock(curheight - 4) require.NoError(t, err) if !bytes.Equal(blockhash, block.Block.ParentHash) { fmt.Println("block.ParentHash != prehash: nextParentHash", blockhash, block.Block.ParentHash) } parm := &types.ReqAddr{ Addr: "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt", } addrOverview, err := blockchain.ProcGetAddrOverview(parm) require.NoError(t, err) if addrOverview != nil { if addrOverview.TxCount == 0 { t.Error("testProcGetAddrOverview TxCount check error") } } chainlog.Info("testProcGetAddrOverview end --------------------") } func testProcGetBlockHash(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("testProcGetBlockHash begin --------------------") curheight := blockchain.GetBlockHeight() block, err := blockchain.GetBlock(curheight - 5) require.NoError(t, err) height := &types.ReqInt{curheight - 5} hash, err := blockchain.ProcGetBlockHash(height) require.NoError(t, err) if !bytes.Equal(block.Block.Hash(), hash.Hash) { t.Error("testProcGetBlockHash block hash check error") } chainlog.Info("testProcGetBlockHash end --------------------") } func testGetOrphanRoot(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("testGetOrphanRoot begin --------------------") curheight := blockchain.GetBlockHeight() block, err := blockchain.GetBlock(curheight - 5) require.NoError(t, err) hash := blockchain.GetOrphanPool().GetOrphanRoot(block.Block.Hash()) if !bytes.Equal(block.Block.Hash(), hash) { t.Error("testGetOrphanRoot Orphan Root hash check error") } chainlog.Info("testGetOrphanRoot end --------------------") } func testRemoveOrphanBlock(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("testRemoveOrphanBlock begin --------------------") curheight := blockchain.GetBlockHeight() block, err := blockchain.GetBlock(curheight - 5) require.NoError(t, err) ParentHashNotexist, _ := hex.DecodeString("8bd1f23741c90e9db4edd663acc0328a49f7c92d9974f83e2d5b57b25f3f059b") block.Block.ParentHash = ParentHashNotexist blockchain.GetOrphanPool().RemoveOrphanBlock2(block.Block, time.Time{}, false, "123", 0) chainlog.Info("testRemoveOrphanBlock end --------------------") } func testDelBlock(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("testDelBlock begin --------------------") curheight := blockchain.GetBlockHeight() block, err := blockchain.GetBlock(curheight) require.NoError(t, err) //copy block, or may be data race tmp := *block.Block tmp.Difficulty = block.Block.Difficulty - 100 newblock := *block newblock.Block = &tmp blockchain.ProcessBlock(true, &newblock, "1", true, 0) chainlog.Info("testDelBlock end --------------------") } func testLoadBlockBySequence(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("testLoadBlockBySequence begin ---------------------") curheight := blockchain.GetBlockHeight() block, err := blockchain.GetStore().LoadBlockBySequence(curheight) require.NoError(t, err) if block.Block.Height != curheight { t.Error("testLoadBlockBySequence block height check error") } chainlog.Info("testLoadBlockBySequence end -------------------------") } func testProcDelParaChainBlockMsg(t *testing.T, mock33 *testnode.Chain33Mock, blockchain *blockchain.BlockChain) { chainlog.Info("testProcDelParaChainBlockMsg begin --------------------") curheight := blockchain.GetBlockHeight() block, err := blockchain.GetBlock(curheight - 1) require.NoError(t, err) var parablockDetail types.ParaChainBlockDetail parablockDetail.Blockdetail = block parablockDetail.Sequence = 1 msgGen := mock33.GetClient().NewMessage("blockchain", types.EventDelParaChainBlockDetail, ¶blockDetail) mock33.GetClient().Send(msgGen, true) resp, _ := mock33.GetClient().Wait(msgGen) if resp.GetData().(*types.Reply).IsOk { t.Error("testProcDelParaChainBlockMsg only in parachain ") } chainlog.Info("testProcDelParaChainBlockMsg end --------------------") } func testProcAddParaChainBlockMsg(t *testing.T, mock33 *testnode.Chain33Mock, blockchain *blockchain.BlockChain) { chainlog.Info("testProcAddParaChainBlockMsg begin --------------------") curheight := blockchain.GetBlockHeight() block, err := blockchain.GetBlock(curheight) require.NoError(t, err) var parablockDetail types.ParaChainBlockDetail parablockDetail.Blockdetail = block parablockDetail.Sequence = 1 msgGen := mock33.GetClient().NewMessage("blockchain", types.EventAddParaChainBlockDetail, ¶blockDetail) mock33.GetClient().Send(msgGen, true) _, err = mock33.GetClient().Wait(msgGen) if err != nil { t.Log(err) //t.Error("testProcAddParaChainBlockMsg only in parachain ") } chainlog.Info("testProcAddParaChainBlockMsg end --------------------") } func testProcBlockChainFork(t *testing.T, blockchain *blockchain.BlockChain) { chainlog.Info("testProcBlockChainFork begin --------------------") curheight := blockchain.GetBlockHeight() blockchain.ProcBlockChainFork(curheight-1, curheight+256, "self") chainlog.Info("testProcBlockChainFork end --------------------") }