mirror of
https://github.com/arnaucube/goBlockchainDataAnalysis.git
synced 2026-02-07 03:36:44 +01:00
added get7day tx/day analysis
This commit is contained in:
@@ -2,24 +2,20 @@
|
||||
|
||||
## ToDo list
|
||||
|
||||
- Sankey generation without loops
|
||||
|
||||
- Backend
|
||||
- Network Address generation avoiding infinite relation loops
|
||||
- Sankey Address generation without loops
|
||||
- Frontend
|
||||
- After Sankey visualization, go to Network Address visualization and render without Sankey dots
|
||||
- Both
|
||||
- Tx/day
|
||||
- Tx volume
|
||||
- Block size
|
||||
- Blockchain size
|
||||
|
||||
other
|
||||
- To get tx/hours of last 24 hours
|
||||
Search for TxModel with DateF > last24h
|
||||
Count for each hour
|
||||
- To get tx/day of last month
|
||||
Search TxModel with DateF > last month
|
||||
Count each day
|
||||
|
||||
- Add counter with total blocks, total tx, total address
|
||||
|
||||
- store date hour, day, etc:
|
||||
@@ -35,5 +31,3 @@ other
|
||||
```
|
||||
|
||||
- mantain connection with wallet using websockets
|
||||
|
||||
- add 24h to hour analysis, to show also hours with 0 transactions
|
||||
|
||||
@@ -3,12 +3,18 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"gopkg.in/mgo.v2/bson"
|
||||
)
|
||||
|
||||
func map24hours() map[int]int {
|
||||
h := make(map[int]int)
|
||||
for i := 0; i < 24; i++ {
|
||||
h[i] = 0
|
||||
}
|
||||
return h
|
||||
}
|
||||
func decomposeDate(blockTime int64) (int, int, int, int) {
|
||||
/*i, err := strconv.ParseInt(blockTime, 10, 64)
|
||||
if err != nil {
|
||||
@@ -38,16 +44,17 @@ func timeToDate(blockTime int64) string {
|
||||
}
|
||||
func hourAnalysis(e EdgeModel, blockTime int64) {
|
||||
//fmt.Println(blockTime)
|
||||
date := timeToDate(blockTime)
|
||||
/*date := timeToDate(blockTime)
|
||||
dateHour := strings.Split(date, " ")[1]
|
||||
hour := strings.Split(dateHour, ":")[0]
|
||||
hourString := strings.Split(dateHour, ":")[0]*/
|
||||
_, _, _, hour := decomposeDate(blockTime)
|
||||
|
||||
hourCount := HourCountModel{}
|
||||
hourCount := ChartCountModel{}
|
||||
err := hourCountCollection.Find(bson.M{"hour": hour}).One(&hourCount)
|
||||
if err != nil {
|
||||
//date not yet in DB
|
||||
var hourCount HourCountModel
|
||||
hourCount.Hour = hour
|
||||
var hourCount ChartCountModel
|
||||
hourCount.Elem = hour
|
||||
hourCount.Count = 1
|
||||
err = hourCountCollection.Insert(hourCount)
|
||||
check(err)
|
||||
|
||||
@@ -84,11 +84,11 @@ type SankeyModel struct {
|
||||
Links []SankeyLinkModel `json:"links"`
|
||||
}
|
||||
|
||||
type HourCountModel struct {
|
||||
Hour string `json:"hour"`
|
||||
type ChartCountModel struct {
|
||||
Elem int `json:"elem"`
|
||||
Count int `json:"count"`
|
||||
}
|
||||
type HourAnalysisResp struct {
|
||||
type ChartAnalysisResp struct {
|
||||
Labels []string `json:"labels"`
|
||||
Data []int `json:"data"`
|
||||
}
|
||||
|
||||
@@ -70,6 +70,12 @@ var routes = Routes{
|
||||
"/last24hour",
|
||||
GetLast24HourAnalysis,
|
||||
},
|
||||
Route{
|
||||
"GetLast7DayAnalysis",
|
||||
"Get",
|
||||
"/last7day",
|
||||
GetLast7DayAnalysis,
|
||||
},
|
||||
}
|
||||
|
||||
//ROUTES
|
||||
@@ -210,18 +216,18 @@ func NetworkMap(w http.ResponseWriter, r *http.Request) {
|
||||
func GetTotalHourAnalysis(w http.ResponseWriter, r *http.Request) {
|
||||
ipFilter(w, r)
|
||||
|
||||
hourAnalysis := []HourCountModel{}
|
||||
hourAnalysis := []ChartCountModel{}
|
||||
iter := hourCountCollection.Find(bson.M{}).Limit(10000).Iter()
|
||||
err := iter.All(&hourAnalysis)
|
||||
|
||||
//sort by hour
|
||||
sort.Slice(hourAnalysis, func(i, j int) bool {
|
||||
return hourAnalysis[i].Hour < hourAnalysis[j].Hour
|
||||
return hourAnalysis[i].Elem < hourAnalysis[j].Elem
|
||||
})
|
||||
|
||||
var resp HourAnalysisResp
|
||||
var resp ChartAnalysisResp
|
||||
for _, d := range hourAnalysis {
|
||||
resp.Labels = append(resp.Labels, d.Hour)
|
||||
resp.Labels = append(resp.Labels, strconv.Itoa(d.Elem))
|
||||
resp.Data = append(resp.Data, d.Count)
|
||||
}
|
||||
|
||||
@@ -246,22 +252,64 @@ func GetLast24HourAnalysis(w http.ResponseWriter, r *http.Request) {
|
||||
}).Sort("-$natural").All(&txs)
|
||||
check(err)
|
||||
|
||||
hourFrequencies := make(map[int]int)
|
||||
//generate map with 24 hours
|
||||
hourFrequencies := map24hours()
|
||||
for _, tx := range txs {
|
||||
hourFrequencies[tx.Date.Hour]++
|
||||
}
|
||||
var hourCount []HourCountModel
|
||||
var hourCount []ChartCountModel
|
||||
for hour, frequency := range hourFrequencies {
|
||||
hourCount = append(hourCount, HourCountModel{strconv.Itoa(hour), frequency})
|
||||
hourCount = append(hourCount, ChartCountModel{hour, frequency})
|
||||
}
|
||||
//sort by hour
|
||||
sort.Slice(hourCount, func(i, j int) bool {
|
||||
return hourCount[i].Hour < hourCount[j].Hour
|
||||
return hourCount[i].Elem < hourCount[j].Elem
|
||||
})
|
||||
|
||||
var resp HourAnalysisResp
|
||||
var resp ChartAnalysisResp
|
||||
for _, d := range hourCount {
|
||||
resp.Labels = append(resp.Labels, d.Hour)
|
||||
resp.Labels = append(resp.Labels, strconv.Itoa(d.Elem))
|
||||
resp.Data = append(resp.Data, d.Count)
|
||||
}
|
||||
|
||||
//convert []resp struct to json
|
||||
jsonResp, err := json.Marshal(resp)
|
||||
check(err)
|
||||
fmt.Fprintln(w, string(jsonResp))
|
||||
}
|
||||
func GetLast7DayAnalysis(w http.ResponseWriter, r *http.Request) {
|
||||
ipFilter(w, r)
|
||||
|
||||
fromDate := time.Now().AddDate(0, 0, -7)
|
||||
toDate := time.Now()
|
||||
|
||||
txs := []TxModel{}
|
||||
err := txCollection.Find(bson.M{
|
||||
"datet": bson.M{
|
||||
"$gt": fromDate,
|
||||
"$lt": toDate,
|
||||
},
|
||||
}).Sort("-$natural").All(&txs)
|
||||
check(err)
|
||||
|
||||
//generate map with 24 hours
|
||||
//hourFrequencies := map24hours()
|
||||
dayFrequencies := make(map[int]int)
|
||||
for _, tx := range txs {
|
||||
dayFrequencies[tx.Date.Day]++
|
||||
}
|
||||
var dayCount []ChartCountModel
|
||||
for day, frequency := range dayFrequencies {
|
||||
dayCount = append(dayCount, ChartCountModel{day, frequency})
|
||||
}
|
||||
//sort by hour
|
||||
sort.Slice(dayCount, func(i, j int) bool {
|
||||
return dayCount[i].Elem < dayCount[j].Elem
|
||||
})
|
||||
|
||||
var resp ChartAnalysisResp
|
||||
for _, d := range dayCount {
|
||||
resp.Labels = append(resp.Labels, strconv.Itoa(d.Elem))
|
||||
resp.Data = append(resp.Data, d.Count)
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,14 @@
|
||||
<h3 class="panel-title">Last 24 hours Tx/Hour</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<canvas id="line" class="chart chart-line" chart-data="data" chart-labels="labels">
|
||||
<canvas id="line" class="chart chart-line" chart-data="last24hour.data" chart-labels="last24hour.labels">
|
||||
</canvas>
|
||||
</div>
|
||||
<div class="panel-heading c_blueGrey300">
|
||||
<h3 class="panel-title">Last 7 days Tx/Day</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<canvas id="line" class="chart chart-line" chart-data="last7day.data" chart-labels="last7day.labels">
|
||||
</canvas>
|
||||
</div>
|
||||
</div>
|
||||
@@ -29,7 +36,7 @@
|
||||
<h3 class="panel-title">Hours</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<canvas id="doughnut" class="chart chart-doughnut" chart-data="data" chart-labels="labels">
|
||||
<canvas id="doughnut" class="chart chart-doughnut" chart-data="last24hour.data" chart-labels="last24hour.labels">
|
||||
</canvas>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -35,15 +35,31 @@ angular.module('app.main', ['ngRoute'])
|
||||
});
|
||||
|
||||
//date analysis
|
||||
$scope.data = [];
|
||||
$scope.labels = [];
|
||||
$scope.last24hour= {
|
||||
data:[],
|
||||
labels: []
|
||||
};
|
||||
$http.get(urlapi + 'last24hour')
|
||||
.then(function(data, status, headers, config) {
|
||||
console.log('data success');
|
||||
console.log(data);
|
||||
|
||||
$scope.data = data.data.data;
|
||||
$scope.labels = data.data.labels;
|
||||
$scope.last24hour.data = data.data.data;
|
||||
$scope.last24hour.labels = data.data.labels;
|
||||
}, function(data, status, headers, config) {
|
||||
console.log('data error');
|
||||
});
|
||||
$scope.last7day= {
|
||||
data:[],
|
||||
labels: []
|
||||
};
|
||||
$http.get(urlapi + 'last7day')
|
||||
.then(function(data, status, headers, config) {
|
||||
console.log('data success');
|
||||
console.log(data);
|
||||
|
||||
$scope.last7day.data = data.data.data;
|
||||
$scope.last7day.labels = data.data.labels;
|
||||
}, function(data, status, headers, config) {
|
||||
console.log('data error');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user