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