mirror of
https://github.com/arnaucube/goBlockchainDataAnalysis.git
synced 2026-02-07 11:46:38 +01:00
finished generation of network map of address history (back in blockchain)
This commit is contained in:
57
addressTree.go
Normal file
57
addressTree.go
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gopkg.in/mgo.v2/bson"
|
||||||
|
)
|
||||||
|
|
||||||
|
func upTree(address string, network NetworkModel) NetworkModel {
|
||||||
|
var upNetwork NetworkModel
|
||||||
|
|
||||||
|
//add address node to network
|
||||||
|
node := NodeModel{}
|
||||||
|
err := nodeCollection.Find(bson.M{"id": address}).One(&node)
|
||||||
|
check(err)
|
||||||
|
if nodeInNodes(network.Nodes, node) == false {
|
||||||
|
network.Nodes = append(network.Nodes, node)
|
||||||
|
}
|
||||||
|
|
||||||
|
//get edges before the address
|
||||||
|
edges := []EdgeModel{}
|
||||||
|
err = edgeCollection.Find(bson.M{"to": address}).All(&edges)
|
||||||
|
check(err)
|
||||||
|
|
||||||
|
for _, e := range edges {
|
||||||
|
if edgeInEdges(network.Edges, e) == false {
|
||||||
|
network.Edges = append(network.Edges, e)
|
||||||
|
}
|
||||||
|
//get the nodes involved in edges
|
||||||
|
/*
|
||||||
|
nodes := []NodeModel{}
|
||||||
|
err := nodeCollection.Find(bson.M{"id": }).All(&edges)
|
||||||
|
check(err)
|
||||||
|
*/
|
||||||
|
|
||||||
|
if e.From != e.To {
|
||||||
|
upNetwork = upTree(e.From, network)
|
||||||
|
for _, upN := range upNetwork.Nodes {
|
||||||
|
if nodeInNodes(network.Nodes, upN) == false {
|
||||||
|
network.Nodes = append(network.Nodes, upN)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, upE := range upNetwork.Edges {
|
||||||
|
if edgeInEdges(network.Edges, upE) == false {
|
||||||
|
network.Edges = append(network.Edges, upE)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return network
|
||||||
|
}
|
||||||
|
func addressTree(address string) NetworkModel {
|
||||||
|
var network NetworkModel
|
||||||
|
|
||||||
|
network = upTree(address, network)
|
||||||
|
return network
|
||||||
|
|
||||||
|
}
|
||||||
@@ -4,11 +4,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"gopkg.in/mgo.v2/bson"
|
|
||||||
|
|
||||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||||
"github.com/btcsuite/btcrpcclient"
|
"github.com/btcsuite/btcrpcclient"
|
||||||
"github.com/fatih/color"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func explore(client *btcrpcclient.Client, blockHash string) {
|
func explore(client *btcrpcclient.Client, blockHash string) {
|
||||||
@@ -111,40 +108,3 @@ func explore(client *btcrpcclient.Client, blockHash string) {
|
|||||||
fmt.Println(realBlocks)
|
fmt.Println(realBlocks)
|
||||||
fmt.Println("reached the end of blockchain")
|
fmt.Println("reached the end of blockchain")
|
||||||
}
|
}
|
||||||
func addressTree(address string) NetworkModel {
|
|
||||||
var network NetworkModel
|
|
||||||
|
|
||||||
var currentEdge EdgeModel
|
|
||||||
currentEdge.From = "a"
|
|
||||||
currentEdge.To = "b"
|
|
||||||
for currentEdge.From != currentEdge.To {
|
|
||||||
color.Green("for")
|
|
||||||
fmt.Println(address)
|
|
||||||
//get edges before the address
|
|
||||||
edges := []EdgeModel{}
|
|
||||||
err := edgeCollection.Find(bson.M{"to": address}).All(&edges)
|
|
||||||
check(err)
|
|
||||||
for _, edge := range edges {
|
|
||||||
network.Edges = append(network.Edges, edge)
|
|
||||||
fmt.Println(edge)
|
|
||||||
}
|
|
||||||
//get all nodes from edges
|
|
||||||
for _, edge := range edges {
|
|
||||||
node := NodeModel{}
|
|
||||||
err := nodeCollection.Find(bson.M{"id": edge.From}).One(&node)
|
|
||||||
check(err)
|
|
||||||
if nodeInNodes(network.Nodes, node) == false {
|
|
||||||
network.Nodes = append(network.Nodes, node)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = nodeCollection.Find(bson.M{"id": edge.To}).One(&node)
|
|
||||||
check(err)
|
|
||||||
if nodeInNodes(network.Nodes, node) == false {
|
|
||||||
network.Nodes = append(network.Nodes, node)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
address = edges[0].From
|
|
||||||
currentEdge = edges[0]
|
|
||||||
}
|
|
||||||
return network
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -118,3 +118,11 @@ func nodeInNodes(nodes []NodeModel, node NodeModel) bool {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
func edgeInEdges(edges []EdgeModel, edge EdgeModel) bool {
|
||||||
|
for _, e := range edges {
|
||||||
|
if e.From == edge.From && e.To == edge.To {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user