goBlockchainDataAnalysis/addressTree.go
addressTree.goRaw
1package main
2
3import (
4 "fmt"
5 "log"
6
7 "github.com/fatih/color"
8
9 "gopkg.in/mgo.v2/bson"
10)
11
12func upTree(address string, network NetworkModel) NetworkModel {
13 var upNetwork NetworkModel
14
15 //add address node to network
16 node := NodeModel{}
17 err := nodeCollection.Find(bson.M{"id": address}).One(&node)
18 check(err)
19 if nodeInNodes(network.Nodes, node) == false {
20 network.Nodes = append(network.Nodes, node)
21 }
22
23 //get edges before the address
24 edges := []EdgeModel{}
25 err = edgeCollection.Find(bson.M{"to": address}).All(&edges)
26 check(err)
27 for _, e := range edges {
28 if edgeInEdges(network.Edges, e) == false {
29 network.Edges = append(network.Edges, e)
30 }
31 //get the nodes involved in edges
32 /*
33 nodes := []NodeModel{}
34 err := nodeCollection.Find(bson.M{"id": }).All(&edges)
35 check(err)
36 */
37 endBranch := false
38 edgeUpCheck := EdgeModel{}
39 err := edgeCollection.Find(bson.M{"to": e.From}).One(&edgeUpCheck)
40 if err != nil {
41 log.Println(err)
42 color.Blue("not found")
43 endBranch = true
44 }
45
46 //need to be fixed when there is a bucle between the addresses (A-->B, B-->C, C-->A)
47 fmt.Println(e.From + " - " + e.To)
48 //if e.From != e.To && e.From != upLevelEdge.To && e.To != upLevelEdge.From {
49 //if e.From != e.To {
50 fmt.Println(endBranch)
51 fmt.Println(edgeInEdges(network.Edges, edgeUpCheck))
52 if edgeInEdges(network.Edges, edgeUpCheck) == false && endBranch == false {
53 upNetwork = upTree(e.From, network)
54 for _, upN := range upNetwork.Nodes {
55 if nodeInNodes(network.Nodes, upN) == false {
56 network.Nodes = append(network.Nodes, upN)
57 }
58 }
59 for _, upE := range upNetwork.Edges {
60 if edgeInEdges(network.Edges, upE) == false {
61 network.Edges = append(network.Edges, upE)
62 }
63 }
64 }
65 }
66
67 return network
68}
69func addressTree(address string) NetworkModel {
70 var network NetworkModel
71
72 network = upTree(address, network)
73 return network
74
75}