package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
blockchainlib "./blockchainlib"
|
|
p2plib "./p2plib"
|
|
"github.com/fatih/color"
|
|
"github.com/gorilla/mux"
|
|
)
|
|
|
|
type Routes []Route
|
|
|
|
var routes = Routes{
|
|
Route{
|
|
"Index",
|
|
"GET",
|
|
"/",
|
|
Index,
|
|
},
|
|
Route{
|
|
"GetPeers",
|
|
"GET",
|
|
"/peers",
|
|
GetPeers,
|
|
},
|
|
Route{
|
|
"PostUser",
|
|
"POST",
|
|
"/register",
|
|
PostUser,
|
|
},
|
|
Route{
|
|
"GenesisBlock",
|
|
"GET",
|
|
"/blocks/genesis",
|
|
GenesisBlock,
|
|
},
|
|
Route{
|
|
"NextBlock",
|
|
"GET",
|
|
"/blocks/next/{blockhash}",
|
|
NextBlock,
|
|
},
|
|
Route{
|
|
"LastBlock",
|
|
"GET",
|
|
"/blocks/last",
|
|
LastBlock,
|
|
},
|
|
}
|
|
|
|
type Address struct {
|
|
Address string `json:"address"` //the pubK of the user, to perform logins
|
|
}
|
|
|
|
func Index(w http.ResponseWriter, r *http.Request) {
|
|
fmt.Fprintln(w, tp.ID)
|
|
}
|
|
func GetPeers(w http.ResponseWriter, r *http.Request) {
|
|
jResp, err := json.Marshal(tp.PeersConnections.Outcoming)
|
|
check(err)
|
|
fmt.Fprintln(w, string(jResp))
|
|
}
|
|
func PostUser(w http.ResponseWriter, r *http.Request) {
|
|
|
|
decoder := json.NewDecoder(r.Body)
|
|
var address string
|
|
err := decoder.Decode(&address)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer r.Body.Close()
|
|
fmt.Println(address)
|
|
color.Blue(address)
|
|
|
|
//TODO add the verification of the address, to decide if it's accepted to create a new Block
|
|
block := blockchain.CreateBlock(address)
|
|
blockchain.AddBlock(block)
|
|
|
|
go PropagateBlock(block)
|
|
|
|
jResp, err := json.Marshal(blockchain)
|
|
check(err)
|
|
fmt.Fprintln(w, string(jResp))
|
|
}
|
|
|
|
func PropagateBlock(b blockchainlib.Block) {
|
|
//prepare the msg to send to all connected peers
|
|
var msg p2plib.Msg
|
|
msg.Construct("Block", "new block")
|
|
bJson, err := json.Marshal(b)
|
|
check(err)
|
|
|
|
msg.Data = []byte(bJson)
|
|
msgB := msg.ToBytes()
|
|
for _, peer := range tp.PeersConnections.Outcoming.Peers {
|
|
if peer.Conn != nil {
|
|
_, err := peer.Conn.Write(msgB)
|
|
check(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func GenesisBlock(w http.ResponseWriter, r *http.Request) {
|
|
var genesis blockchainlib.Block
|
|
if len(blockchain.Blocks) >= 0 {
|
|
genesis = blockchain.Blocks[0]
|
|
}
|
|
|
|
jResp, err := json.Marshal(genesis)
|
|
check(err)
|
|
fmt.Fprintln(w, string(jResp))
|
|
}
|
|
|
|
func NextBlock(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
blockhash := vars["blockhash"]
|
|
|
|
currBlock, err := blockchain.GetBlockByHash(blockhash)
|
|
check(err)
|
|
nextBlock, err := blockchain.GetBlockByHash(currBlock.NextHash)
|
|
check(err)
|
|
|
|
jResp, err := json.Marshal(nextBlock)
|
|
check(err)
|
|
fmt.Fprintln(w, string(jResp))
|
|
}
|
|
|
|
func LastBlock(w http.ResponseWriter, r *http.Request) {
|
|
var genesis blockchainlib.Block
|
|
if len(blockchain.Blocks) > 0 {
|
|
genesis = blockchain.Blocks[len(blockchain.Blocks)-1]
|
|
}
|
|
|
|
jResp, err := json.Marshal(genesis)
|
|
check(err)
|
|
fmt.Fprintln(w, string(jResp))
|
|
}
|