@ -23,6 +23,7 @@ import (
"io/ioutil"
"math/big"
"testing"
"time"
"github.com/ethereum/go-ethereum/common"
)
@ -142,6 +143,7 @@ func benchmarkPrecompiled(addr string, test precompiledTest, bench *testing.B) {
bench . Run ( fmt . Sprintf ( "%s-Gas=%d" , test . Name , contract . Gas ) , func ( bench * testing . B ) {
bench . ReportAllocs ( )
start := time . Now ( ) . Nanosecond ( )
bench . ResetTimer ( )
for i := 0 ; i < bench . N ; i ++ {
contract . Gas = reqGas
@ -149,7 +151,13 @@ func benchmarkPrecompiled(addr string, test precompiledTest, bench *testing.B) {
res , err = RunPrecompiledContract ( p , data , contract )
}
bench . StopTimer ( )
elapsed := float64 ( time . Now ( ) . Nanosecond ( ) - start )
if elapsed < 1 {
elapsed = 1
}
gasUsed := reqGas * uint64 ( bench . N )
bench . ReportMetric ( float64 ( reqGas ) , "gas/op" )
bench . ReportMetric ( float64 ( gasUsed * 1000 ) / elapsed , "mgas/s" )
//Check if it is correct
if err != nil {
bench . Error ( err )
@ -320,3 +328,42 @@ func loadJsonFail(name string) ([]precompiledFailureTest, error) {
err = json . Unmarshal ( data , & testcases )
return testcases , err
}
// BenchmarkPrecompiledBLS12381G1MultiExpWorstCase benchmarks the worst case we could find that still fits a gaslimit of 10MGas.
func BenchmarkPrecompiledBLS12381G1MultiExpWorstCase ( b * testing . B ) {
task := "0000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be1" +
"0000000000000000000000000000000011bc8afe71676e6730702a46ef817060249cd06cd82e6981085012ff6d013aa4470ba3a2c71e13ef653e1e223d1ccfe9" +
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
input := task
for i := 0 ; i < 4787 ; i ++ {
input = input + task
}
testcase := precompiledTest {
Input : input ,
Expected : "0000000000000000000000000000000005a6310ea6f2a598023ae48819afc292b4dfcb40aabad24a0c2cb6c19769465691859eeb2a764342a810c5038d700f18000000000000000000000000000000001268ac944437d15923dc0aec00daa9250252e43e4b35ec7a19d01f0d6cd27f6e139d80dae16ba1c79cc7f57055a93ff5" ,
Name : "WorstCaseG1" ,
NoBenchmark : false ,
}
benchmarkPrecompiled ( "0c" , testcase , b )
}
// BenchmarkPrecompiledBLS12381G2MultiExpWorstCase benchmarks the worst case we could find that still fits a gaslimit of 10MGas.
func BenchmarkPrecompiledBLS12381G2MultiExpWorstCase ( b * testing . B ) {
task := "000000000000000000000000000000000d4f09acd5f362e0a516d4c13c5e2f504d9bd49fdfb6d8b7a7ab35a02c391c8112b03270d5d9eefe9b659dd27601d18f" +
"000000000000000000000000000000000fd489cb75945f3b5ebb1c0e326d59602934c8f78fe9294a8877e7aeb95de5addde0cb7ab53674df8b2cfbb036b30b99" +
"00000000000000000000000000000000055dbc4eca768714e098bbe9c71cf54b40f51c26e95808ee79225a87fb6fa1415178db47f02d856fea56a752d185f86b" +
"000000000000000000000000000000001239b7640f416eb6e921fe47f7501d504fadc190d9cf4e89ae2b717276739a2f4ee9f637c35e23c480df029fd8d247c7" +
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
input := task
for i := 0 ; i < 1040 ; i ++ {
input = input + task
}
testcase := precompiledTest {
Input : input ,
Expected : "0000000000000000000000000000000018f5ea0c8b086095cfe23f6bb1d90d45de929292006dba8cdedd6d3203af3c6bbfd592e93ecb2b2c81004961fdcbb46c00000000000000000000000000000000076873199175664f1b6493a43c02234f49dc66f077d3007823e0343ad92e30bd7dc209013435ca9f197aca44d88e9dac000000000000000000000000000000000e6f07f4b23b511eac1e2682a0fc224c15d80e122a3e222d00a41fab15eba645a700b9ae84f331ae4ed873678e2e6c9b000000000000000000000000000000000bcb4849e460612aaed79617255fd30c03f51cf03d2ed4163ca810c13e1954b1e8663157b957a601829bb272a4e6c7b8" ,
Name : "WorstCaseG2" ,
NoBenchmark : false ,
}
benchmarkPrecompiled ( "0f" , testcase , b )
}