arnaucube
arnaucube/goBlockchainDataAnalysisPublic Self-hosted repository
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/btcd/rpcclient"
  9)
 10
 11func explore(client *rpcclient.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		if block.Height > config.StartFromBlock {
 29			var newBlock BlockModel
 30			newBlock.Hash = block.Hash
 31			newBlock.Confirmations = block.Confirmations
 32			newBlock.Size = block.Size
 33			newBlock.Height = block.Height
 34			//newBlock.Amount = block.Amount
 35			//newBlock.Fee = block.Fee
 36			newBlock.PreviousHash = block.PreviousHash
 37			newBlock.NextHash = block.NextHash
 38			newBlock.Time = block.Time
 39			newBlock.DateT = unixTimeToTime(block.Time)
 40			newBlock.Date.Year, newBlock.Date.Month, newBlock.Date.Day, newBlock.Date.Hour = decomposeDate(block.Time)
 41
 42			//stats blocks
 43			stats := getStats()
 44			stats.BlockCount++
 45			if len(block.Tx) > 1 {
 46				stats.RealBlockCount++
 47			}
 48			updateStats(stats)
 49
 50			for k, txHash := range block.Tx {
 51				if k > 0 {
 52					realBlocks++
 53
 54					//stats txs
 55					stats := getStats()
 56					stats.TxCount++
 57					updateStats(stats)
 58
 59					fmt.Print("Block Height: ")
 60					fmt.Print(block.Height)
 61					fmt.Print(", num of Tx: ")
 62					fmt.Print(k)
 63					fmt.Print("/")
 64					fmt.Println(len(block.Tx) - 1)
 65
 66					th, err := chainhash.NewHashFromStr(txHash)
 67					check(err)
 68					blockTx, err := client.GetRawTransactionVerbose(th)
 69					check(err)
 70
 71					//save Tx Node
 72					var nodeTx NodeModel
 73					nodeTx.Id = txHash
 74					nodeTx.Label = txHash
 75					nodeTx.Title = txHash
 76					nodeTx.Group = strconv.FormatInt(block.Height, 10)
 77					nodeTx.Value = 1
 78					nodeTx.Shape = "square"
 79					nodeTx.Type = "tx"
 80					saveNode(nodeCollection, nodeTx)
 81
 82					//Tx save
 83					var newTx TxModel
 84					newTx.Hex = blockTx.Hex
 85					newTx.Txid = blockTx.Txid
 86					newTx.Hash = blockTx.Hash
 87					newTx.BlockHash = block.Hash
 88					newTx.BlockHeight = strconv.FormatInt(block.Height, 10)
 89					newTx.Time = blockTx.Time
 90					newTx.DateT = unixTimeToTime(block.Time)
 91					newTx.Date.Year, newTx.Date.Month, newTx.Date.Day, newTx.Date.Hour = decomposeDate(block.Time)
 92
 93					var originAddresses []string
 94					var outputAddresses []string
 95					var outputAmount []float64
 96					for _, Vo := range blockTx.Vout {
 97						for _, outputAddr := range Vo.ScriptPubKey.Addresses {
 98							outputAddresses = append(outputAddresses, outputAddr)
 99							outputAmount = append(outputAmount, Vo.Value)
100							var n2 NodeModel
101							n2.Id = outputAddr
102							n2.Label = outputAddr
103							n2.Title = outputAddr
104							n2.Group = strconv.FormatInt(block.Height, 10)
105							n2.Value = 1
106							n2.Shape = "dot"
107							n2.Type = "address"
108							saveNode(nodeCollection, n2)
109
110							//Address
111							var addr AddressModel
112							addr.Hash = outputAddr
113							addr.InBittrex = false
114							saveAddress(addr)
115
116							var newVout Vout
117							newVout.Value = Vo.Value
118							newVout.Address = outputAddr
119							newTx.Vout = append(newTx.Vout, newVout)
120						}
121					}
122					for _, Vi := range blockTx.Vin {
123						th, err := chainhash.NewHashFromStr(Vi.Txid)
124						check(err)
125						txVi, err := client.GetRawTransactionVerbose(th)
126						check(err)
127
128						//if len(txVi.Vout[Vi.Vout].ScriptPubKey.Addresses) > 0 {
129						//add tx to newBlock
130						newBlock.Tx = append(newBlock.Tx, blockTx.Txid)
131
132						//Tx save
133						for _, originAddr := range txVi.Vout[Vi.Vout].ScriptPubKey.Addresses {
134							originAddresses = append(originAddresses, originAddr)
135
136							var newVin Vin
137							newVin.Txid = blockTx.Txid
138							newVin.Amount = txVi.Vout[Vi.Vout].Value
139							newVin.Address = originAddr
140							newTx.Vin = append(newTx.Vin, newVin)
141
142							var n1 NodeModel
143							n1.Id = originAddr
144							n1.Label = originAddr
145							n1.Title = originAddr
146							n1.Group = strconv.FormatInt(block.Height, 10)
147							n1.Value = 1
148							n1.Shape = "dot"
149							n1.Type = "address"
150							saveNode(nodeCollection, n1)
151
152							//Address
153							var addr AddressModel
154							addr.Hash = originAddr
155							addr.InBittrex = false
156							saveAddress(addr)
157
158							for k, outputAddr := range outputAddresses {
159								var eIn EdgeModel
160								eIn.From = originAddr
161								eIn.To = txHash
162								eIn.Label = txVi.Vout[Vi.Vout].Value
163								eIn.Txid = blockTx.Txid
164								eIn.Arrows = "to"
165								eIn.BlockHeight = block.Height
166								saveEdge(edgeCollection, eIn)
167
168								var eOut EdgeModel
169								eOut.From = txHash
170								eOut.To = outputAddr
171								eOut.Label = outputAmount[k]
172								eOut.Txid = blockTx.Txid
173								eOut.Arrows = "to"
174								eOut.BlockHeight = block.Height
175								saveEdge(edgeCollection, eOut)
176
177								//date analysis
178								//dateAnalysis(e, tx.Time)
179								//hour analysis
180								hourAnalysis(eIn, blockTx.Time)
181
182								//newTx.To = outputAddr
183
184							}
185						}
186						/*} else {
187							originAddresses = append(originAddresses, "origin")
188						}*/
189
190					}
191					saveTx(newTx)
192					fmt.Print("originAddresses: ")
193					fmt.Println(len(originAddresses))
194					fmt.Print("outputAddresses: ")
195					fmt.Println(len(outputAddresses))
196				}
197			}
198			saveBlock(newBlock)
199		}
200		//set the next block
201		blockHash = block.NextHash
202	}
203
204	fmt.Print("realBlocks added (blocks with Fee and Amount values): ")
205	fmt.Println(realBlocks)
206	fmt.Println("reached the end of blockchain")
207}