diff --git a/cmd/geth/dbcmd.go b/cmd/geth/dbcmd.go index 33a7becfcd00..1b5a0c314b49 100644 --- a/cmd/geth/dbcmd.go +++ b/cmd/geth/dbcmd.go @@ -18,7 +18,6 @@ package main import ( "bytes" - "errors" "fmt" "os" "os/signal" @@ -418,7 +417,7 @@ func dbGet(ctx *cli.Context) error { db := utils.MakeChainDatabase(ctx, stack, true) defer db.Close() - key, err := parseHexOrString(ctx.Args().Get(0)) + key, err := common.ParseHexOrString(ctx.Args().Get(0)) if err != nil { log.Info("Could not decode the key", "error", err) return err @@ -444,7 +443,7 @@ func dbDelete(ctx *cli.Context) error { db := utils.MakeChainDatabase(ctx, stack, false) defer db.Close() - key, err := parseHexOrString(ctx.Args().Get(0)) + key, err := common.ParseHexOrString(ctx.Args().Get(0)) if err != nil { log.Info("Could not decode the key", "error", err) return err @@ -477,7 +476,7 @@ func dbPut(ctx *cli.Context) error { data []byte err error ) - key, err = parseHexOrString(ctx.Args().Get(0)) + key, err = common.ParseHexOrString(ctx.Args().Get(0)) if err != nil { log.Info("Could not decode the key", "error", err) return err @@ -584,15 +583,6 @@ func freezerInspect(ctx *cli.Context) error { return nil } -// ParseHexOrString tries to hexdecode b, but if the prefix is missing, it instead just returns the raw bytes -func parseHexOrString(str string) ([]byte, error) { - b, err := hexutil.Decode(str) - if errors.Is(err, hexutil.ErrMissingPrefix) { - return []byte(str), nil - } - return b, err -} - func importLDBdata(ctx *cli.Context) error { start := 0 switch ctx.NArg() { diff --git a/common/bytes.go b/common/bytes.go index 7827bb572e13..d1f5c6c99586 100644 --- a/common/bytes.go +++ b/common/bytes.go @@ -19,6 +19,9 @@ package common import ( "encoding/hex" + "errors" + + "github.com/ethereum/go-ethereum/common/hexutil" ) // FromHex returns the bytes represented by the hexadecimal string s. @@ -92,6 +95,15 @@ func Hex2BytesFixed(str string, flen int) []byte { return hh } +// ParseHexOrString tries to hexdecode b, but if the prefix is missing, it instead just returns the raw bytes +func ParseHexOrString(str string) ([]byte, error) { + b, err := hexutil.Decode(str) + if errors.Is(err, hexutil.ErrMissingPrefix) { + return []byte(str), nil + } + return b, err +} + // RightPadBytes zero-pads slice to the right up to length l. func RightPadBytes(slice []byte, l int) []byte { if l <= len(slice) { diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index d087673797dc..33842ff6c48e 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -1972,6 +1972,15 @@ func (api *PrivateDebugAPI) SetHead(number hexutil.Uint64) { api.b.SetHead(uint64(number)) } +// DbGet returns the raw value of a key stored in the database. +func (api *PrivateDebugAPI) DbGet(key string) (hexutil.Bytes, error) { + blob, err := common.ParseHexOrString(key) + if err != nil { + return nil, err + } + return api.b.ChainDb().Get(blob) +} + // PublicNetAPI offers network related RPC methods type PublicNetAPI struct { net *p2p.Server diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 87bf464157ba..4b7a196e4726 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -471,6 +471,11 @@ web3._extend({ params: 2, inputFormatter:[web3._extend.formatters.inputBlockNumberFormatter, web3._extend.formatters.inputBlockNumberFormatter], }), + new web3._extend.Method({ + name: 'dbGet', + call: 'debug_dbGet', + params: 1 + }), ], properties: [] });