github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/gossip/evm_test.go (about)

     1  package gossip
     2  
     3  // Simple ballot contract
     4  //go:generate bash -c "docker run --rm -v $(pwd)/contract/ballot:/src -v $(pwd)/contract:/dst ethereum/solc:0.5.12 -o /dst/solc/ --optimize --optimize-runs=2000 --bin --abi --allow-paths /src --overwrite /src/Ballot.sol"
     5  //go:generate go run github.com/unicornultrafoundation/go-u2u/libs/cmd/abigen --bin=contract/solc/Ballot.bin --abi=contract/solc/Ballot.abi --pkg=ballot --type=Contract --out=contract/ballot/contract.go
     6  
     7  import (
     8  	"math/big"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/require"
    12  	"github.com/unicornultrafoundation/go-helios/native/idx"
    13  	"github.com/unicornultrafoundation/go-u2u/core/types"
    14  
    15  	"github.com/unicornultrafoundation/go-u2u/gossip/contract/ballot"
    16  	"github.com/unicornultrafoundation/go-u2u/logger"
    17  	"github.com/unicornultrafoundation/go-u2u/utils"
    18  )
    19  
    20  func BenchmarkBallotTxsProcessing(b *testing.B) {
    21  	logger.SetLevel("warn")
    22  	logger.SetTestMode(b)
    23  	require := require.New(b)
    24  
    25  	env := newTestEnv(2, 3)
    26  	defer env.Close()
    27  
    28  	for bi := 0; bi < b.N; bi++ {
    29  		count := idx.ValidatorID(10)
    30  
    31  		proposals := [][32]byte{
    32  			ballotOption("Option 1"),
    33  			ballotOption("Option 2"),
    34  			ballotOption("Option 3"),
    35  		}
    36  
    37  		// contract deploy
    38  		addr, tx, cBallot, err := ballot.DeployBallot(env.Pay(1), env, proposals)
    39  		require.NoError(err)
    40  		require.NotNil(cBallot)
    41  		r, err := env.ApplyTxs(nextEpoch, tx)
    42  		require.NoError(err)
    43  
    44  		require.Equal(addr, r[0].ContractAddress)
    45  
    46  		admin, err := cBallot.Chairperson(env.ReadOnly())
    47  		require.NoError(err)
    48  		require.Equal(env.Address(1), admin)
    49  
    50  		txs := make([]*types.Transaction, 0, count-1)
    51  		flushTxs := func() {
    52  			if len(txs) != 0 {
    53  				env.ApplyTxs(nextEpoch, txs...)
    54  			}
    55  			txs = txs[:0]
    56  		}
    57  
    58  		// Init accounts
    59  		for vid := idx.ValidatorID(2); vid <= count; vid++ {
    60  			tx := env.Transfer(1, vid, utils.ToU2U(10))
    61  			txs = append(txs, tx)
    62  			if len(txs) > 2 {
    63  				flushTxs()
    64  			}
    65  		}
    66  		flushTxs()
    67  
    68  		// GiveRightToVote
    69  		for vid := idx.ValidatorID(1); vid <= count; vid++ {
    70  			tx, err := cBallot.GiveRightToVote(env.Pay(1), env.Address(vid))
    71  			require.NoError(err)
    72  			txs = append(txs, tx)
    73  			if len(txs) > 2 {
    74  				flushTxs()
    75  			}
    76  		}
    77  		flushTxs()
    78  
    79  		// Vote
    80  		for vid := idx.ValidatorID(1); vid <= count; vid++ {
    81  			proposal := big.NewInt(int64(vid) % int64(len(proposals)))
    82  			tx, err := cBallot.Vote(env.Pay(vid), proposal)
    83  			require.NoError(err)
    84  			txs = append(txs, tx)
    85  			if len(txs) > 2 {
    86  				flushTxs()
    87  			}
    88  		}
    89  		flushTxs()
    90  
    91  		// Winner
    92  		_, err = cBallot.WinnerName(env.ReadOnly())
    93  		require.NoError(err)
    94  	}
    95  }
    96  
    97  func ballotOption(str string) (res [32]byte) {
    98  	buf := []byte(str)
    99  	if len(buf) > 32 {
   100  		panic("string too long")
   101  	}
   102  	copy(res[:], buf)
   103  	return
   104  }