|
|
@@ -341,13 +341,25 @@ func (bc *ChainManager) ResetWithGenesisBlock(gb *types.Block) {
|
|
|
|
|
|
// Export writes the active chain to the given writer.
|
|
|
func (self *ChainManager) Export(w io.Writer) error {
|
|
|
+ if err := self.ExportN(w, uint64(1), self.currentBlock.NumberU64()); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+// ExportN writes a subset of the active chain to the given writer.
|
|
|
+func (self *ChainManager) ExportN(w io.Writer, first uint64, last uint64) error {
|
|
|
self.mu.RLock()
|
|
|
defer self.mu.RUnlock()
|
|
|
glog.V(logger.Info).Infof("exporting %v blocks...\n", self.currentBlock.Header().Number)
|
|
|
|
|
|
- last := self.currentBlock.NumberU64()
|
|
|
+ if first > last {
|
|
|
+ return fmt.Errorf("export failed: first (%d) is greater than last (%d)", first, last)
|
|
|
+ }
|
|
|
+
|
|
|
+ glog.V(logger.Info).Infof("exporting %d blocks...\n", last-first)
|
|
|
|
|
|
- for nr := uint64(1); nr <= last; nr++ {
|
|
|
+ for nr := first; nr <= last; nr++ {
|
|
|
block := self.GetBlockByNumber(nr)
|
|
|
if block == nil {
|
|
|
return fmt.Errorf("export failed on #%d: not found", nr)
|