aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/debug.go16
-rw-r--r--common/registrar/ethreg/api.go20
-rw-r--r--common/types.go13
-rw-r--r--common/types_test.go22
4 files changed, 67 insertions, 4 deletions
diff --git a/common/debug.go b/common/debug.go
index fa93d7bda..61acd8ce7 100644
--- a/common/debug.go
+++ b/common/debug.go
@@ -21,8 +21,10 @@ import (
"os"
"runtime"
"runtime/debug"
+ "strings"
)
+// Report gives off a warning requesting the user to submit an issue to the github tracker.
func Report(extra ...interface{}) {
fmt.Fprintln(os.Stderr, "You've encountered a sought after, hard to reproduce bug. Please report this to the developers <3 https://github.com/ethereum/go-ethereum/issues")
fmt.Fprintln(os.Stderr, extra...)
@@ -34,3 +36,17 @@ func Report(extra ...interface{}) {
fmt.Fprintln(os.Stderr, "#### BUG! PLEASE REPORT ####")
}
+
+// PrintDepricationWarning prinst the given string in a box using fmt.Println.
+func PrintDepricationWarning(str string) {
+ line := strings.Repeat("#", len(str)+4)
+ emptyLine := strings.Repeat(" ", len(str))
+ fmt.Printf(`
+%s
+# %s #
+# %s #
+# %s #
+%s
+
+`, line, emptyLine, str, emptyLine, line)
+}
diff --git a/common/registrar/ethreg/api.go b/common/registrar/ethreg/api.go
index 60a97f4ce..d035616f2 100644
--- a/common/registrar/ethreg/api.go
+++ b/common/registrar/ethreg/api.go
@@ -27,6 +27,7 @@ import (
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/logger"
@@ -35,6 +36,7 @@ import (
// registryAPIBackend is a backend for an Ethereum Registry.
type registryAPIBackend struct {
+ config *core.ChainConfig
bc *core.BlockChain
chainDb ethdb.Database
txPool *core.TxPool
@@ -43,12 +45,22 @@ type registryAPIBackend struct {
// PrivateRegistarAPI offers various functions to access the Ethereum registry.
type PrivateRegistarAPI struct {
- be *registryAPIBackend
+ config *core.ChainConfig
+ be *registryAPIBackend
}
// NewPrivateRegistarAPI creates a new PrivateRegistarAPI instance.
-func NewPrivateRegistarAPI(bc *core.BlockChain, chainDb ethdb.Database, txPool *core.TxPool, am *accounts.Manager) *PrivateRegistarAPI {
- return &PrivateRegistarAPI{&registryAPIBackend{bc, chainDb, txPool, am}}
+func NewPrivateRegistarAPI(config *core.ChainConfig, bc *core.BlockChain, chainDb ethdb.Database, txPool *core.TxPool, am *accounts.Manager) *PrivateRegistarAPI {
+ return &PrivateRegistarAPI{
+ config: config,
+ be: &registryAPIBackend{
+ config: config,
+ bc: bc,
+ chainDb: chainDb,
+ txPool: txPool,
+ am: am,
+ },
+ }
}
// SetGlobalRegistrar allows clients to set the global registry for the node.
@@ -179,7 +191,7 @@ func (be *registryAPIBackend) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr
}
header := be.bc.CurrentBlock().Header()
- vmenv := core.NewEnv(statedb, be.bc, msg, header, nil)
+ vmenv := core.NewEnv(statedb, be.config, be.bc, msg, header, vm.Config{})
gp := new(core.GasPool).AddGas(common.MaxBig)
res, gas, err := core.ApplyMessage(vmenv, msg, gp)
diff --git a/common/types.go b/common/types.go
index b1666d733..fec986164 100644
--- a/common/types.go
+++ b/common/types.go
@@ -19,10 +19,12 @@ package common
import (
"encoding/hex"
"encoding/json"
+ "errors"
"fmt"
"math/big"
"math/rand"
"reflect"
+ "strings"
)
const (
@@ -30,6 +32,8 @@ const (
AddressLength = 20
)
+var hashJsonLengthErr = errors.New("common: unmarshalJSON failed: hash must be exactly 32 bytes")
+
type (
Hash [HashLength]byte
Address [AddressLength]byte
@@ -58,6 +62,15 @@ func (h *Hash) UnmarshalJSON(input []byte) error {
if length >= 2 && input[0] == '"' && input[length-1] == '"' {
input = input[1 : length-1]
}
+ // strip "0x" for length check
+ if len(input) > 1 && strings.ToLower(string(input[:2])) == "0x" {
+ input = input[2:]
+ }
+
+ // validate the length of the input hash
+ if len(input) != HashLength*2 {
+ return hashJsonLengthErr
+ }
h.SetBytes(FromHex(string(input)))
return nil
}
diff --git a/common/types_test.go b/common/types_test.go
index edf8d4d14..f2dfbf0c9 100644
--- a/common/types_test.go
+++ b/common/types_test.go
@@ -29,3 +29,25 @@ func TestBytesConversion(t *testing.T) {
t.Errorf("expected %x got %x", exp, hash)
}
}
+
+func TestHashJsonValidation(t *testing.T) {
+ var h Hash
+ var tests = []struct {
+ Prefix string
+ Size int
+ Error error
+ }{
+ {"", 2, hashJsonLengthErr},
+ {"", 62, hashJsonLengthErr},
+ {"", 66, hashJsonLengthErr},
+ {"", 65, hashJsonLengthErr},
+ {"0X", 64, nil},
+ {"0x", 64, nil},
+ {"0x", 62, hashJsonLengthErr},
+ }
+ for i, test := range tests {
+ if err := h.UnmarshalJSON(append([]byte(test.Prefix), make([]byte, test.Size)...)); err != test.Error {
+ t.Error(i, "expected", test.Error, "got", err)
+ }
+ }
+}