aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/interpreter.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2018-10-08 19:14:29 +0800
committerFelix Lange <fjl@users.noreply.github.com>2018-10-08 19:14:29 +0800
commit1d3d4a4d578825b040a3cac9eb163e7f3c16ce4b (patch)
tree00ce13af5e001692be11412e2e8e372bd9c0bbc5 /core/vm/interpreter.go
parentc5cb214f689e5c34bf487daa8eb4234d6e3237a7 (diff)
downloadgo-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.go16
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