diff --git a/DevelopmentNotes.md b/DevelopmentNotes.md index 3c0ef67..6049511 100644 --- a/DevelopmentNotes.md +++ b/DevelopmentNotes.md @@ -30,3 +30,6 @@ other - mantain connection with wallet using websockets - num address evolution throught time + +- fix error in exploreBlockchain.go, when getting the tx.Vin +tx 8f04960da36beaa928b9693f7dca4afae5a6122bb6874d409a1156e4c6c55024 has 4 vin, but exploreBlockchain is only getting the first diff --git a/goBlockchainDataAnalysis b/goBlockchainDataAnalysis index ddaf02e..2cf7d51 100755 Binary files a/goBlockchainDataAnalysis and b/goBlockchainDataAnalysis differ diff --git a/serverRoutes.go b/serverRoutes.go index 03d6063..44cd036 100644 --- a/serverRoutes.go +++ b/serverRoutes.go @@ -70,6 +70,18 @@ var routes = Routes{ "/address/network/{address}", AddressNetwork, }, + Route{ + "BlockSankey", + "GET", + "/block/{height}/sankey", + BlockSankey, + }, + Route{ + "TxSankey", + "GET", + "/tx/{txid}/sankey", + TxSankey, + }, Route{ "AddressSankey", "GET", @@ -275,6 +287,139 @@ func AddressNetwork(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, string(jNetwork)) } } +func BlockSankey(w http.ResponseWriter, r *http.Request) { + ipFilter(w, r) + vars := mux.Vars(r) + var heightString string + heightString = vars["height"] + height, err := strconv.ParseInt(heightString, 10, 64) + if err != nil { + fmt.Fprintln(w, "not valid height") + } else { + block := BlockModel{} + err := blockCollection.Find(bson.M{"height": height}).One(&block) + + txs := []TxModel{} + err = txCollection.Find(bson.M{"blockheight": heightString}).All(&txs) + block.Txs = txs + + var nodesCount int + mapNodeK := make(map[string]int) + var sankey SankeyModel + for _, tx := range block.Txs { + var sankeyNodeA SankeyNodeModel + sankeyNodeA.Node = nodesCount + mapNodeK["tx"] = nodesCount + nodesCount++ + sankeyNodeA.Name = "tx" + sankey.Nodes = append(sankey.Nodes, sankeyNodeA) + + for _, vin := range tx.Vin { + var sankeyNode SankeyNodeModel + sankeyNode.Node = nodesCount + mapNodeK[vin.Address] = nodesCount + nodesCount++ + sankeyNode.Name = vin.Address + sankey.Nodes = append(sankey.Nodes, sankeyNode) + + var sankeyLink SankeyLinkModel + sankeyLink.Source = mapNodeK[vin.Address] + sankeyLink.Target = mapNodeK["tx"] + sankeyLink.Value = vin.Amount + fmt.Println(sankeyLink) + sankey.Links = append(sankey.Links, sankeyLink) + fmt.Println(sankey.Links) + } + + for _, vout := range tx.Vout { + var sankeyNode SankeyNodeModel + sankeyNode.Node = nodesCount + mapNodeK[vout.Address] = nodesCount + nodesCount++ + sankeyNode.Name = vout.Address + sankey.Nodes = append(sankey.Nodes, sankeyNode) + + var sankeyLink SankeyLinkModel + sankeyLink.Source = mapNodeK["tx"] + sankeyLink.Target = mapNodeK[vout.Address] + sankeyLink.Value = vout.Value + fmt.Println(sankeyLink) + sankey.Links = append(sankey.Links, sankeyLink) + } + + } + + fmt.Println("Sankey generated") + fmt.Println(sankey) + + //convert []resp struct to json + jsonSankey, err := json.Marshal(sankey) + check(err) + + fmt.Fprintln(w, string(jsonSankey)) + } +} +func TxSankey(w http.ResponseWriter, r *http.Request) { + ipFilter(w, r) + vars := mux.Vars(r) + txid := vars["txid"] + if txid == "undefined" { + fmt.Fprintln(w, "not valid height") + } else { + + tx := TxModel{} + err := txCollection.Find(bson.M{"txid": txid}).One(&tx) + + var nodesCount int + mapNodeK := make(map[string]int) + var sankey SankeyModel + var sankeyNodeA SankeyNodeModel + sankeyNodeA.Node = nodesCount + mapNodeK["tx"] = nodesCount + nodesCount++ + sankeyNodeA.Name = "tx" + sankey.Nodes = append(sankey.Nodes, sankeyNodeA) + + fmt.Println(tx.Vin) + for _, vin := range tx.Vin { + var sankeyNode SankeyNodeModel + sankeyNode.Node = nodesCount + mapNodeK[vin.Address] = nodesCount + nodesCount++ + sankeyNode.Name = vin.Address + sankey.Nodes = append(sankey.Nodes, sankeyNode) + + var sankeyLink SankeyLinkModel + sankeyLink.Source = mapNodeK[vin.Address] + sankeyLink.Target = mapNodeK["tx"] + sankeyLink.Value = vin.Amount + sankey.Links = append(sankey.Links, sankeyLink) + } + + for _, vout := range tx.Vout { + var sankeyNode SankeyNodeModel + sankeyNode.Node = nodesCount + mapNodeK[vout.Address] = nodesCount + nodesCount++ + sankeyNode.Name = vout.Address + sankey.Nodes = append(sankey.Nodes, sankeyNode) + + var sankeyLink SankeyLinkModel + sankeyLink.Source = mapNodeK["tx"] + sankeyLink.Target = mapNodeK[vout.Address] + sankeyLink.Value = vout.Value + sankey.Links = append(sankey.Links, sankeyLink) + } + + fmt.Println("Sankey generated") + + //convert []resp struct to json + jsonSankey, err := json.Marshal(sankey) + check(err) + + fmt.Fprintln(w, string(jsonSankey)) + } +} func AddressSankey(w http.ResponseWriter, r *http.Request) { ipFilter(w, r) vars := mux.Vars(r) diff --git a/web/views/block/block.html b/web/views/block/block.html index fea5f41..2d4e408 100644 --- a/web/views/block/block.html +++ b/web/views/block/block.html @@ -15,10 +15,13 @@