arnaucube
arnaucube/goBlockchainDataAnalysisPublic Self-hosted repository
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}