Browse Source

saving the blocks in the MongoDB

master
arnaucode 7 years ago
parent
commit
44d832f0ed
4 changed files with 102 additions and 23 deletions
  1. +17
    -22
      exploreBlockchain.go
  2. +11
    -1
      main.go
  3. +9
    -0
      mongoModels.go
  4. +65
    -0
      mongoOperations.go

exploreBlocks.go → exploreBlockchain.go

@ -8,26 +8,14 @@ import (
)
func explore(client *btcrpcclient.Client, blockHash string) {
var realBlocks int
for blockHash != "" {
//generate hash from string
bh, err := chainhash.NewHashFromStr(blockHash)
check(err)
fmt.Print("blockHash: ")
fmt.Println(bh)
block, err := client.GetBlockVerbose(bh)
check(err)
fmt.Print("height: ")
fmt.Println(block.Height)
fmt.Print("rawTx: ")
fmt.Println(block.RawTx)
fmt.Print("Tx: ")
fmt.Println(block.Tx)
fmt.Print("Time: ")
fmt.Println(block.Time)
fmt.Print("Confirmations: ")
fmt.Println(block.Confirmations)
fmt.Print("Fee: ")
th, err := chainhash.NewHashFromStr(block.Tx[0])
check(err)
tx, err := client.GetRawTransactionVerbose(th)
@ -37,9 +25,6 @@ func explore(client *btcrpcclient.Client, blockHash string) {
for _, Vo := range tx.Vout {
totalFee = totalFee + Vo.Value
}
fmt.Print("totalFee: ")
fmt.Print(totalFee)
fmt.Println(" FAIR")
//for each Tx, get the Tx value
var totalAmount float64
@ -49,22 +34,32 @@ func explore(client *btcrpcclient.Client, blockHash string) {
if k > 0 {
th, err := chainhash.NewHashFromStr(txHash)
check(err)
fmt.Print("tx hash: ")
fmt.Println(th)
tx, err := client.GetRawTransactionVerbose(th)
check(err)
for _, Vo := range tx.Vout {
totalAmount = totalAmount + Vo.Value
}
fmt.Print("totalAmount: ")
fmt.Print(totalAmount)
fmt.Println(" FAIR")
}
}
fmt.Println("-----")
if totalAmount > 0 {
var newBlock BlockModel
newBlock.Hash = block.Hash
newBlock.Height = block.Height
newBlock.Confirmations = block.Confirmations
newBlock.Amount = totalAmount
newBlock.Fee = totalFee
saveBlock(blockCollection, newBlock)
fmt.Println(newBlock.Height)
fmt.Println(newBlock.Amount)
fmt.Println(newBlock.Fee)
fmt.Println("-----")
realBlocks++
}
//set the next block
blockHash = block.NextHash
}
fmt.Print("realBlocks (blocks with Fee and Amount values): ")
fmt.Println(realBlocks)
fmt.Println("reached the end of blockchain")
}

+ 11
- 1
main.go

@ -3,13 +3,23 @@ package main
import (
"log"
mgo "gopkg.in/mgo.v2"
"github.com/btcsuite/btcrpcclient"
)
func main() {
var blockCollection *mgo.Collection
func main() {
//read goBlockchainDataAbalysis config
readConfig("config.json")
//connect with mongodb
readMongodbConfig("./mongodbConfig.json")
session, err := getSession()
check(err)
blockCollection = getCollection(session, "blocks")
// create new client instance
client, err := btcrpcclient.New(&btcrpcclient.ConnConfig{
HTTPPostMode: true,

+ 9
- 0
mongoModels.go

@ -0,0 +1,9 @@
package main
type BlockModel struct {
Hash string
Height int64
Confirmations uint64
Amount float64
Fee float64
}

+ 65
- 0
mongoOperations.go

@ -0,0 +1,65 @@
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
mgo "gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
//MongoConfig stores the configuration of mongodb to connect
type MongoConfig struct {
Ip string `json:"ip"`
Database string `json:"database"`
}
var mongoConfig MongoConfig
func readMongodbConfig(path string) {
file, e := ioutil.ReadFile(path)
if e != nil {
fmt.Println("error:", e)
}
content := string(file)
json.Unmarshal([]byte(content), &mongoConfig)
}
func getSession() (*mgo.Session, error) {
session, err := mgo.Dial("mongodb://" + mongoConfig.Ip)
if err != nil {
panic(err)
}
//defer session.Close()
// Optional. Switch the session to a monotonic behavior.
session.SetMode(mgo.Monotonic, true)
// Optional. Switch the session to a monotonic behavior.
session.SetMode(mgo.Monotonic, true)
return session, err
}
func getCollection(session *mgo.Session, collection string) *mgo.Collection {
c := session.DB(mongoConfig.Database).C(collection)
return c
}
func saveBlock(c *mgo.Collection, block BlockModel) {
//first, check if the item already exists
result := BlockModel{}
err := c.Find(bson.M{"hash": block.Hash}).One(&result)
if err != nil {
//item not found, so let's add a new entry
err = c.Insert(block)
check(err)
} else {
err = c.Update(bson.M{"hash": block.Hash}, &block)
if err != nil {
log.Fatal(err)
}
}
}

Loading…
Cancel
Save