Jelajahi Sumber

Merge pull request #21056 from karalabe/statedb-simpler-code

core/state: make GetCodeSize mirror GetCode implementation wise
Péter Szilágyi 5 tahun lalu
induk
melakukan
37877e86ed
2 mengubah file dengan 20 tambahan dan 14 penghapusan
  1. 17 0
      core/state/state_object.go
  2. 3 14
      core/state/statedb.go

+ 17 - 0
core/state/state_object.go

@@ -454,6 +454,23 @@ func (s *stateObject) Code(db Database) []byte {
 	return code
 }
 
+// CodeSize returns the size of the contract code associated with this object,
+// or zero if none. This methos is an almost mirror of Code, but uses a cache
+// inside the database to avoid loading codes seen recently.
+func (s *stateObject) CodeSize(db Database) int {
+	if s.code != nil {
+		return len(s.code)
+	}
+	if bytes.Equal(s.CodeHash(), emptyCodeHash) {
+		return 0
+	}
+	size, err := db.ContractCodeSize(s.addrHash, common.BytesToHash(s.CodeHash()))
+	if err != nil {
+		s.setError(fmt.Errorf("can't load code size %x: %v", s.CodeHash(), err))
+	}
+	return size
+}
+
 func (s *stateObject) SetCode(codeHash common.Hash, code []byte) {
 	prevcode := s.Code(s.db.db)
 	s.db.journal.append(codeChange{

+ 3 - 14
core/state/statedb.go

@@ -18,7 +18,6 @@
 package state
 
 import (
-	"bytes"
 	"errors"
 	"fmt"
 	"math/big"
@@ -289,20 +288,10 @@ func (s *StateDB) GetCode(addr common.Address) []byte {
 
 func (s *StateDB) GetCodeSize(addr common.Address) int {
 	stateObject := s.getStateObject(addr)
-	if stateObject == nil {
-		return 0
-	}
-	if stateObject.code != nil {
-		return len(stateObject.code)
-	}
-	if bytes.Equal(stateObject.CodeHash(), emptyCode[:]) {
-		return 0
-	}
-	size, err := s.db.ContractCodeSize(stateObject.addrHash, common.BytesToHash(stateObject.CodeHash()))
-	if err != nil {
-		s.setError(fmt.Errorf("GetCodeSize (%x) error: %v", addr[:], err))
+	if stateObject != nil {
+		return stateObject.CodeSize(s.db)
 	}
-	return size
+	return 0
 }
 
 func (s *StateDB) GetCodeHash(addr common.Address) common.Hash {