goBlockchainDataAnalysis/exploreBlockchain.go
exploreBlockchain.goRaw
1package main
2
3import (
4 "fmt"
5 "strconv"
6
7 "github.com/btcsuite/btcd/chaincfg/chainhash"
8 "github.com/btcsuite/btcrpcclient"
9)
10
11func explore(client *btcrpcclient.Client, blockHash string) {
12 var realBlocks int
13 var nOrigin NodeModel
14 nOrigin.Id = "origin"
15 nOrigin.Label = "origin"
16 nOrigin.Title = "origin"
17 nOrigin.Group = "origin"
18 nOrigin.Value = 1
19 nOrigin.Shape = "dot"
20 saveNode(nodeCollection, nOrigin)
21
22 for blockHash != "" {
23 //generate hash from string
24 bh, err := chainhash.NewHashFromStr(blockHash)
25 check(err)
26 block, err := client.GetBlockVerbose(bh)
27 check(err)
28
29 if block.Height > 160 {
30 for k, txHash := range block.Tx {
31 if k > 0 {
32 realBlocks++
33 fmt.Print("Block Height: ")
34 fmt.Print(block.Height)
35 fmt.Print(", num of Tx: ")
36 fmt.Print(k)
37 fmt.Print("/")
38 fmt.Println(len(block.Tx) - 1)
39
40 th, err := chainhash.NewHashFromStr(txHash)
41 check(err)
42 tx, err := client.GetRawTransactionVerbose(th)
43 check(err)
44
45 var originAddresses []string
46 var outputAddresses []string
47 for _, Vo := range tx.Vout {
48 //if Vo.Value > 0 {
49 for _, outputAddr := range Vo.ScriptPubKey.Addresses {
50 outputAddresses = append(outputAddresses, outputAddr)
51 var n2 NodeModel
52 n2.Id = outputAddr
53 n2.Label = outputAddr
54 n2.Title = outputAddr
55 n2.Group = strconv.FormatInt(block.Height, 10)
56 n2.Value = 1
57 n2.Shape = "dot"
58 saveNode(nodeCollection, n2)
59 }
60 //}
61 }
62 for _, Vi := range tx.Vin {
63 th, err := chainhash.NewHashFromStr(Vi.Txid)
64 check(err)
65 txVi, err := client.GetRawTransactionVerbose(th)
66 check(err)
67 if len(txVi.Vout[Vi.Vout].ScriptPubKey.Addresses) > 0 {
68 for _, originAddr := range txVi.Vout[Vi.Vout].ScriptPubKey.Addresses {
69 originAddresses = append(originAddresses, originAddr)
70 var n1 NodeModel
71 n1.Id = originAddr
72 n1.Label = originAddr
73 n1.Title = originAddr
74 n1.Group = string(block.Height)
75 n1.Value = 1
76 n1.Shape = "dot"
77 saveNode(nodeCollection, n1)
78
79 for _, outputAddr := range outputAddresses {
80 var e EdgeModel
81 e.From = originAddr
82 e.To = outputAddr
83 e.Label = txVi.Vout[Vi.Vout].Value
84 e.Txid = tx.Txid
85 e.Arrows = "to"
86 e.BlockHeight = block.Height
87 saveEdge(edgeCollection, e)
88
89 //date analysis
90 //dateAnalysis(e, tx.Time)
91 //hour analysis
92 hourAnalysis(e, tx.Time)
93 }
94 }
95 } else {
96 originAddresses = append(originAddresses, "origin")
97 }
98
99 }
100 fmt.Print("originAddresses: ")
101 fmt.Println(len(originAddresses))
102 fmt.Print("outputAddresses: ")
103 fmt.Println(len(outputAddresses))
104 }
105 }
106 }
107 //set the next block
108 blockHash = block.NextHash
109 }
110
111 fmt.Print("realBlocks (blocks with Fee and Amount values): ")
112 fmt.Println(realBlocks)
113 fmt.Println("reached the end of blockchain")
114}