|
|
@@ -26,6 +26,7 @@ import (
|
|
|
"math/big"
|
|
|
"os"
|
|
|
"runtime"
|
|
|
+ "strings"
|
|
|
"sync"
|
|
|
"time"
|
|
|
|
|
|
@@ -46,6 +47,7 @@ import (
|
|
|
"github.com/ethereum/go-ethereum/p2p"
|
|
|
"github.com/ethereum/go-ethereum/rlp"
|
|
|
"github.com/ethereum/go-ethereum/rpc"
|
|
|
+ "github.com/syndtr/goleveldb/leveldb"
|
|
|
"golang.org/x/net/context"
|
|
|
)
|
|
|
|
|
|
@@ -1566,6 +1568,22 @@ func NewPrivateDebugAPI(config *core.ChainConfig, eth *Ethereum) *PrivateDebugAP
|
|
|
return &PrivateDebugAPI{config: config, eth: eth}
|
|
|
}
|
|
|
|
|
|
+// ChaindbProperty returns leveldb properties of the chain database.
|
|
|
+func (api *PrivateDebugAPI) ChaindbProperty(property string) (string, error) {
|
|
|
+ ldb, ok := api.eth.chainDb.(interface {
|
|
|
+ LDB() *leveldb.DB
|
|
|
+ })
|
|
|
+ if !ok {
|
|
|
+ return "", fmt.Errorf("chaindbProperty does not work for memory databases")
|
|
|
+ }
|
|
|
+ if property == "" {
|
|
|
+ property = "leveldb.stats"
|
|
|
+ } else if !strings.HasPrefix(property, "leveldb.") {
|
|
|
+ property = "leveldb." + property
|
|
|
+ }
|
|
|
+ return ldb.LDB().GetProperty(property)
|
|
|
+}
|
|
|
+
|
|
|
// BlockTraceResults is the returned value when replaying a block to check for
|
|
|
// consensus results and full VM trace logs for all included transactions.
|
|
|
type BlockTraceResult struct {
|