steem-block-db/main.go

91 lines
1.6 KiB
Go

package main
import (
"encoding/json"
"fmt"
log "github.com/sirupsen/logrus"
"github.com/spf13/afero"
)
const steemAPIURL = "https://api.steemit.com"
func main() {
log.SetLevel(log.DebugLevel)
var fs = afero.NewBasePathFs(afero.NewOsFs(), "./d")
var s = NewSteemAPI(steemAPIURL)
var state = NewSteemDataStore("./d")
var endBlock = *currentBlockHeight(s)
var startBlock = 1
fetchBlockRange(s, state, startBlock, endBlock)
}
func fetchBlockRange(s *SteemAPI, fs afero.Fs, startBlock int, endBlock int) *error {
log.Debugf("fetching block range %d to %d inclusive", startBlock, endBlock)
for i := startBlock; i <= endBlock; i++ {
fetchSingleBlock(s, fs, i)
}
return nil
}
func fetchSingleBlock(s *SteemAPI, fs afero.Fs, blockNum int) {
tmpName := fmt.Sprintf("/blockOps/%d.json.tmp", blockNum)
realName := fmt.Sprintf("/blockOps/%d.json", blockNum)
done, err := afero.Exists(fs, realName)
if err != nil {
panic(err)
}
if done {
return
}
r, err := s.GetOpsInBlock(blockNum)
if err != nil {
panic(err)
}
bytes, err := json.Marshal(r)
if err != nil {
panic(err)
}
err = afero.WriteFile(fs, tmpName, bytes, 0)
if err != nil {
panic(err)
}
fs.Rename(tmpName, realName)
}
func nope() {
//r2, err := s.GetOpsInBlock(20000000)
//if err != nil {
// log.Fatal(err)
//}
//spew.Dump(r)
//bytes, err := json.Marshal(r2)
//if err != nil {
// fmt.Println(err)
// }
// fmt.Println(string(bytes))
}
func currentBlockHeight(s *SteemAPI) *int {
r, err := s.GetDynamicGlobalProperties()
if err != nil {
return nil
}
if r.LastIrreversibleBlockNum > 0 {
return &r.LastIrreversibleBlockNum
}
return nil
}