mirror of
https://github.com/arnaucube/goBlockchainDataAnalysis.git
synced 2026-02-07 03:36:44 +01:00
added server, route Get NetworkMap, added save to mongodb Nodes and Edges
This commit is contained in:
@@ -91,6 +91,28 @@ func explore(client *btcrpcclient.Client, blockHash string) {
|
|||||||
blockHash = block.NextHash
|
blockHash = block.NextHash
|
||||||
|
|
||||||
//analyze block creator
|
//analyze block creator
|
||||||
|
for _, t := range newBlock.Tx {
|
||||||
|
var n1 NodeModel
|
||||||
|
var n2 NodeModel
|
||||||
|
n1.Id = t.From
|
||||||
|
n1.Label = t.From
|
||||||
|
n1.Value = 1
|
||||||
|
n1.Shape = "dot"
|
||||||
|
n2.Id = t.To
|
||||||
|
n2.Label = t.To
|
||||||
|
n2.Value = 1
|
||||||
|
n2.Shape = "dot"
|
||||||
|
|
||||||
|
var e EdgeModel
|
||||||
|
e.From = t.From
|
||||||
|
e.To = t.To
|
||||||
|
e.Label = t.Amount
|
||||||
|
e.Txid = t.Txid
|
||||||
|
|
||||||
|
saveNode(nodeCollection, n1)
|
||||||
|
saveNode(nodeCollection, n2)
|
||||||
|
saveEdge(edgeCollection, e)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
fmt.Print("realBlocks (blocks with Fee and Amount values): ")
|
fmt.Print("realBlocks (blocks with Fee and Amount values): ")
|
||||||
|
|||||||
30
ipFilter.go
Normal file
30
ipFilter.go
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ipFilter(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var err error
|
||||||
|
fmt.Println(r.RemoteAddr)
|
||||||
|
reqIP := strings.Split(r.RemoteAddr, ":")[0]
|
||||||
|
for _, ip := range serverConfig.BlockedIPs {
|
||||||
|
if reqIP == ip {
|
||||||
|
err = errors.New("ip not allowed to post images")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ip := range serverConfig.AllowedIPs {
|
||||||
|
if reqIP != ip {
|
||||||
|
err = errors.New("ip not allowed to post images")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//return err
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
19
main.go
19
main.go
@@ -1,11 +1,15 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
|
||||||
mgo "gopkg.in/mgo.v2"
|
mgo "gopkg.in/mgo.v2"
|
||||||
|
|
||||||
"github.com/btcsuite/btcrpcclient"
|
"github.com/btcsuite/btcrpcclient"
|
||||||
|
"github.com/fatih/color"
|
||||||
)
|
)
|
||||||
|
|
||||||
var blockCollection *mgo.Collection
|
var blockCollection *mgo.Collection
|
||||||
@@ -45,8 +49,12 @@ func main() {
|
|||||||
for label, amount := range accounts {
|
for label, amount := range accounts {
|
||||||
log.Printf("%s: %s", label, amount)
|
log.Printf("%s: %s", label, amount)
|
||||||
}
|
}
|
||||||
|
if len(os.Args) > 1 {
|
||||||
explore(client, config.GenesisBlock)
|
if os.Args[1] == "-explore" {
|
||||||
|
fmt.Println("starting to explore blockchain")
|
||||||
|
explore(client, config.GenesisBlock)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Get the current block count.
|
// Get the current block count.
|
||||||
blockCount, err := client.GetBlockCount()
|
blockCount, err := client.GetBlockCount()
|
||||||
@@ -54,4 +62,11 @@ func main() {
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
log.Printf("Block count: %d", blockCount)
|
log.Printf("Block count: %d", blockCount)
|
||||||
|
|
||||||
|
//http server start
|
||||||
|
readServerConfig("./serverConfig.json")
|
||||||
|
color.Green("server running")
|
||||||
|
router := NewRouter()
|
||||||
|
log.Fatal(http.ListenAndServe(":"+serverConfig.ServerPort, router))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,8 +25,13 @@ type NodeModel struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type EdgeModel struct {
|
type EdgeModel struct {
|
||||||
|
Txid string
|
||||||
From string
|
From string
|
||||||
To string
|
To string
|
||||||
Label string
|
Label float64
|
||||||
Arrows string
|
Arrows string
|
||||||
}
|
}
|
||||||
|
type NetworkModel struct {
|
||||||
|
Nodes []NodeModel
|
||||||
|
Edges []EdgeModel
|
||||||
|
}
|
||||||
|
|||||||
@@ -63,13 +63,48 @@ func saveBlock(c *mgo.Collection, block BlockModel) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
func saveNode(c *mgo.Collection, block BlockModel) {
|
|
||||||
var node NodeModel
|
func getAllNodes() ([]NodeModel, error) {
|
||||||
node.Id = block.Hash
|
result := []NodeModel{}
|
||||||
node.Label = block.Hash
|
iter := nodeCollection.Find(bson.M{}).Limit(500).Iter()
|
||||||
node.Title = block.Hash
|
err := iter.All(&result)
|
||||||
node.Value = 1
|
return result, err
|
||||||
node.Shape = "dot"
|
|
||||||
}
|
}
|
||||||
func saveEdge(c *mgo.Collection, block BlockModel) {
|
|
||||||
|
func saveNode(c *mgo.Collection, node NodeModel) {
|
||||||
|
//first, check if the node already exists
|
||||||
|
result := NodeModel{}
|
||||||
|
err := c.Find(bson.M{"id": node.Id}).One(&result)
|
||||||
|
if err != nil {
|
||||||
|
//node not found, so let's add a new entry
|
||||||
|
err = c.Insert(node)
|
||||||
|
check(err)
|
||||||
|
} else {
|
||||||
|
err = c.Update(bson.M{"id": node.Id}, &node)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getAllEdges() ([]EdgeModel, error) {
|
||||||
|
result := []EdgeModel{}
|
||||||
|
iter := edgeCollection.Find(bson.M{}).Limit(500).Iter()
|
||||||
|
err := iter.All(&result)
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
func saveEdge(c *mgo.Collection, edge EdgeModel) {
|
||||||
|
//first, check if the edge already exists
|
||||||
|
result := EdgeModel{}
|
||||||
|
err := c.Find(bson.M{"txid": edge.Txid}).One(&result)
|
||||||
|
if err != nil {
|
||||||
|
//edge not found, so let's add a new entry
|
||||||
|
err = c.Insert(edge)
|
||||||
|
check(err)
|
||||||
|
} else {
|
||||||
|
err = c.Update(bson.M{"txid": edge.Txid}, &edge)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
69
serverConfig.go
Normal file
69
serverConfig.go
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Route struct {
|
||||||
|
Name string
|
||||||
|
Method string
|
||||||
|
Pattern string
|
||||||
|
HandlerFunc http.HandlerFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
//server config
|
||||||
|
type ServerConfig struct {
|
||||||
|
ServerIP string `json:"serverIP"`
|
||||||
|
ServerPort string `json:"serverPort"`
|
||||||
|
AllowedIPs []string `json:"allowedIPs"`
|
||||||
|
BlockedIPs []string `json:"blockedIPs"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var serverConfig ServerConfig
|
||||||
|
|
||||||
|
func readServerConfig(path string) {
|
||||||
|
file, err := ioutil.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("error: ", err)
|
||||||
|
}
|
||||||
|
content := string(file)
|
||||||
|
json.Unmarshal([]byte(content), &serverConfig)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Logger(inner http.Handler, name string) http.Handler {
|
||||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
|
inner.ServeHTTP(w, r)
|
||||||
|
|
||||||
|
log.Printf(
|
||||||
|
"%s\t%s\t%s\t%s",
|
||||||
|
r.Method,
|
||||||
|
r.RequestURI,
|
||||||
|
name,
|
||||||
|
time.Since(start),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func NewRouter() *mux.Router {
|
||||||
|
router := mux.NewRouter().StrictSlash(true)
|
||||||
|
for _, route := range routes {
|
||||||
|
var handler http.Handler
|
||||||
|
handler = route.HandlerFunc
|
||||||
|
handler = Logger(handler, route.Name)
|
||||||
|
|
||||||
|
router.
|
||||||
|
Methods(route.Method).
|
||||||
|
Path(route.Pattern).
|
||||||
|
Name(route.Name).
|
||||||
|
Handler(handler)
|
||||||
|
}
|
||||||
|
return router
|
||||||
|
}
|
||||||
117
serverRoutes.go
Normal file
117
serverRoutes.go
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Routes []Route
|
||||||
|
|
||||||
|
var routes = Routes{
|
||||||
|
Route{
|
||||||
|
"Index",
|
||||||
|
"GET",
|
||||||
|
"/",
|
||||||
|
Index,
|
||||||
|
},
|
||||||
|
/* Route{
|
||||||
|
"Recommendations",
|
||||||
|
"GET",
|
||||||
|
"/r/{userid}/{nrec}",
|
||||||
|
Recommendations,
|
||||||
|
},
|
||||||
|
*/
|
||||||
|
Route{
|
||||||
|
"NetworkMap",
|
||||||
|
"Get",
|
||||||
|
"/map",
|
||||||
|
NetworkMap,
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
Route{
|
||||||
|
"SelectItem",
|
||||||
|
"GET",
|
||||||
|
"/selectItem/{userid}/{itemid}",
|
||||||
|
SelectItem,
|
||||||
|
},
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
//ROUTES
|
||||||
|
|
||||||
|
func Index(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Fprintln(w, "ask for recommendations in /r")
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
func NewUser(w http.ResponseWriter, r *http.Request) {
|
||||||
|
ipFilter(w, r)
|
||||||
|
decoder := json.NewDecoder(r.Body)
|
||||||
|
var newUser UserModel
|
||||||
|
err := decoder.Decode(&newUser)
|
||||||
|
check(err)
|
||||||
|
defer r.Body.Close()
|
||||||
|
|
||||||
|
saveUser(userCollection, newUser)
|
||||||
|
|
||||||
|
fmt.Println(newUser)
|
||||||
|
fmt.Fprintln(w, "new user added: ", newUser.ID)
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
func NetworkMap(w http.ResponseWriter, r *http.Request) {
|
||||||
|
ipFilter(w, r)
|
||||||
|
|
||||||
|
nodes, err := getAllNodes()
|
||||||
|
check(err)
|
||||||
|
edges, err := getAllEdges()
|
||||||
|
check(err)
|
||||||
|
|
||||||
|
var network NetworkModel
|
||||||
|
network.Nodes = nodes
|
||||||
|
network.Edges = edges
|
||||||
|
|
||||||
|
//convert []resp struct to json
|
||||||
|
jNetwork, err := json.Marshal(network)
|
||||||
|
check(err)
|
||||||
|
|
||||||
|
fmt.Fprintln(w, string(jNetwork))
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
func SelectItem(w http.ResponseWriter, r *http.Request) {
|
||||||
|
ipFilter(w, r)
|
||||||
|
vars := mux.Vars(r)
|
||||||
|
userid := vars["userid"]
|
||||||
|
itemid := vars["itemid"]
|
||||||
|
//find item
|
||||||
|
item, err := getItemById(itemid)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(w, "item "+itemid+" not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
//find user
|
||||||
|
user, err := getUserById(userid)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(w, "user "+userid+" not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
//increase TActed in item
|
||||||
|
item.TActed = item.TActed + 1
|
||||||
|
|
||||||
|
//save item
|
||||||
|
item, err = updateItem(item)
|
||||||
|
check(err)
|
||||||
|
fmt.Println(item)
|
||||||
|
|
||||||
|
//add item to []Actions of user
|
||||||
|
user.Actions = append(user.Actions, itemid)
|
||||||
|
|
||||||
|
//save user
|
||||||
|
user, err = updateUser(user)
|
||||||
|
check(err)
|
||||||
|
fmt.Println(user)
|
||||||
|
|
||||||
|
fmt.Fprintln(w, "user: "+userid+", selects item: "+itemid)
|
||||||
|
}
|
||||||
|
*/
|
||||||
Reference in New Issue
Block a user