monero-blocks/main.go

97 lines
2.3 KiB
Go

package main
import (
"encoding/csv"
"flag"
"log"
"monero-blocks/pool"
c3pool_org "monero-blocks/pool/c3pool.org"
monero_hashvault_pro "monero-blocks/pool/monero.hashvault.pro"
moneroocean_stream "monero-blocks/pool/moneroocean.stream"
supportxmr_com "monero-blocks/pool/supportxmr.com"
xmr_2miners_com "monero-blocks/pool/xmr.2miners.com"
xmr_nanopool_org "monero-blocks/pool/xmr.nanopool.org"
xmrpool_eu "monero-blocks/pool/xmrpool.eu"
"os"
"strconv"
"sync"
)
func main() {
scanDownToHeight := flag.Uint64("height", 2688888, "Height at which scans will stop from the tip. Defaults to v15 upgrade.")
flag.Parse()
pools := []pool.Pool{
supportxmr_com.New(),
monero_hashvault_pro.New(),
xmr_nanopool_org.New(),
xmr_2miners_com.New(),
xmrpool_eu.New(),
c3pool_org.New(),
moneroocean_stream.New(),
}
var wg sync.WaitGroup
allBlocks := make([][]pool.Block, len(pools))
lowerHeight := *scanDownToHeight
for i, p := range pools {
wg.Add(1)
go func(pIndex int, p pool.Pool) {
defer wg.Done()
var token pool.Token
var tempBlocks []pool.Block
var lastBlock uint64
for {
tempBlocks, token = p.GetBlocks(token)
for _, b := range tempBlocks {
if b.Height < lowerHeight {
log.Printf("[%s] Finished: reached height\n", p.Name())
return
}
allBlocks[pIndex] = append(allBlocks[pIndex], b)
lastBlock = b.Height
}
log.Printf("[%s] at %d/%d\n", p.Name(), lastBlock, lowerHeight)
if token == nil {
log.Printf("[%s] Finished: no more blocks\n", p.Name())
return
}
}
}(i, p)
}
wg.Wait()
f, err := os.Create("blocks.csv")
if err != nil {
log.Panic(err)
}
defer f.Close()
csvFile := csv.NewWriter(f)
defer csvFile.Flush()
csvFile.Write([]string{"Height", "Id", "Timestamp", "Reward", "Pool"})
for {
smallIndex := -1
smallValue := uint64(0)
for i, s := range allBlocks {
if len(s) > 0 {
if s[0].Height >= smallValue {
smallValue = s[0].Height
smallIndex = i
}
}
}
if smallIndex == -1 {
break
}
csvFile.Write([]string{strconv.FormatUint(allBlocks[smallIndex][0].Height, 10), allBlocks[smallIndex][0].Id.String(), strconv.FormatUint(allBlocks[smallIndex][0].Timestamp, 10), strconv.FormatUint(allBlocks[smallIndex][0].Reward, 10), pools[smallIndex].Name()})
allBlocks[smallIndex] = allBlocks[smallIndex][1:]
}
}