|
|
|
@ -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 { |
|
|
|
|