From c4b7fdd27ed7ad44d4cc8ea953bae78efac536da Mon Sep 17 00:00:00 2001 From: Ryan Schneider Date: Tue, 17 Dec 2019 03:10:15 -0800 Subject: [PATCH] eth, internal/web3ext: add optional first and last arguments to the `admin_exportChain` RPC. (#20107) --- eth/api.go | 18 +++++++++++++++--- internal/web3ext/web3ext.go | 4 ++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/eth/api.go b/eth/api.go index f8c51c09b..a874582e1 100644 --- a/eth/api.go +++ b/eth/api.go @@ -166,8 +166,16 @@ func NewPrivateAdminAPI(eth *Ethereum) *PrivateAdminAPI { return &PrivateAdminAPI{eth: eth} } -// ExportChain exports the current blockchain into a local file. -func (api *PrivateAdminAPI) ExportChain(file string) (bool, error) { +// ExportChain exports the current blockchain into a local file, +// or a range of blocks if first and last are non-nil +func (api *PrivateAdminAPI) ExportChain(file string, first *uint64, last *uint64) (bool, error) { + if first == nil && last != nil { + return false, errors.New("last cannot be specified without first") + } + if first != nil && last == nil { + head := api.eth.BlockChain().CurrentHeader().Number.Uint64() + last = &head + } if _, err := os.Stat(file); err == nil { // File already exists. Allowing overwrite could be a DoS vecotor, // since the 'file' may point to arbitrary paths on the drive @@ -187,7 +195,11 @@ func (api *PrivateAdminAPI) ExportChain(file string) (bool, error) { } // Export the blockchain - if err := api.eth.BlockChain().Export(writer); err != nil { + if first != nil { + if err := api.eth.BlockChain().ExportN(writer, *first, *last); err != nil { + return false, err + } + } else if err := api.eth.BlockChain().Export(writer); err != nil { return false, err } return true, nil diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index cd16fa79c..bc105ef37 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -172,8 +172,8 @@ web3._extend({ new web3._extend.Method({ name: 'exportChain', call: 'admin_exportChain', - params: 1, - inputFormatter: [null] + params: 3, + inputFormatter: [null, null, null] }), new web3._extend.Method({ name: 'importChain',