github.com/dmmcquay/sia@v1.3.1-0.20180712220038-9f8d535311b9/cmd/siac/consensuscmd.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/spf13/cobra" 8 9 "github.com/NebulousLabs/Sia/types" 10 ) 11 12 var ( 13 consensusCmd = &cobra.Command{ 14 Use: "consensus", 15 Short: "Print the current state of consensus", 16 Long: "Print the current state of consensus such as current block, block height, and target.", 17 Run: wrap(consensuscmd), 18 } 19 ) 20 21 // consensuscmd is the handler for the command `siac consensus`. 22 // Prints the current state of consensus. 23 func consensuscmd() { 24 cg, err := httpClient.ConsensusGet() 25 if err != nil { 26 die("Could not get current consensus state:", err) 27 } 28 if cg.Synced { 29 fmt.Printf(`Synced: %v 30 Block: %v 31 Height: %v 32 Target: %v 33 Difficulty: %v 34 `, yesNo(cg.Synced), cg.CurrentBlock, cg.Height, cg.Target, cg.Difficulty) 35 } else { 36 estimatedHeight := estimatedHeightAt(time.Now()) 37 estimatedProgress := float64(cg.Height) / float64(estimatedHeight) * 100 38 if estimatedProgress > 100 { 39 estimatedProgress = 100 40 } 41 fmt.Printf(`Synced: %v 42 Height: %v 43 Progress (estimated): %.1f%% 44 `, yesNo(cg.Synced), cg.Height, estimatedProgress) 45 } 46 } 47 48 // estimatedHeightAt returns the estimated block height for the given time. 49 // Block height is estimated by calculating the minutes since a known block in 50 // the past and dividing by 10 minutes (the block time). 51 func estimatedHeightAt(t time.Time) types.BlockHeight { 52 block100kTimestamp := time.Date(2017, time.April, 13, 23, 29, 49, 0, time.UTC) 53 blockTime := float64(9) // overestimate block time for better UX 54 diff := t.Sub(block100kTimestamp) 55 estimatedHeight := 100e3 + (diff.Minutes() / blockTime) 56 return types.BlockHeight(estimatedHeight + 0.5) // round to the nearest block 57 }