arnaucube
arnaucube/goBlockchainDataAnalysisPublic Self-hosted repository
added get7day tx/day analysis
arnaucode idoctnef@openmailbox.org
Sat, 19 Aug 2017 21:15:03 +0200
commit

5baca8bc8150b8c11542f53a8a7b2e00de527eb2

parent

3e83a6bf744e5860356ec1b7092f796c2cc38e5f

M DevelopmentNotes.md → DevelopmentNotes.md

@@ -2,24 +2,20 @@ # Development Notes

## 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 @@ }

``` - mantain connection with wallet using websockets - -- add 24h to hour analysis, to show also hours with 0 transactions
M dateAnalysis.go → dateAnalysis.go

@@ -3,12 +3,18 @@

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 @@ return stringDate

} 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)
M mongoModels.go → mongoModels.go

@@ -84,11 +84,11 @@ Nodes []SankeyNodeModel `json:"nodes"`

Links []SankeyLinkModel `json:"links"` } -type HourCountModel struct { - Hour string `json:"hour"` - Count int `json:"count"` +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"` }
M serverRoutes.go → serverRoutes.go

@@ -70,6 +70,12 @@ "Get",

"/last24hour", GetLast24HourAnalysis, }, + Route{ + "GetLast7DayAnalysis", + "Get", + "/last7day", + GetLast7DayAnalysis, + }, } //ROUTES

@@ -210,18 +216,18 @@

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 @@ },

}).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) }
M web/views/main/main.html → web/views/main/main.html

@@ -19,8 +19,15 @@ <div class="panel-heading c_blueGrey300">

<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> + <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> <div class="col-sm-4">

@@ -29,7 +36,7 @@ <div class="panel-heading c_blueGrey300">

<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>
M web/views/main/main.js → web/views/main/main.js

@@ -35,15 +35,31 @@ console.log('data error');

}); //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'); });