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 }