From 39f874d03f3d327acb377273b6ad43cf9427376a Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Thu, 5 Aug 2021 09:59:48 +0300 Subject: [PATCH] core: don't recalculate witness script hash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We know it already, but with current loading code VM will hash it once more. It doesn't help a lot and still it costs nothing to avoid this overhead. name old time/op new time/op delta VerifyWitness-8 93.4µs ± 3% 92.7µs ± 2% ~ (p=0.353 n=10+10) name old alloc/op new alloc/op delta VerifyWitness-8 3.43kB ± 0% 3.40kB ± 0% -0.70% (p=0.000 n=9+9) name old allocs/op new allocs/op delta VerifyWitness-8 67.0 ± 0% 66.0 ± 0% -1.49% (p=0.000 n=10+10) --- pkg/core/bench_test.go | 24 ++++++++++++++++++++++++ pkg/core/blockchain.go | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 pkg/core/bench_test.go diff --git a/pkg/core/bench_test.go b/pkg/core/bench_test.go new file mode 100644 index 000000000..24beadb32 --- /dev/null +++ b/pkg/core/bench_test.go @@ -0,0 +1,24 @@ +package core + +import ( + "testing" + + "github.com/nspcc-dev/neo-go/pkg/config/netmode" + "github.com/nspcc-dev/neo-go/pkg/vm/opcode" + "github.com/nspcc-dev/neo-go/pkg/wallet" + "github.com/stretchr/testify/require" +) + +func BenchmarkVerifyWitness(t *testing.B) { + bc := newTestChain(t) + acc, err := wallet.NewAccount() + require.NoError(t, err) + + tx := bc.newTestTx(acc.Contract.ScriptHash(), []byte{byte(opcode.PUSH1)}) + require.NoError(t, acc.SignTx(netmode.UnitTestNet, tx)) + + t.ResetTimer() + for n := 0; n < t.N; n++ { + _ = bc.VerifyWitness(tx.Signers[0].Account, tx, &tx.Scripts[0], 100000000) + } +} diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index 00a7f58be..f9e9f3072 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -1837,7 +1837,7 @@ func (bc *Blockchain) InitVerificationVM(v *vm.VM, getContract func(util.Uint160 if err != nil { return fmt.Errorf("%w: %v", ErrInvalidVerification, err) } - v.LoadScriptWithFlags(witness.VerificationScript, callflag.ReadOnly) + v.LoadScriptWithHash(witness.VerificationScript, hash, callflag.ReadOnly) } else { cs, err := getContract(hash) if err != nil {