github.com/BlockABC/godash@v0.0.0-20191112120524-f4aa3a32c566/database/cmd/dbtool/fetchblockregion.go (about) 1 // Copyright (c) 2015-2016 The btcsuite developers 2 // Copyright (c) 2016 The Dash developers 3 // Use of this source code is governed by an ISC 4 // license that can be found in the LICENSE file. 5 6 package main 7 8 import ( 9 "encoding/hex" 10 "errors" 11 "strconv" 12 "time" 13 14 "github.com/BlockABC/godash/database" 15 "github.com/BlockABC/godash/wire" 16 ) 17 18 // blockRegionCmd defines the configuration options for the fetchblockregion 19 // command. 20 type blockRegionCmd struct{} 21 22 var ( 23 // blockRegionCfg defines the configuration options for the command. 24 blockRegionCfg = blockRegionCmd{} 25 ) 26 27 // Execute is the main entry point for the command. It's invoked by the parser. 28 func (cmd *blockRegionCmd) Execute(args []string) error { 29 // Setup the global config options and ensure they are valid. 30 if err := setupGlobalConfig(); err != nil { 31 return err 32 } 33 34 // Ensure expected arguments. 35 if len(args) < 1 { 36 return errors.New("required block hash parameter not specified") 37 } 38 if len(args) < 2 { 39 return errors.New("required start offset parameter not " + 40 "specified") 41 } 42 if len(args) < 3 { 43 return errors.New("required region length parameter not " + 44 "specified") 45 } 46 47 // Parse arguments. 48 blockHash, err := wire.NewShaHashFromStr(args[0]) 49 if err != nil { 50 return err 51 } 52 startOffset, err := strconv.ParseUint(args[1], 10, 32) 53 if err != nil { 54 return err 55 } 56 regionLen, err := strconv.ParseUint(args[2], 10, 32) 57 if err != nil { 58 return err 59 } 60 61 // Load the block database. 62 db, err := loadBlockDB() 63 if err != nil { 64 return err 65 } 66 defer db.Close() 67 68 return db.View(func(tx database.Tx) error { 69 log.Infof("Fetching block region %s<%d:%d>", blockHash, 70 startOffset, startOffset+regionLen-1) 71 region := database.BlockRegion{ 72 Hash: blockHash, 73 Offset: uint32(startOffset), 74 Len: uint32(regionLen), 75 } 76 startTime := time.Now() 77 regionBytes, err := tx.FetchBlockRegion(®ion) 78 if err != nil { 79 return err 80 } 81 log.Infof("Loaded block region in %v", time.Now().Sub(startTime)) 82 log.Infof("Double SHA256: %s", wire.DoubleSha256SH(regionBytes)) 83 log.Infof("Region Hex: %s", hex.EncodeToString(regionBytes)) 84 return nil 85 }) 86 } 87 88 // Usage overrides the usage display for the command. 89 func (cmd *blockRegionCmd) Usage() string { 90 return "<block-hash> <start-offset> <length-of-region>" 91 }