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}