arnaucube
arnaucube/goBlockchainDataAnalysisPublic Self-hosted repository
goBlockchainDataAnalysis/exploreBlockchain.go
exploreBlockchain.goRaw
  1package main
  2
  3import (
  4	"fmt"
  5
  6	"github.com/btcsuite/btcd/chaincfg/chainhash"
  7	"github.com/btcsuite/btcrpcclient"
  8)
  9
 10func explore(client *btcrpcclient.Client, blockHash string) {
 11	var realBlocks int
 12	for blockHash != "" {
 13		//generate hash from string
 14		bh, err := chainhash.NewHashFromStr(blockHash)
 15		check(err)
 16		block, err := client.GetBlockVerbose(bh)
 17		check(err)
 18
 19		var newBlock BlockModel
 20		newBlock.Hash = block.Hash
 21		newBlock.Height = block.Height
 22		newBlock.Confirmations = block.Confirmations
 23
 24		//get Fee value
 25		th, err := chainhash.NewHashFromStr(block.Tx[0])
 26		check(err)
 27		tx, err := client.GetRawTransactionVerbose(th)
 28		check(err)
 29		var totalFee float64
 30		for _, Vo := range tx.Vout {
 31			totalFee = totalFee + Vo.Value
 32		}
 33		newBlock.Fee = totalFee
 34
 35		//for each Tx, get the Tx value
 36		var totalAmount float64
 37		/*inside each block, there are []Tx
 38		inside each Tx, if is the Tx[0], is the Fees
 39		in the Tx[n] where n>0, each Tx is independent,
 40		and inside each Tx there are []Vout.
 41		Usually Vout[0] is the real Tx value
 42		and the Vout[1] is the rest of the amount in the original wallet.
 43		Each Tx moves all the wallet amount, and the realTx amount is sent to the destination
 44		and the rest of the wallet amount, is send to another owned wallet
 45		*/
 46		for k, txHash := range block.Tx {
 47			//first Tx is the Fee
 48			//after first Tx is the Sent Amount
 49			if k > 0 {
 50				th, err := chainhash.NewHashFromStr(txHash)
 51				check(err)
 52				tx, err := client.GetRawTransactionVerbose(th)
 53				check(err)
 54				var originAddress string
 55				for _, Vi := range tx.Vin {
 56					th, err := chainhash.NewHashFromStr(Vi.Txid)
 57					check(err)
 58					txVi, err := client.GetRawTransactionVerbose(th)
 59					check(err)
 60					if len(txVi.Vout[0].ScriptPubKey.Addresses) > 0 {
 61						originAddress = txVi.Vout[0].ScriptPubKey.Addresses[0]
 62					}
 63				}
 64				for _, Vo := range tx.Vout {
 65					totalAmount = totalAmount + Vo.Value
 66
 67					var blockTx TxModel
 68					blockTx.Txid = tx.Txid
 69					blockTx.Amount = Vo.Value
 70					blockTx.From = originAddress
 71					blockTx.To = Vo.ScriptPubKey.Addresses[0]
 72					newBlock.Tx = append(newBlock.Tx, blockTx)
 73				}
 74			}
 75		}
 76
 77		if totalAmount > 0 {
 78			newBlock.Amount = totalAmount
 79			saveBlock(blockCollection, newBlock)
 80			fmt.Print("Height: ")
 81			fmt.Println(newBlock.Height)
 82			fmt.Print("Amount: ")
 83			fmt.Println(newBlock.Amount)
 84			fmt.Print("Fee: ")
 85			fmt.Println(newBlock.Fee)
 86			fmt.Println("-----")
 87			realBlocks++
 88		}
 89
 90		//set the next block
 91		blockHash = block.NextHash
 92
 93		//analyze block creator
 94		for _, t := range newBlock.Tx {
 95			var n1 NodeModel
 96			var n2 NodeModel
 97			n1.Id = t.From
 98			n1.Label = t.From
 99			n1.Value = 1
100			n1.Shape = "dot"
101			n2.Id = t.To
102			n2.Label = t.To
103			n2.Value = 1
104			n2.Shape = "dot"
105
106			var e EdgeModel
107			e.From = t.From
108			e.To = t.To
109			e.Label = t.Amount
110			e.Txid = t.Txid
111
112			saveNode(nodeCollection, n1)
113			saveNode(nodeCollection, n2)
114			saveEdge(edgeCollection, e)
115		}
116
117	}
118	fmt.Print("realBlocks (blocks with Fee and Amount values): ")
119	fmt.Println(realBlocks)
120	fmt.Println("reached the end of blockchain")
121}