diff options
author | Péter Szilágyi <peterke@gmail.com> | 2018-10-08 19:14:29 +0800 |
---|---|---|
committer | Felix Lange <fjl@users.noreply.github.com> | 2018-10-08 19:14:29 +0800 |
commit | 1d3d4a4d578825b040a3cac9eb163e7f3c16ce4b (patch) | |
tree | 00ce13af5e001692be11412e2e8e372bd9c0bbc5 /core/vm/interpreter.go | |
parent | c5cb214f689e5c34bf487daa8eb4234d6e3237a7 (diff) | |
download | go-tangerine-1d3d4a4d578825b040a3cac9eb163e7f3c16ce4b.tar go-tangerine-1d3d4a4d578825b040a3cac9eb163e7f3c16ce4b.tar.gz go-tangerine-1d3d4a4d578825b040a3cac9eb163e7f3c16ce4b.tar.bz2 go-tangerine-1d3d4a4d578825b040a3cac9eb163e7f3c16ce4b.tar.lz go-tangerine-1d3d4a4d578825b040a3cac9eb163e7f3c16ce4b.tar.xz go-tangerine-1d3d4a4d578825b040a3cac9eb163e7f3c16ce4b.tar.zst go-tangerine-1d3d4a4d578825b040a3cac9eb163e7f3c16ce4b.zip |
core/vm: reuse Keccak-256 hashes across opcode executions (#17863)
Diffstat (limited to 'core/vm/interpreter.go')
-rw-r--r-- | core/vm/interpreter.go | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 8e934f60e..952d96dd4 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -18,8 +18,10 @@ package vm import ( "fmt" + "hash" "sync/atomic" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/params" ) @@ -68,12 +70,24 @@ type Interpreter interface { CanRun([]byte) bool } +// keccakState wraps sha3.state. In addition to the usual hash methods, it also supports +// Read to get a variable amount of data from the hash state. Read is faster than Sum +// because it doesn't copy the internal state, but also modifies the internal state. +type keccakState interface { + hash.Hash + Read([]byte) (int, error) +} + // EVMInterpreter represents an EVM interpreter type EVMInterpreter struct { evm *EVM cfg Config gasTable params.GasTable - intPool *intPool + + intPool *intPool + + hasher keccakState // Keccak256 hasher instance shared across opcodes + hasherBuf common.Hash // Keccak256 hasher result array shared aross opcodes readOnly bool // Whether to throw on stateful modifications returnData []byte // Last CALL's return data for subsequent reuse |