OSDN Git Service

feat(net/netsync/p2p/pow): Change network lib and remove pow (#1864)
[bytom/bytom.git] / test / bench_blockchain_test.go
index a94a0fd..7ee7052 100644 (file)
 package test
 
-import (
-       "fmt"
-       "io/ioutil"
-       "os"
-       "testing"
-       "time"
-
-       "github.com/bytom/bytom/account"
-       "github.com/bytom/bytom/blockchain/pseudohsm"
-       "github.com/bytom/bytom/blockchain/signers"
-       "github.com/bytom/bytom/blockchain/txbuilder"
-       "github.com/bytom/bytom/consensus"
-       "github.com/bytom/bytom/consensus/difficulty"
-       "github.com/bytom/bytom/crypto/ed25519/chainkd"
-       "github.com/bytom/bytom/database"
-       "github.com/bytom/bytom/database/storage"
-       "github.com/bytom/bytom/event"
-       "github.com/bytom/bytom/mining"
-       "github.com/bytom/bytom/protocol"
-       "github.com/bytom/bytom/protocol/bc"
-       "github.com/bytom/bytom/protocol/bc/types"
-       "github.com/bytom/bytom/protocol/state"
-       dbm "github.com/bytom/bytom/database/leveldb"
-)
-
-func BenchmarkChain_CoinBaseTx_NoAsset(b *testing.B) {
-       benchInsertChain(b, 0, 0, "")
-}
-
-func BenchmarkChain_BtmTx_NoAsset_BASE(b *testing.B) {
-       benchInsertChain(b, 1, 0, "")
-}
-
-func BenchmarkChain_5000BtmTx_NoAsset_BASE(b *testing.B) {
-       benchInsertChain(b, 5000, 0, "")
-}
-
-func BenchmarkChain_5000BtmTx_1Asset_BASE(b *testing.B) {
-       benchInsertChain(b, 5000, 1, "")
-}
-
-// standard Transaction
-func BenchmarkChain_BtmTx_NoAsset_P2PKH(b *testing.B) {
-       benchInsertChain(b, 1000, 0, "P2PKH")
-}
-
-func BenchmarkChain_BtmTx_1Asset_P2PKH(b *testing.B) {
-       benchInsertChain(b, 1000, 1, "P2PKH")
-}
-
-func BenchmarkChain_BtmTx_NoAsset_P2SH(b *testing.B) {
-       benchInsertChain(b, 100, 0, "P2SH")
-}
-
-func BenchmarkChain_BtmTx_1Asset_P2SH(b *testing.B) {
-       benchInsertChain(b, 100, 1, "P2SH")
-}
-
-func BenchmarkChain_BtmTx_NoAsset_MultiSign(b *testing.B) {
-       benchInsertChain(b, 100, 0, "MultiSign")
-}
-
-func BenchmarkChain_BtmTx_1Asset_MultiSign(b *testing.B) {
-       benchInsertChain(b, 100, 1, "MultiSign")
-}
-
-func benchInsertChain(b *testing.B, blockTxNumber int, otherAssetNum int, txType string) {
-       b.StopTimer()
-       testNumber := b.N
-       totalTxNumber := testNumber * blockTxNumber
-
-       dirPath, err := ioutil.TempDir(".", "testDB")
-       if err != nil {
-               b.Fatal("create dirPath err:", err)
-       }
-       defer os.RemoveAll(dirPath)
-
-       testDB := dbm.NewDB("testdb", "leveldb", dirPath)
-       defer testDB.Close()
-
-       // Generate a chain test data.
-       chain, txs, txPool, err := GenerateChainData(dirPath, testDB, totalTxNumber, otherAssetNum, txType)
-       if err != nil {
-               b.Fatal("GenerateChainData err:", err)
-       }
-
-       b.ReportAllocs()
-       b.StartTimer()
-
-       for i := 0; i < b.N; i++ {
-               testTxs := txs[blockTxNumber*i : blockTxNumber*(i+1)]
-               if err := InsertChain(chain, txPool, testTxs); err != nil {
-                       b.Fatal("Failed to insert block into chain:", err)
-               }
-       }
-}
-
-func GenerateChainData(dirPath string, testDB dbm.DB, txNumber, otherAssetNum int, txType string) (*protocol.Chain, []*types.Tx, *protocol.TxPool, error) {
-       var err error
-
-       // generate transactions
-       txs := []*types.Tx{}
-       switch txType {
-       case "P2PKH":
-               txs, err = MockTxsP2PKH(dirPath, testDB, txNumber, otherAssetNum)
-               if err != nil {
-                       return nil, nil, nil, err
-               }
-       case "P2SH":
-               txs, err = MockTxsP2SH(dirPath, testDB, txNumber, otherAssetNum)
-               if err != nil {
-                       return nil, nil, nil, err
-               }
-       case "MultiSign":
-               txs, err = MockTxsMultiSign(dirPath, testDB, txNumber, otherAssetNum)
-               if err != nil {
-                       return nil, nil, nil, err
-               }
-       default:
-               txs, err = CreateTxbyNum(txNumber, otherAssetNum)
-               if err != nil {
-                       return nil, nil, nil, err
-               }
-       }
-
-       // init UtxoViewpoint
-       utxoView := state.NewUtxoViewpoint()
-       utxoEntry := storage.NewUtxoEntry(false, 1, false)
-       for _, tx := range txs {
-               for _, id := range tx.SpentOutputIDs {
-                       utxoView.Entries[id] = utxoEntry
-               }
-       }
-
-       if err := SetUtxoView(testDB, utxoView); err != nil {
-               return nil, nil, nil, err
-       }
-
-       store := database.NewStore(testDB)
-       dispatcher := event.NewDispatcher()
-       txPool := protocol.NewTxPool(store, dispatcher)
-       chain, err := protocol.NewChain(store, txPool)
-       if err != nil {
-               return nil, nil, nil, err
-       }
-
-       go processNewTxch(txPool)
-
-       return chain, txs, txPool, nil
-}
-
-func InsertChain(chain *protocol.Chain, txPool *protocol.TxPool, txs []*types.Tx) error {
-       for _, tx := range txs {
-               if err := txbuilder.FinalizeTx(nil, chain, tx); err != nil {
-                       return err
-               }
-       }
-
-       block, err := mining.NewBlockTemplate(chain, txPool, nil)
-       if err != nil {
-               return err
-       }
-
-       blockSize, err := block.MarshalText()
-       if err != nil {
-               return err
-       }
-
-       fmt.Println("blocksize:", uint64(len(blockSize)))
-       fmt.Println("block tx count:", uint64(len(block.Transactions)))
-       fmt.Println("coinbase txsize:", uint64(block.Transactions[0].SerializedSize))
-       if len(block.Transactions) > 1 {
-               fmt.Println("txsize:", uint64(block.Transactions[1].SerializedSize))
-       }
-
-       seed, err := chain.CalcNextSeed(&block.PreviousBlockHash)
-       if err != nil {
-               return err
-       }
-
-       if err := SolveBlock(seed, block); err != nil {
-               return err
-       }
-
-       if _, err := chain.ProcessBlock(block); err != nil {
-               return err
-       }
-
-       return nil
-}
-
-func processNewTxch(txPool *protocol.TxPool) {
-}
-
-func SolveBlock(seed *bc.Hash, block *types.Block) error {
-       maxNonce := ^uint64(0) // 2^64 - 1
-       header := &block.BlockHeader
-       for i := uint64(0); i < maxNonce; i++ {
-               header.Nonce = i
-               headerHash := header.Hash()
-               if difficulty.CheckProofOfWork(&headerHash, seed, header.Bits) {
-                       return nil
-               }
-       }
-       return nil
-}
-
-func MockSimpleUtxo(index uint64, assetID *bc.AssetID, amount uint64, ctrlProg *account.CtrlProgram) *account.UTXO {
-       if ctrlProg == nil {
-               ctrlProg = &account.CtrlProgram{
-                       AccountID:      "",
-                       Address:        "",
-                       KeyIndex:       uint64(0),
-                       ControlProgram: []byte{81},
-                       Change:         false,
-               }
-       }
-
-       utxo := &account.UTXO{
-               OutputID:            bc.Hash{V0: 1},
-               SourceID:            bc.Hash{V0: 1},
-               AssetID:             *assetID,
-               Amount:              amount,
-               SourcePos:           index,
-               ControlProgram:      ctrlProg.ControlProgram,
-               ControlProgramIndex: ctrlProg.KeyIndex,
-               AccountID:           ctrlProg.AccountID,
-               Address:             ctrlProg.Address,
-               ValidHeight:         0,
-       }
-
-       return utxo
-}
-
-func GenerateBaseUtxos(num int, amount uint64, ctrlProg *account.CtrlProgram) []*account.UTXO {
-       utxos := []*account.UTXO{}
-       for i := 0; i < num; i++ {
-               utxo := MockSimpleUtxo(uint64(i), consensus.BTMAssetID, amount, ctrlProg)
-               utxos = append(utxos, utxo)
-       }
-
-       return utxos
-}
-
-func GenerateOtherUtxos(typeCount, num int, amount uint64, ctrlProg *account.CtrlProgram) []*account.UTXO {
-       utxos := []*account.UTXO{}
-
-       assetID := &bc.AssetID{
-               V0: uint64(typeCount),
-               V1: uint64(1),
-               V2: uint64(0),
-               V3: uint64(1),
-       }
-
-       for i := 0; i < num; i++ {
-               utxo := MockSimpleUtxo(uint64(typeCount*num+i), assetID, amount, ctrlProg)
-               utxos = append(utxos, utxo)
-       }
-
-       return utxos
-}
-
-func AddTxInputFromUtxo(utxo *account.UTXO, singer *signers.Signer) (*types.TxInput, *txbuilder.SigningInstruction, error) {
-       txInput, signInst, err := account.UtxoToInputs(singer, utxo)
-       if err != nil {
-               return nil, nil, err
-       }
-
-       return txInput, signInst, nil
-}
-
-func AddTxOutput(assetID bc.AssetID, amount uint64, controlProgram []byte) *types.TxOutput {
-       out := types.NewTxOutput(assetID, amount, controlProgram)
-       return out
-}
-
-func CreateTxBuilder(baseUtxo *account.UTXO, btmServiceFlag bool, signer *signers.Signer) (*txbuilder.TemplateBuilder, error) {
-       tplBuilder := txbuilder.NewBuilder(time.Now())
-
-       // add input
-       txInput, signInst, err := AddTxInputFromUtxo(baseUtxo, signer)
-       if err != nil {
-               return nil, err
-       }
-       tplBuilder.AddInput(txInput, signInst)
-
-       // if the btm is the service charge, didn't need to add the output
-       if btmServiceFlag {
-               txOutput := AddTxOutput(baseUtxo.AssetID, 100, baseUtxo.ControlProgram)
-               tplBuilder.AddOutput(txOutput)
-       }
-
-       return tplBuilder, nil
-}
-
-func AddTxBuilder(tplBuilder *txbuilder.TemplateBuilder, utxo *account.UTXO, signer *signers.Signer) error {
-       txInput, signInst, err := AddTxInputFromUtxo(utxo, signer)
-       if err != nil {
-               return err
-       }
-       tplBuilder.AddInput(txInput, signInst)
-
-       txOutput := AddTxOutput(utxo.AssetID, utxo.Amount, utxo.ControlProgram)
-       tplBuilder.AddOutput(txOutput)
-
-       return nil
-}
-
-func BuildTx(baseUtxo *account.UTXO, otherUtxos []*account.UTXO, signer *signers.Signer) (*txbuilder.Template, error) {
-       btmServiceFlag := false
-       if otherUtxos == nil || len(otherUtxos) == 0 {
-               btmServiceFlag = true
-       }
-
-       tplBuilder, err := CreateTxBuilder(baseUtxo, btmServiceFlag, signer)
-       if err != nil {
-               return nil, err
-       }
-
-       for _, u := range otherUtxos {
-               if err := AddTxBuilder(tplBuilder, u, signer); err != nil {
-                       return nil, err
-               }
-       }
-
-       tpl, _, err := tplBuilder.Build()
-       if err != nil {
-               return nil, err
-       }
-
-       return tpl, nil
-}
-
-func GenetrateTxbyUtxo(baseUtxo []*account.UTXO, otherUtxo [][]*account.UTXO) ([]*types.Tx, error) {
-       tmpUtxo := []*account.UTXO{}
-       txs := []*types.Tx{}
-       otherUtxoFlag := true
-
-       if len(otherUtxo) == 0 || len(otherUtxo) != len(baseUtxo) {
-               otherUtxoFlag = false
-       }
-
-       for i := 0; i < len(baseUtxo); i++ {
-               if otherUtxoFlag {
-                       tmpUtxo = otherUtxo[i]
-               } else {
-                       tmpUtxo = nil
-               }
-
-               tpl, err := BuildTx(baseUtxo[i], tmpUtxo, nil)
-               if err != nil {
-                       return nil, err
-               }
-
-               txs = append(txs, tpl.Transaction)
-       }
-
-       return txs, nil
-}
-
-func CreateTxbyNum(txNumber, otherAssetNum int) ([]*types.Tx, error) {
-       baseUtxos := GenerateBaseUtxos(txNumber, 1000000000, nil)
-       otherUtxos := make([][]*account.UTXO, 0, txNumber)
-       if otherAssetNum != 0 {
-               for i := 0; i < txNumber; i++ {
-                       utxos := GenerateOtherUtxos(i, otherAssetNum, 6000, nil)
-                       otherUtxos = append(otherUtxos, utxos)
-               }
-       }
-
-       txs, err := GenetrateTxbyUtxo(baseUtxos, otherUtxos)
-       if err != nil {
-               return nil, err
-       }
-
-       return txs, nil
-}
-
-func SetUtxoView(db dbm.DB, view *state.UtxoViewpoint) error {
-       batch := db.NewBatch()
-       if err := database.SaveUtxoView(batch, view); err != nil {
-               return err
-       }
-       batch.Write()
-       return nil
-}
-
-//-------------------------Mock actual transaction----------------------------------
-func MockTxsP2PKH(keyDirPath string, testDB dbm.DB, txNumber, otherAssetNum int) ([]*types.Tx, error) {
-       accountManager := account.NewManager(testDB, nil)
-       hsm, err := pseudohsm.New(keyDirPath)
-       if err != nil {
-               return nil, err
-       }
-
-       xpub, _, err := hsm.XCreate("TestP2PKH", "password", "en")
-       if err != nil {
-               return nil, err
-       }
-
-       txs := []*types.Tx{}
-       for i := 0; i < txNumber; i++ {
-               testAccountAlias := fmt.Sprintf("testAccount%d", i)
-               testAccount, err := accountManager.Create([]chainkd.XPub{xpub.XPub}, 1, testAccountAlias, signers.BIP0044)
-               if err != nil {
-                       return nil, err
-               }
-
-               controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
-               if err != nil {
-                       return nil, err
-               }
-
-               utxo := MockSimpleUtxo(0, consensus.BTMAssetID, 1000000000, controlProg)
-               otherUtxos := GenerateOtherUtxos(i, otherAssetNum, 6000, controlProg)
-               tpl, err := BuildTx(utxo, otherUtxos, testAccount.Signer)
-               if err != nil {
-                       return nil, err
-               }
-
-               if _, err := MockSign(tpl, hsm, "password"); err != nil {
-                       return nil, err
-               }
-
-               txs = append(txs, tpl.Transaction)
-       }
-
-       return txs, nil
-}
-
-func MockTxsP2SH(keyDirPath string, testDB dbm.DB, txNumber, otherAssetNum int) ([]*types.Tx, error) {
-       accountManager := account.NewManager(testDB, nil)
-       hsm, err := pseudohsm.New(keyDirPath)
-       if err != nil {
-               return nil, err
-       }
-
-       xpub1, _, err := hsm.XCreate("TestP2SH1", "password", "en")
-       if err != nil {
-               return nil, err
-       }
-
-       xpub2, _, err := hsm.XCreate("TestP2SH2", "password", "en")
-       if err != nil {
-               return nil, err
-       }
-
-       txs := []*types.Tx{}
-       for i := 0; i < txNumber; i++ {
-               testAccountAlias := fmt.Sprintf("testAccount%d", i)
-               testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, testAccountAlias, signers.BIP0044)
-               if err != nil {
-                       return nil, err
-               }
-
-               controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
-               if err != nil {
-                       return nil, err
-               }
-
-               utxo := MockSimpleUtxo(0, consensus.BTMAssetID, 1000000000, controlProg)
-               otherUtxos := GenerateOtherUtxos(i, otherAssetNum, 6000, controlProg)
-               tpl, err := BuildTx(utxo, otherUtxos, testAccount.Signer)
-               if err != nil {
-                       return nil, err
-               }
-
-               if _, err := MockSign(tpl, hsm, "password"); err != nil {
-                       return nil, err
-               }
-
-               txs = append(txs, tpl.Transaction)
-       }
-
-       return txs, nil
-}
-
-func MockTxsMultiSign(keyDirPath string, testDB dbm.DB, txNumber, otherAssetNum int) ([]*types.Tx, error) {
-       accountManager := account.NewManager(testDB, nil)
-       hsm, err := pseudohsm.New(keyDirPath)
-       if err != nil {
-               return nil, err
-       }
-
-       xpub1, _, err := hsm.XCreate("TestMultilNodeSign1", "password1", "en")
-       if err != nil {
-               return nil, err
-       }
-
-       xpub2, _, err := hsm.XCreate("TestMultilNodeSign2", "password2", "en")
-       if err != nil {
-               return nil, err
-       }
-       txs := []*types.Tx{}
-       for i := 0; i < txNumber; i++ {
-               testAccountAlias := fmt.Sprintf("testAccount%d", i)
-               testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, testAccountAlias, signers.BIP0044)
-               if err != nil {
-                       return nil, err
-               }
-
-               controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
-               if err != nil {
-                       return nil, err
-               }
-
-               utxo := MockSimpleUtxo(0, consensus.BTMAssetID, 1000000000, controlProg)
-               otherUtxos := GenerateOtherUtxos(i, otherAssetNum, 6000, controlProg)
-               tpl, err := BuildTx(utxo, otherUtxos, testAccount.Signer)
-               if err != nil {
-                       return nil, err
-               }
-
-               if _, err := MockSign(tpl, hsm, "password1"); err != nil {
-                       return nil, err
-               }
-
-               if _, err := MockSign(tpl, hsm, "password2"); err != nil {
-                       return nil, err
-               }
-
-               txs = append(txs, tpl.Transaction)
-       }
-
-       return txs, nil
-}
+// import (
+//     "fmt"
+//     "io/ioutil"
+//     "os"
+//     "testing"
+//     "time"
+
+//     "github.com/bytom/bytom/account"
+//     "github.com/bytom/bytom/blockchain/pseudohsm"
+//     "github.com/bytom/bytom/blockchain/signers"
+//     "github.com/bytom/bytom/blockchain/txbuilder"
+//     "github.com/bytom/bytom/consensus"
+//     "github.com/bytom/bytom/crypto/ed25519/chainkd"
+//     "github.com/bytom/bytom/database"
+//     dbm "github.com/bytom/bytom/database/leveldb"
+//     "github.com/bytom/bytom/database/storage"
+//     "github.com/bytom/bytom/event"
+//     "github.com/bytom/bytom/protocol"
+//     "github.com/bytom/bytom/protocol/bc"
+//     "github.com/bytom/bytom/protocol/bc/types"
+//     "github.com/bytom/bytom/protocol/state"
+// )
+
+// func BenchmarkChain_CoinBaseTx_NoAsset(b *testing.B) {
+//     benchInsertChain(b, 0, 0, "")
+// }
+
+// func BenchmarkChain_BtmTx_NoAsset_BASE(b *testing.B) {
+//     benchInsertChain(b, 1, 0, "")
+// }
+
+// func BenchmarkChain_5000BtmTx_NoAsset_BASE(b *testing.B) {
+//     benchInsertChain(b, 5000, 0, "")
+// }
+
+// func BenchmarkChain_5000BtmTx_1Asset_BASE(b *testing.B) {
+//     benchInsertChain(b, 5000, 1, "")
+// }
+
+// // standard Transaction
+// func BenchmarkChain_BtmTx_NoAsset_P2PKH(b *testing.B) {
+//     benchInsertChain(b, 1000, 0, "P2PKH")
+// }
+
+// func BenchmarkChain_BtmTx_1Asset_P2PKH(b *testing.B) {
+//     benchInsertChain(b, 1000, 1, "P2PKH")
+// }
+
+// func BenchmarkChain_BtmTx_NoAsset_P2SH(b *testing.B) {
+//     benchInsertChain(b, 100, 0, "P2SH")
+// }
+
+// func BenchmarkChain_BtmTx_1Asset_P2SH(b *testing.B) {
+//     benchInsertChain(b, 100, 1, "P2SH")
+// }
+
+// func BenchmarkChain_BtmTx_NoAsset_MultiSign(b *testing.B) {
+//     benchInsertChain(b, 100, 0, "MultiSign")
+// }
+
+// func BenchmarkChain_BtmTx_1Asset_MultiSign(b *testing.B) {
+//     benchInsertChain(b, 100, 1, "MultiSign")
+// }
+
+// // func benchInsertChain(b *testing.B, blockTxNumber int, otherAssetNum int, txType string) {
+// //  b.StopTimer()
+// //  testNumber := b.N
+// //  totalTxNumber := testNumber * blockTxNumber
+
+// //  dirPath, err := ioutil.TempDir(".", "testDB")
+// //  if err != nil {
+// //          b.Fatal("create dirPath err:", err)
+// //  }
+// //  defer os.RemoveAll(dirPath)
+
+// //  testDB := dbm.NewDB("testdb", "leveldb", dirPath)
+// //  defer testDB.Close()
+
+// //  // Generate a chain test data.
+// //  chain, txs, txPool, err := GenerateChainData(dirPath, testDB, totalTxNumber, otherAssetNum, txType)
+// //  if err != nil {
+// //          b.Fatal("GenerateChainData err:", err)
+// //  }
+
+// //  b.ReportAllocs()
+// //  b.StartTimer()
+
+// //  for i := 0; i < b.N; i++ {
+// //          testTxs := txs[blockTxNumber*i : blockTxNumber*(i+1)]
+// //          if err := InsertChain(chain, txPool, testTxs); err != nil {
+// //                  b.Fatal("Failed to insert block into chain:", err)
+// //          }
+// //  }
+// // }
+
+// func GenerateChainData(dirPath string, testDB dbm.DB, txNumber, otherAssetNum int, txType string) (*protocol.Chain, []*types.Tx, *protocol.TxPool, error) {
+//     var err error
+
+//     // generate transactions
+//     txs := []*types.Tx{}
+//     switch txType {
+//     case "P2PKH":
+//             txs, err = MockTxsP2PKH(dirPath, testDB, txNumber, otherAssetNum)
+//             if err != nil {
+//                     return nil, nil, nil, err
+//             }
+//     case "P2SH":
+//             txs, err = MockTxsP2SH(dirPath, testDB, txNumber, otherAssetNum)
+//             if err != nil {
+//                     return nil, nil, nil, err
+//             }
+//     case "MultiSign":
+//             txs, err = MockTxsMultiSign(dirPath, testDB, txNumber, otherAssetNum)
+//             if err != nil {
+//                     return nil, nil, nil, err
+//             }
+//     default:
+//             txs, err = CreateTxbyNum(txNumber, otherAssetNum)
+//             if err != nil {
+//                     return nil, nil, nil, err
+//             }
+//     }
+
+//     // init UtxoViewpoint
+//     utxoView := state.NewUtxoViewpoint()
+//     utxoEntry := storage.NewUtxoEntry(false, 1, false)
+//     for _, tx := range txs {
+//             for _, id := range tx.SpentOutputIDs {
+//                     utxoView.Entries[id] = utxoEntry
+//             }
+//     }
+
+//     if err := SetUtxoView(testDB, utxoView); err != nil {
+//             return nil, nil, nil, err
+//     }
+
+//     store := database.NewStore(testDB)
+//     dispatcher := event.NewDispatcher()
+//     txPool := protocol.NewTxPool(store, dispatcher)
+//     chain, err := protocol.NewChain(store, txPool)
+//     if err != nil {
+//             return nil, nil, nil, err
+//     }
+
+//     go processNewTxch(txPool)
+
+//     return chain, txs, txPool, nil
+// }
+
+// // func InsertChain(chain *protocol.Chain, txPool *protocol.TxPool, txs []*types.Tx) error {
+// //  for _, tx := range txs {
+// //          if err := txbuilder.FinalizeTx(nil, chain, tx); err != nil {
+// //                  return err
+// //          }
+// //  }
+
+// //  block, err := mining.NewBlockTemplate(chain, txPool, nil)
+// //  if err != nil {
+// //          return err
+// //  }
+
+// //  blockSize, err := block.MarshalText()
+// //  if err != nil {
+// //          return err
+// //  }
+
+// //  fmt.Println("blocksize:", uint64(len(blockSize)))
+// //  fmt.Println("block tx count:", uint64(len(block.Transactions)))
+// //  fmt.Println("coinbase txsize:", uint64(block.Transactions[0].SerializedSize))
+// //  if len(block.Transactions) > 1 {
+// //          fmt.Println("txsize:", uint64(block.Transactions[1].SerializedSize))
+// //  }
+
+// //  seed, err := chain.CalcNextSeed(&block.PreviousBlockHash)
+// //  if err != nil {
+// //          return err
+// //  }
+
+// //  if err := SolveBlock(seed, block); err != nil {
+// //          return err
+// //  }
+
+// //  if _, err := chain.ProcessBlock(block); err != nil {
+// //          return err
+// //  }
+
+// //  return nil
+// // }
+
+// func processNewTxch(txPool *protocol.TxPool) {
+// }
+
+// // func SolveBlock(seed *bc.Hash, block *types.Block) error {
+// //  maxNonce := ^uint64(0) // 2^64 - 1
+// //  header := &block.BlockHeader
+// //  for i := uint64(0); i < maxNonce; i++ {
+// //          header.Nonce = i
+// //          headerHash := header.Hash()
+// //          if difficulty.CheckProofOfWork(&headerHash, seed, header.Bits) {
+// //                  return nil
+// //          }
+// //  }
+// //  return nil
+// // }
+
+// func MockSimpleUtxo(index uint64, assetID *bc.AssetID, amount uint64, ctrlProg *account.CtrlProgram) *account.UTXO {
+//     if ctrlProg == nil {
+//             ctrlProg = &account.CtrlProgram{
+//                     AccountID:      "",
+//                     Address:        "",
+//                     KeyIndex:       uint64(0),
+//                     ControlProgram: []byte{81},
+//                     Change:         false,
+//             }
+//     }
+
+//     utxo := &account.UTXO{
+//             OutputID:            bc.Hash{V0: 1},
+//             SourceID:            bc.Hash{V0: 1},
+//             AssetID:             *assetID,
+//             Amount:              amount,
+//             SourcePos:           index,
+//             ControlProgram:      ctrlProg.ControlProgram,
+//             ControlProgramIndex: ctrlProg.KeyIndex,
+//             AccountID:           ctrlProg.AccountID,
+//             Address:             ctrlProg.Address,
+//             ValidHeight:         0,
+//     }
+
+//     return utxo
+// }
+
+// func GenerateBaseUtxos(num int, amount uint64, ctrlProg *account.CtrlProgram) []*account.UTXO {
+//     utxos := []*account.UTXO{}
+//     for i := 0; i < num; i++ {
+//             utxo := MockSimpleUtxo(uint64(i), consensus.BTMAssetID, amount, ctrlProg)
+//             utxos = append(utxos, utxo)
+//     }
+
+//     return utxos
+// }
+
+// func GenerateOtherUtxos(typeCount, num int, amount uint64, ctrlProg *account.CtrlProgram) []*account.UTXO {
+//     utxos := []*account.UTXO{}
+
+//     assetID := &bc.AssetID{
+//             V0: uint64(typeCount),
+//             V1: uint64(1),
+//             V2: uint64(0),
+//             V3: uint64(1),
+//     }
+
+//     for i := 0; i < num; i++ {
+//             utxo := MockSimpleUtxo(uint64(typeCount*num+i), assetID, amount, ctrlProg)
+//             utxos = append(utxos, utxo)
+//     }
+
+//     return utxos
+// }
+
+// func AddTxInputFromUtxo(utxo *account.UTXO, singer *signers.Signer) (*types.TxInput, *txbuilder.SigningInstruction, error) {
+//     txInput, signInst, err := account.UtxoToInputs(singer, utxo)
+//     if err != nil {
+//             return nil, nil, err
+//     }
+
+//     return txInput, signInst, nil
+// }
+
+// func AddTxOutput(assetID bc.AssetID, amount uint64, controlProgram []byte) *types.TxOutput {
+//     out := types.NewTxOutput(assetID, amount, controlProgram)
+//     return out
+// }
+
+// func CreateTxBuilder(baseUtxo *account.UTXO, btmServiceFlag bool, signer *signers.Signer) (*txbuilder.TemplateBuilder, error) {
+//     tplBuilder := txbuilder.NewBuilder(time.Now())
+
+//     // add input
+//     txInput, signInst, err := AddTxInputFromUtxo(baseUtxo, signer)
+//     if err != nil {
+//             return nil, err
+//     }
+//     tplBuilder.AddInput(txInput, signInst)
+
+//     // if the btm is the service charge, didn't need to add the output
+//     if btmServiceFlag {
+//             txOutput := AddTxOutput(baseUtxo.AssetID, 100, baseUtxo.ControlProgram)
+//             tplBuilder.AddOutput(txOutput)
+//     }
+
+//     return tplBuilder, nil
+// }
+
+// func AddTxBuilder(tplBuilder *txbuilder.TemplateBuilder, utxo *account.UTXO, signer *signers.Signer) error {
+//     txInput, signInst, err := AddTxInputFromUtxo(utxo, signer)
+//     if err != nil {
+//             return err
+//     }
+//     tplBuilder.AddInput(txInput, signInst)
+
+//     txOutput := AddTxOutput(utxo.AssetID, utxo.Amount, utxo.ControlProgram)
+//     tplBuilder.AddOutput(txOutput)
+
+//     return nil
+// }
+
+// func BuildTx(baseUtxo *account.UTXO, otherUtxos []*account.UTXO, signer *signers.Signer) (*txbuilder.Template, error) {
+//     btmServiceFlag := false
+//     if otherUtxos == nil || len(otherUtxos) == 0 {
+//             btmServiceFlag = true
+//     }
+
+//     tplBuilder, err := CreateTxBuilder(baseUtxo, btmServiceFlag, signer)
+//     if err != nil {
+//             return nil, err
+//     }
+
+//     for _, u := range otherUtxos {
+//             if err := AddTxBuilder(tplBuilder, u, signer); err != nil {
+//                     return nil, err
+//             }
+//     }
+
+//     tpl, _, err := tplBuilder.Build()
+//     if err != nil {
+//             return nil, err
+//     }
+
+//     return tpl, nil
+// }
+
+// func GenetrateTxbyUtxo(baseUtxo []*account.UTXO, otherUtxo [][]*account.UTXO) ([]*types.Tx, error) {
+//     tmpUtxo := []*account.UTXO{}
+//     txs := []*types.Tx{}
+//     otherUtxoFlag := true
+
+//     if len(otherUtxo) == 0 || len(otherUtxo) != len(baseUtxo) {
+//             otherUtxoFlag = false
+//     }
+
+//     for i := 0; i < len(baseUtxo); i++ {
+//             if otherUtxoFlag {
+//                     tmpUtxo = otherUtxo[i]
+//             } else {
+//                     tmpUtxo = nil
+//             }
+
+//             tpl, err := BuildTx(baseUtxo[i], tmpUtxo, nil)
+//             if err != nil {
+//                     return nil, err
+//             }
+
+//             txs = append(txs, tpl.Transaction)
+//     }
+
+//     return txs, nil
+// }
+
+// func CreateTxbyNum(txNumber, otherAssetNum int) ([]*types.Tx, error) {
+//     baseUtxos := GenerateBaseUtxos(txNumber, 1000000000, nil)
+//     otherUtxos := make([][]*account.UTXO, 0, txNumber)
+//     if otherAssetNum != 0 {
+//             for i := 0; i < txNumber; i++ {
+//                     utxos := GenerateOtherUtxos(i, otherAssetNum, 6000, nil)
+//                     otherUtxos = append(otherUtxos, utxos)
+//             }
+//     }
+
+//     txs, err := GenetrateTxbyUtxo(baseUtxos, otherUtxos)
+//     if err != nil {
+//             return nil, err
+//     }
+
+//     return txs, nil
+// }
+
+// func SetUtxoView(db dbm.DB, view *state.UtxoViewpoint) error {
+//     batch := db.NewBatch()
+//     if err := database.SaveUtxoView(batch, view); err != nil {
+//             return err
+//     }
+//     batch.Write()
+//     return nil
+// }
+
+// //-------------------------Mock actual transaction----------------------------------
+// func MockTxsP2PKH(keyDirPath string, testDB dbm.DB, txNumber, otherAssetNum int) ([]*types.Tx, error) {
+//     accountManager := account.NewManager(testDB, nil)
+//     hsm, err := pseudohsm.New(keyDirPath)
+//     if err != nil {
+//             return nil, err
+//     }
+
+//     xpub, _, err := hsm.XCreate("TestP2PKH", "password", "en")
+//     if err != nil {
+//             return nil, err
+//     }
+
+//     txs := []*types.Tx{}
+//     for i := 0; i < txNumber; i++ {
+//             testAccountAlias := fmt.Sprintf("testAccount%d", i)
+//             testAccount, err := accountManager.Create([]chainkd.XPub{xpub.XPub}, 1, testAccountAlias, signers.BIP0044)
+//             if err != nil {
+//                     return nil, err
+//             }
+
+//             controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
+//             if err != nil {
+//                     return nil, err
+//             }
+
+//             utxo := MockSimpleUtxo(0, consensus.BTMAssetID, 1000000000, controlProg)
+//             otherUtxos := GenerateOtherUtxos(i, otherAssetNum, 6000, controlProg)
+//             tpl, err := BuildTx(utxo, otherUtxos, testAccount.Signer)
+//             if err != nil {
+//                     return nil, err
+//             }
+
+//             if _, err := MockSign(tpl, hsm, "password"); err != nil {
+//                     return nil, err
+//             }
+
+//             txs = append(txs, tpl.Transaction)
+//     }
+
+//     return txs, nil
+// }
+
+// func MockTxsP2SH(keyDirPath string, testDB dbm.DB, txNumber, otherAssetNum int) ([]*types.Tx, error) {
+//     accountManager := account.NewManager(testDB, nil)
+//     hsm, err := pseudohsm.New(keyDirPath)
+//     if err != nil {
+//             return nil, err
+//     }
+
+//     xpub1, _, err := hsm.XCreate("TestP2SH1", "password", "en")
+//     if err != nil {
+//             return nil, err
+//     }
+
+//     xpub2, _, err := hsm.XCreate("TestP2SH2", "password", "en")
+//     if err != nil {
+//             return nil, err
+//     }
+
+//     txs := []*types.Tx{}
+//     for i := 0; i < txNumber; i++ {
+//             testAccountAlias := fmt.Sprintf("testAccount%d", i)
+//             testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, testAccountAlias, signers.BIP0044)
+//             if err != nil {
+//                     return nil, err
+//             }
+
+//             controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
+//             if err != nil {
+//                     return nil, err
+//             }
+
+//             utxo := MockSimpleUtxo(0, consensus.BTMAssetID, 1000000000, controlProg)
+//             otherUtxos := GenerateOtherUtxos(i, otherAssetNum, 6000, controlProg)
+//             tpl, err := BuildTx(utxo, otherUtxos, testAccount.Signer)
+//             if err != nil {
+//                     return nil, err
+//             }
+
+//             if _, err := MockSign(tpl, hsm, "password"); err != nil {
+//                     return nil, err
+//             }
+
+//             txs = append(txs, tpl.Transaction)
+//     }
+
+//     return txs, nil
+// }
+
+// func MockTxsMultiSign(keyDirPath string, testDB dbm.DB, txNumber, otherAssetNum int) ([]*types.Tx, error) {
+//     accountManager := account.NewManager(testDB, nil)
+//     hsm, err := pseudohsm.New(keyDirPath)
+//     if err != nil {
+//             return nil, err
+//     }
+
+//     xpub1, _, err := hsm.XCreate("TestMultilNodeSign1", "password1", "en")
+//     if err != nil {
+//             return nil, err
+//     }
+
+//     xpub2, _, err := hsm.XCreate("TestMultilNodeSign2", "password2", "en")
+//     if err != nil {
+//             return nil, err
+//     }
+//     txs := []*types.Tx{}
+//     for i := 0; i < txNumber; i++ {
+//             testAccountAlias := fmt.Sprintf("testAccount%d", i)
+//             testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, testAccountAlias, signers.BIP0044)
+//             if err != nil {
+//                     return nil, err
+//             }
+
+//             controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
+//             if err != nil {
+//                     return nil, err
+//             }
+
+//             utxo := MockSimpleUtxo(0, consensus.BTMAssetID, 1000000000, controlProg)
+//             otherUtxos := GenerateOtherUtxos(i, otherAssetNum, 6000, controlProg)
+//             tpl, err := BuildTx(utxo, otherUtxos, testAccount.Signer)
+//             if err != nil {
+//                     return nil, err
+//             }
+
+//             if _, err := MockSign(tpl, hsm, "password1"); err != nil {
+//                     return nil, err
+//             }
+
+//             if _, err := MockSign(tpl, hsm, "password2"); err != nil {
+//                     return nil, err
+//             }
+
+//             txs = append(txs, tpl.Transaction)
+//     }
+
+//     return txs, nil
+// }