github.com/bytom/bytom@v1.1.2-0.20221014091027-bbcba3df6075/test/bench_blockchain_test.go (about)

     1  package test
     2  
     3  //
     4  //import (
     5  //	"fmt"
     6  //	"io/ioutil"
     7  //	"os"
     8  //	"testing"
     9  //	"time"
    10  //
    11  //	"github.com/bytom/bytom/account"
    12  //	"github.com/bytom/bytom/blockchain/pseudohsm"
    13  //	"github.com/bytom/bytom/blockchain/signers"
    14  //	"github.com/bytom/bytom/blockchain/txbuilder"
    15  //	"github.com/bytom/bytom/consensus"
    16  //	"github.com/bytom/bytom/crypto/ed25519/chainkd"
    17  //	"github.com/bytom/bytom/database"
    18  //	dbm "github.com/bytom/bytom/database/leveldb"
    19  //	"github.com/bytom/bytom/database/storage"
    20  //	"github.com/bytom/bytom/event"
    21  //	"github.com/bytom/bytom/mining"
    22  //	"github.com/bytom/bytom/protocol"
    23  //	"github.com/bytom/bytom/protocol/bc"
    24  //	"github.com/bytom/bytom/protocol/bc/types"
    25  //	"github.com/bytom/bytom/protocol/state"
    26  //)
    27  //
    28  //func BenchmarkChain_CoinBaseTx_NoAsset(b *testing.B) {
    29  //	benchInsertChain(b, 0, 0, "")
    30  //}
    31  //
    32  //func BenchmarkChain_BtmTx_NoAsset_BASE(b *testing.B) {
    33  //	benchInsertChain(b, 1, 0, "")
    34  //}
    35  //
    36  //func BenchmarkChain_5000BtmTx_NoAsset_BASE(b *testing.B) {
    37  //	benchInsertChain(b, 5000, 0, "")
    38  //}
    39  //
    40  //func BenchmarkChain_5000BtmTx_1Asset_BASE(b *testing.B) {
    41  //	benchInsertChain(b, 5000, 1, "")
    42  //}
    43  //
    44  //// standard Transaction
    45  //func BenchmarkChain_BtmTx_NoAsset_P2PKH(b *testing.B) {
    46  //	benchInsertChain(b, 1000, 0, "P2PKH")
    47  //}
    48  //
    49  //func BenchmarkChain_BtmTx_1Asset_P2PKH(b *testing.B) {
    50  //	benchInsertChain(b, 1000, 1, "P2PKH")
    51  //}
    52  //
    53  //func BenchmarkChain_BtmTx_NoAsset_P2SH(b *testing.B) {
    54  //	benchInsertChain(b, 100, 0, "P2SH")
    55  //}
    56  //
    57  //func BenchmarkChain_BtmTx_1Asset_P2SH(b *testing.B) {
    58  //	benchInsertChain(b, 100, 1, "P2SH")
    59  //}
    60  //
    61  //func BenchmarkChain_BtmTx_NoAsset_MultiSign(b *testing.B) {
    62  //	benchInsertChain(b, 100, 0, "MultiSign")
    63  //}
    64  //
    65  //func BenchmarkChain_BtmTx_1Asset_MultiSign(b *testing.B) {
    66  //	benchInsertChain(b, 100, 1, "MultiSign")
    67  //}
    68  //
    69  //func benchInsertChain(b *testing.B, blockTxNumber int, otherAssetNum int, txType string) {
    70  //	b.StopTimer()
    71  //	testNumber := b.N
    72  //	totalTxNumber := testNumber * blockTxNumber
    73  //
    74  //	dirPath, err := ioutil.TempDir(".", "testDB")
    75  //	if err != nil {
    76  //		b.Fatal("create dirPath err:", err)
    77  //	}
    78  //	defer os.RemoveAll(dirPath)
    79  //
    80  //	testDB := dbm.NewDB("testdb", "leveldb", dirPath)
    81  //	defer testDB.Close()
    82  //
    83  //	// Generate a chain test data.
    84  //	chain, txs, txPool, err := GenerateChainData(dirPath, testDB, totalTxNumber, otherAssetNum, txType)
    85  //	if err != nil {
    86  //		b.Fatal("GenerateChainData err:", err)
    87  //	}
    88  //
    89  //	b.ReportAllocs()
    90  //	b.StartTimer()
    91  //
    92  //	for i := 0; i < b.N; i++ {
    93  //		testTxs := txs[blockTxNumber*i : blockTxNumber*(i+1)]
    94  //		if err := InsertChain(chain, txPool, testTxs); err != nil {
    95  //			b.Fatal("Failed to insert block into chain:", err)
    96  //		}
    97  //	}
    98  //}
    99  //
   100  //func GenerateChainData(dirPath string, testDB dbm.DB, txNumber, otherAssetNum int, txType string) (*protocol.Chain, []*types.Tx, *protocol.TxPool, error) {
   101  //	var err error
   102  //
   103  //	// generate transactions
   104  //	txs := []*types.Tx{}
   105  //	switch txType {
   106  //	case "P2PKH":
   107  //		txs, err = MockTxsP2PKH(dirPath, testDB, txNumber, otherAssetNum)
   108  //		if err != nil {
   109  //			return nil, nil, nil, err
   110  //		}
   111  //	case "P2SH":
   112  //		txs, err = MockTxsP2SH(dirPath, testDB, txNumber, otherAssetNum)
   113  //		if err != nil {
   114  //			return nil, nil, nil, err
   115  //		}
   116  //	case "MultiSign":
   117  //		txs, err = MockTxsMultiSign(dirPath, testDB, txNumber, otherAssetNum)
   118  //		if err != nil {
   119  //			return nil, nil, nil, err
   120  //		}
   121  //	default:
   122  //		txs, err = CreateTxbyNum(txNumber, otherAssetNum)
   123  //		if err != nil {
   124  //			return nil, nil, nil, err
   125  //		}
   126  //	}
   127  //
   128  //	// init UtxoViewpoint
   129  //	utxoView := state.NewUtxoViewpoint()
   130  //	utxoEntry := storage.NewUtxoEntry(false, 1, false)
   131  //	for _, tx := range txs {
   132  //		for _, id := range tx.SpentOutputIDs {
   133  //			utxoView.Entries[id] = utxoEntry
   134  //		}
   135  //	}
   136  //
   137  //	if err := SetUtxoView(testDB, utxoView); err != nil {
   138  //		return nil, nil, nil, err
   139  //	}
   140  //
   141  //	store := database.NewStore(testDB)
   142  //	dispatcher := event.NewDispatcher()
   143  //	txPool := protocol.NewTxPool(store, dispatcher)
   144  //	chain, err := protocol.NewChain(store, txPool)
   145  //	if err != nil {
   146  //		return nil, nil, nil, err
   147  //	}
   148  //
   149  //	go processNewTxch(txPool)
   150  //
   151  //	return chain, txs, txPool, nil
   152  //}
   153  //
   154  //func InsertChain(chain *protocol.Chain, txPool *protocol.TxPool, txs []*types.Tx) error {
   155  //	for _, tx := range txs {
   156  //		if err := txbuilder.FinalizeTx(nil, chain, tx); err != nil {
   157  //			return err
   158  //		}
   159  //	}
   160  //	// imitate block broadcast deplay
   161  //	time.Sleep(time.Second)
   162  //	block, err := mining.NewBlockTemplate(chain, txPool, nil)
   163  //	if err != nil {
   164  //		return err
   165  //	}
   166  //	blockSize, err := block.MarshalText()
   167  //	if err != nil {
   168  //		return err
   169  //	}
   170  //	fmt.Println("blocksize:", uint64(len(blockSize)))
   171  //	fmt.Println("block tx count:", uint64(len(block.Transactions)))
   172  //	fmt.Println("coinbase txsize:", uint64(block.Transactions[0].SerializedSize))
   173  //	if len(block.Transactions) > 1 {
   174  //		fmt.Println("txsize:", uint64(block.Transactions[1].SerializedSize))
   175  //	}
   176  //	if _, err := chain.ProcessBlock(block); err != nil {
   177  //		return err
   178  //	}
   179  //
   180  //	return nil
   181  //}
   182  //
   183  //func processNewTxch(txPool *protocol.TxPool) {
   184  //}
   185  //
   186  //func MockSimpleUtxo(index uint64, assetID *bc.AssetID, amount uint64, ctrlProg *account.CtrlProgram) *account.UTXO {
   187  //	if ctrlProg == nil {
   188  //		ctrlProg = &account.CtrlProgram{
   189  //			AccountID:      "",
   190  //			Address:        "",
   191  //			KeyIndex:       uint64(0),
   192  //			ControlProgram: []byte{81},
   193  //			Change:         false,
   194  //		}
   195  //	}
   196  //
   197  //	utxo := &account.UTXO{
   198  //		OutputID:            bc.Hash{V0: 1},
   199  //		SourceID:            bc.Hash{V0: 1},
   200  //		AssetID:             *assetID,
   201  //		Amount:              amount,
   202  //		SourcePos:           index,
   203  //		ControlProgram:      ctrlProg.ControlProgram,
   204  //		ControlProgramIndex: ctrlProg.KeyIndex,
   205  //		AccountID:           ctrlProg.AccountID,
   206  //		Address:             ctrlProg.Address,
   207  //		ValidHeight:         0,
   208  //	}
   209  //
   210  //	return utxo
   211  //}
   212  //
   213  //func GenerateBaseUtxos(num int, amount uint64, ctrlProg *account.CtrlProgram) []*account.UTXO {
   214  //	utxos := []*account.UTXO{}
   215  //	for i := 0; i < num; i++ {
   216  //		utxo := MockSimpleUtxo(uint64(i), consensus.BTMAssetID, amount, ctrlProg)
   217  //		utxos = append(utxos, utxo)
   218  //	}
   219  //
   220  //	return utxos
   221  //}
   222  //
   223  //func GenerateOtherUtxos(typeCount, num int, amount uint64, ctrlProg *account.CtrlProgram) []*account.UTXO {
   224  //	utxos := []*account.UTXO{}
   225  //
   226  //	assetID := &bc.AssetID{
   227  //		V0: uint64(typeCount),
   228  //		V1: uint64(1),
   229  //		V2: uint64(0),
   230  //		V3: uint64(1),
   231  //	}
   232  //
   233  //	for i := 0; i < num; i++ {
   234  //		utxo := MockSimpleUtxo(uint64(typeCount*num+i), assetID, amount, ctrlProg)
   235  //		utxos = append(utxos, utxo)
   236  //	}
   237  //
   238  //	return utxos
   239  //}
   240  //
   241  //func AddTxInputFromUtxo(utxo *account.UTXO, singer *signers.Signer) (*types.TxInput, *txbuilder.SigningInstruction, error) {
   242  //	txInput, signInst, err := account.UtxoToInputs(singer, utxo)
   243  //	if err != nil {
   244  //		return nil, nil, err
   245  //	}
   246  //
   247  //	return txInput, signInst, nil
   248  //}
   249  //
   250  //func AddTxOutput(assetID bc.AssetID, amount uint64, controlProgram []byte) *types.TxOutput {
   251  //	out := types.NewOriginalTxOutput(assetID, amount, controlProgram)
   252  //	return out
   253  //}
   254  //
   255  //func CreateTxBuilder(baseUtxo *account.UTXO, btmServiceFlag bool, signer *signers.Signer) (*txbuilder.TemplateBuilder, error) {
   256  //	tplBuilder := txbuilder.NewBuilder(time.Now())
   257  //
   258  //	// add input
   259  //	txInput, signInst, err := AddTxInputFromUtxo(baseUtxo, signer)
   260  //	if err != nil {
   261  //		return nil, err
   262  //	}
   263  //	tplBuilder.AddInput(txInput, signInst)
   264  //
   265  //	// if the btm is the service charge, didn't need to add the output
   266  //	if btmServiceFlag {
   267  //		txOutput := AddTxOutput(baseUtxo.AssetID, 100, baseUtxo.ControlProgram)
   268  //		tplBuilder.AddOutput(txOutput)
   269  //	}
   270  //
   271  //	return tplBuilder, nil
   272  //}
   273  //
   274  //func AddTxBuilder(tplBuilder *txbuilder.TemplateBuilder, utxo *account.UTXO, signer *signers.Signer) error {
   275  //	txInput, signInst, err := AddTxInputFromUtxo(utxo, signer)
   276  //	if err != nil {
   277  //		return err
   278  //	}
   279  //	tplBuilder.AddInput(txInput, signInst)
   280  //
   281  //	txOutput := AddTxOutput(utxo.AssetID, utxo.Amount, utxo.ControlProgram)
   282  //	tplBuilder.AddOutput(txOutput)
   283  //
   284  //	return nil
   285  //}
   286  //
   287  //func BuildTx(baseUtxo *account.UTXO, otherUtxos []*account.UTXO, signer *signers.Signer) (*txbuilder.Template, error) {
   288  //	btmServiceFlag := false
   289  //	if otherUtxos == nil || len(otherUtxos) == 0 {
   290  //		btmServiceFlag = true
   291  //	}
   292  //
   293  //	tplBuilder, err := CreateTxBuilder(baseUtxo, btmServiceFlag, signer)
   294  //	if err != nil {
   295  //		return nil, err
   296  //	}
   297  //
   298  //	for _, u := range otherUtxos {
   299  //		if err := AddTxBuilder(tplBuilder, u, signer); err != nil {
   300  //			return nil, err
   301  //		}
   302  //	}
   303  //
   304  //	tpl, _, err := tplBuilder.Build()
   305  //	if err != nil {
   306  //		return nil, err
   307  //	}
   308  //
   309  //	return tpl, nil
   310  //}
   311  //
   312  //func GenetrateTxbyUtxo(baseUtxo []*account.UTXO, otherUtxo [][]*account.UTXO) ([]*types.Tx, error) {
   313  //	tmpUtxo := []*account.UTXO{}
   314  //	txs := []*types.Tx{}
   315  //	otherUtxoFlag := true
   316  //
   317  //	if len(otherUtxo) == 0 || len(otherUtxo) != len(baseUtxo) {
   318  //		otherUtxoFlag = false
   319  //	}
   320  //
   321  //	for i := 0; i < len(baseUtxo); i++ {
   322  //		if otherUtxoFlag {
   323  //			tmpUtxo = otherUtxo[i]
   324  //		} else {
   325  //			tmpUtxo = nil
   326  //		}
   327  //
   328  //		tpl, err := BuildTx(baseUtxo[i], tmpUtxo, nil)
   329  //		if err != nil {
   330  //			return nil, err
   331  //		}
   332  //
   333  //		txs = append(txs, tpl.Transaction)
   334  //	}
   335  //
   336  //	return txs, nil
   337  //}
   338  //
   339  //func CreateTxbyNum(txNumber, otherAssetNum int) ([]*types.Tx, error) {
   340  //	baseUtxos := GenerateBaseUtxos(txNumber, 1000000000, nil)
   341  //	otherUtxos := make([][]*account.UTXO, 0, txNumber)
   342  //	if otherAssetNum != 0 {
   343  //		for i := 0; i < txNumber; i++ {
   344  //			utxos := GenerateOtherUtxos(i, otherAssetNum, 6000, nil)
   345  //			otherUtxos = append(otherUtxos, utxos)
   346  //		}
   347  //	}
   348  //
   349  //	txs, err := GenetrateTxbyUtxo(baseUtxos, otherUtxos)
   350  //	if err != nil {
   351  //		return nil, err
   352  //	}
   353  //
   354  //	return txs, nil
   355  //}
   356  //
   357  //func SetUtxoView(db dbm.DB, view *state.UtxoViewpoint) error {
   358  //	batch := db.NewBatch()
   359  //	if err := database.SaveUtxoView(batch, view); err != nil {
   360  //		return err
   361  //	}
   362  //	batch.Write()
   363  //	return nil
   364  //}
   365  //
   366  ////-------------------------Mock actual transaction----------------------------------
   367  //func MockTxsP2PKH(keyDirPath string, testDB dbm.DB, txNumber, otherAssetNum int) ([]*types.Tx, error) {
   368  //	accountManager := account.NewManager(testDB, nil)
   369  //	hsm, err := pseudohsm.New(keyDirPath)
   370  //	if err != nil {
   371  //		return nil, err
   372  //	}
   373  //
   374  //	xpub, _, err := hsm.XCreate("TestP2PKH", "password", "en")
   375  //	if err != nil {
   376  //		return nil, err
   377  //	}
   378  //
   379  //	txs := []*types.Tx{}
   380  //	for i := 0; i < txNumber; i++ {
   381  //		testAccountAlias := fmt.Sprintf("testAccount%d", i)
   382  //		testAccount, err := accountManager.Create([]chainkd.XPub{xpub.XPub}, 1, testAccountAlias, signers.BIP0044)
   383  //		if err != nil {
   384  //			return nil, err
   385  //		}
   386  //
   387  //		controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
   388  //		if err != nil {
   389  //			return nil, err
   390  //		}
   391  //
   392  //		utxo := MockSimpleUtxo(0, consensus.BTMAssetID, 1000000000, controlProg)
   393  //		otherUtxos := GenerateOtherUtxos(i, otherAssetNum, 6000, controlProg)
   394  //		tpl, err := BuildTx(utxo, otherUtxos, testAccount.Signer)
   395  //		if err != nil {
   396  //			return nil, err
   397  //		}
   398  //
   399  //		if _, err := MockSign(tpl, hsm, "password"); err != nil {
   400  //			return nil, err
   401  //		}
   402  //
   403  //		txs = append(txs, tpl.Transaction)
   404  //	}
   405  //
   406  //	return txs, nil
   407  //}
   408  //
   409  //func MockTxsP2SH(keyDirPath string, testDB dbm.DB, txNumber, otherAssetNum int) ([]*types.Tx, error) {
   410  //	accountManager := account.NewManager(testDB, nil)
   411  //	hsm, err := pseudohsm.New(keyDirPath)
   412  //	if err != nil {
   413  //		return nil, err
   414  //	}
   415  //
   416  //	xpub1, _, err := hsm.XCreate("TestP2SH1", "password", "en")
   417  //	if err != nil {
   418  //		return nil, err
   419  //	}
   420  //
   421  //	xpub2, _, err := hsm.XCreate("TestP2SH2", "password", "en")
   422  //	if err != nil {
   423  //		return nil, err
   424  //	}
   425  //
   426  //	txs := []*types.Tx{}
   427  //	for i := 0; i < txNumber; i++ {
   428  //		testAccountAlias := fmt.Sprintf("testAccount%d", i)
   429  //		testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, testAccountAlias, signers.BIP0044)
   430  //		if err != nil {
   431  //			return nil, err
   432  //		}
   433  //
   434  //		controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
   435  //		if err != nil {
   436  //			return nil, err
   437  //		}
   438  //
   439  //		utxo := MockSimpleUtxo(0, consensus.BTMAssetID, 1000000000, controlProg)
   440  //		otherUtxos := GenerateOtherUtxos(i, otherAssetNum, 6000, controlProg)
   441  //		tpl, err := BuildTx(utxo, otherUtxos, testAccount.Signer)
   442  //		if err != nil {
   443  //			return nil, err
   444  //		}
   445  //
   446  //		if _, err := MockSign(tpl, hsm, "password"); err != nil {
   447  //			return nil, err
   448  //		}
   449  //
   450  //		txs = append(txs, tpl.Transaction)
   451  //	}
   452  //
   453  //	return txs, nil
   454  //}
   455  //
   456  //func MockTxsMultiSign(keyDirPath string, testDB dbm.DB, txNumber, otherAssetNum int) ([]*types.Tx, error) {
   457  //	accountManager := account.NewManager(testDB, nil)
   458  //	hsm, err := pseudohsm.New(keyDirPath)
   459  //	if err != nil {
   460  //		return nil, err
   461  //	}
   462  //
   463  //	xpub1, _, err := hsm.XCreate("TestMultilNodeSign1", "password1", "en")
   464  //	if err != nil {
   465  //		return nil, err
   466  //	}
   467  //
   468  //	xpub2, _, err := hsm.XCreate("TestMultilNodeSign2", "password2", "en")
   469  //	if err != nil {
   470  //		return nil, err
   471  //	}
   472  //	txs := []*types.Tx{}
   473  //	for i := 0; i < txNumber; i++ {
   474  //		testAccountAlias := fmt.Sprintf("testAccount%d", i)
   475  //		testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub, xpub2.XPub}, 2, testAccountAlias, signers.BIP0044)
   476  //		if err != nil {
   477  //			return nil, err
   478  //		}
   479  //
   480  //		controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
   481  //		if err != nil {
   482  //			return nil, err
   483  //		}
   484  //
   485  //		utxo := MockSimpleUtxo(0, consensus.BTMAssetID, 1000000000, controlProg)
   486  //		otherUtxos := GenerateOtherUtxos(i, otherAssetNum, 6000, controlProg)
   487  //		tpl, err := BuildTx(utxo, otherUtxos, testAccount.Signer)
   488  //		if err != nil {
   489  //			return nil, err
   490  //		}
   491  //
   492  //		if _, err := MockSign(tpl, hsm, "password1"); err != nil {
   493  //			return nil, err
   494  //		}
   495  //
   496  //		if _, err := MockSign(tpl, hsm, "password2"); err != nil {
   497  //			return nil, err
   498  //		}
   499  //
   500  //		txs = append(txs, tpl.Transaction)
   501  //	}
   502  //
   503  //	return txs, nil
   504  //}