eth, internal/web3ext: add optional first and last arguments to the admin_exportChain RPC. (#20107)

This commit is contained in:
Ryan Schneider 2019-12-17 03:10:15 -08:00 committed by Guillaume Ballet
parent 275cd4988d
commit c4b7fdd27e
2 changed files with 17 additions and 5 deletions

@ -166,8 +166,16 @@ func NewPrivateAdminAPI(eth *Ethereum) *PrivateAdminAPI {
return &PrivateAdminAPI{eth: eth} return &PrivateAdminAPI{eth: eth}
} }
// ExportChain exports the current blockchain into a local file. // ExportChain exports the current blockchain into a local file,
func (api *PrivateAdminAPI) ExportChain(file string) (bool, error) { // 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 { if _, err := os.Stat(file); err == nil {
// File already exists. Allowing overwrite could be a DoS vecotor, // File already exists. Allowing overwrite could be a DoS vecotor,
// since the 'file' may point to arbitrary paths on the drive // 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 // 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 false, err
} }
return true, nil return true, nil

@ -172,8 +172,8 @@ web3._extend({
new web3._extend.Method({ new web3._extend.Method({
name: 'exportChain', name: 'exportChain',
call: 'admin_exportChain', call: 'admin_exportChain',
params: 1, params: 3,
inputFormatter: [null] inputFormatter: [null, null, null]
}), }),
new web3._extend.Method({ new web3._extend.Method({
name: 'importChain', name: 'importChain',