Browse Source

added GetBlockchain in REST API of the serverCA, also added the visualization to the serverCA webapp

master
arnaucode 6 years ago
parent
commit
06b34d74b8
8 changed files with 198 additions and 12 deletions
  1. +11
    -4
      peer/blockchain.go
  2. BIN
      peer/peer
  3. +7
    -0
      runTestPeers.sh
  4. +115
    -0
      serverCA/blockchain.go
  5. +2
    -0
      serverCA/main.go
  6. +16
    -0
      serverCA/restRoutes.go
  7. +37
    -8
      serverCA/webapp/views/main/main.html
  8. +10
    -0
      serverCA/webapp/views/main/main.js

+ 11
- 4
peer/blockchain.go

@ -81,6 +81,11 @@ func (bc *Blockchain) addBlock(block Block) error {
func reconstructBlockchainFromBlock(urlAPI string, h string) {
color.Yellow("reconstructing the blockchain from last block in memory")
var block Block
var err error
block, err = blockchain.getBlockByHash(h)
check(err)
if h == "" {
//no genesis block yet
color.Green(urlAPI + "/blocks/genesis")
@ -97,16 +102,18 @@ func reconstructBlockchainFromBlock(urlAPI string, h string) {
block.NextHash = h
}
for block.NextHash != "" {
for block.NextHash != "" && block.Hash != "" {
res, err := http.Get(urlAPI + "/blocks/next/" + block.Hash)
check(err)
body, err := ioutil.ReadAll(res.Body)
check(err)
err = json.Unmarshal(body, &block)
check(err)
color.Yellow("[New Block]: " + block.Hash)
err = blockchain.addBlock(block)
check(err)
if block.Hash != "" {
color.Yellow("[New Block]: " + block.Hash)
err = blockchain.addBlock(block)
check(err)
}
}
blockchain.print()
}

BIN
peer/peer


+ 7
- 0
runTestPeers.sh

@ -27,3 +27,10 @@ sleep 2
echo "peer 3"
xterm -hold -e './peer client 3007 3008' &
sleep 1
echo "running serverCA"
cd ..
cd serverCA
xterm -hold -e 'go run *.go' &

+ 115
- 0
serverCA/blockchain.go

@ -0,0 +1,115 @@
package main
import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
"time"
"github.com/fatih/color"
)
type Block struct {
Hash string `json:"hash"`
Height int64 `json:"height"`
Date time.Time `json:"date"`
PreviousHash string `json:"previoushash"`
NextHash string `json:"nexthash"`
Data []Address `json:"data"`
Emitter string `json:"emitter"` //the ID of the peer that has emmited the block
}
type Blockchain struct {
GenesisBlock string `json:"genesisblock"`
LastUpdate time.Time `json:"lastupdate"`
Blocks []Block `json:"blocks"`
}
var blockchain Blockchain
func (bc *Blockchain) getBlockByHash(hash string) (Block, error) {
for _, block := range bc.Blocks {
if block.Hash == hash {
return block, nil
}
}
var b Block
return b, errors.New("Block Hash not found")
}
func (bc *Blockchain) blockExists(block Block) bool {
for _, b := range bc.Blocks {
if b.Hash == block.Hash {
return true
}
}
return false
}
func (bc *Blockchain) addBlock(block Block) error {
if blockchain.blockExists(block) {
return errors.New("[Error adding Block]: Block already exists in the Blockchain")
}
if len(bc.Blocks) > 0 {
bc.Blocks[len(bc.Blocks)-1].NextHash = block.Hash
} else {
bc.GenesisBlock = block.Hash
}
bc.Blocks = append(bc.Blocks, block)
return nil
}
func reconstructBlockchainFromBlock(urlAPI string, h string) {
color.Yellow("reconstructing the blockchain from last block in memory")
var block Block
var err error
block, err = blockchain.getBlockByHash(h)
check(err)
if h == "" {
//no genesis block yet
color.Green(urlAPI + "/blocks/genesis")
res, err := http.Get(urlAPI + "/blocks/genesis")
check(err)
body, err := ioutil.ReadAll(res.Body)
check(err)
err = json.Unmarshal(body, &block)
check(err)
color.Yellow("[New Block]: " + block.Hash)
err = blockchain.addBlock(block)
check(err)
} else {
block.NextHash = h
}
for block.NextHash != "" && block.Hash != "" {
res, err := http.Get(urlAPI + "/blocks/next/" + block.Hash)
check(err)
body, err := ioutil.ReadAll(res.Body)
check(err)
err = json.Unmarshal(body, &block)
check(err)
if block.Hash != "" {
color.Yellow("[New Block]: " + block.Hash)
err = blockchain.addBlock(block)
check(err)
}
}
blockchain.print()
}
func (bc *Blockchain) print() {
color.Green("Printing Blockchain stored in memory")
color.Green("Genesis Block: " + bc.GenesisBlock)
for _, b := range bc.Blocks {
color.Green("Block height:")
fmt.Println(b.Height)
color.Green("Hash: " + b.Hash)
color.Green("Date: " + b.Date.String())
color.Green("---")
}
}

+ 2
- 0
serverCA/main.go

@ -32,6 +32,8 @@ func main() {
//read configuration file
readConfig("config.json")
reconstructBlockchainFromBlock("http://"+config.IP+":"+config.ServerRESTPort, "")
//run thw webserver
go webserver()

+ 16
- 0
serverCA/restRoutes.go

@ -21,6 +21,12 @@ var routes = Routes{
"/peers",
GetPeers,
},
Route{
"GetBlockchain",
"GET",
"/blockchain",
GetBlockchain,
},
}
type Address struct {
@ -37,3 +43,13 @@ func GetPeers(w http.ResponseWriter, r *http.Request) {
check(err)
fmt.Fprintln(w, string(jResp))
}
func GetBlockchain(w http.ResponseWriter, r *http.Request) {
fmt.Print("aaaaa: ")
fmt.Println(blockchain.Blocks[len(blockchain.Blocks)-1].Hash)
reconstructBlockchainFromBlock("http://"+config.IP+":"+config.ServerRESTPort, blockchain.Blocks[len(blockchain.Blocks)-1].Hash)
jResp, err := json.Marshal(blockchain)
check(err)
fmt.Fprintln(w, string(jResp))
}

+ 37
- 8
serverCA/webapp/views/main/main.html

@ -1,16 +1,45 @@
<div class="container">
<div class="row">
<div class="col-md-3">
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h4 class="card-title">
Peers
</h4>
{{peerslist.PeerID}}
<div style="max-height: 500px; overflow-y:scroll;">
<div ng-repeat="peer in peerslist.peerslist">
<b>{{peer.id}}</b> - {{peer.role}}
<br>
- {{peer.ip}}:{{peer.port}}, {{peer.restport}}
<hr>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
{{peerslist.PeerID}}
<div class="card-body" style="max-height: 500px; overflow-y:scroll;">
<div ng-repeat="peer in peerslist.peerslist">
<b>{{peer.id}}</b> - {{peer.role}}
<br>
- {{peer.ip}}:{{peer.port}}, {{peer.restport}}
<hr>
<div class="card-body">
<h4 class="card-title">
Blockchain
</h4>
<div style="max-height: 500px; overflow-y:scroll;">
<div ng-repeat="block in blockchain.blocks">
Hash: <b>{{block.hash}}</b> - Height: {{block.height}}
<br>
Emitter: {{block.emitter}}
<br>
Date: {{block.date}}
<br>
Data: {{block.data}}
<br>
PreviousHash: {{block.previoushash}}
<br>
NextHash: {{block.nexthash}}
<hr>
</div>
</div>
</div>
</div>

+ 10
- 0
serverCA/webapp/views/main/main.js

@ -19,4 +19,14 @@ angular.module('app.main', ['ngRoute'])
}, function(data, status, headers, config) {
console.log('data error');
});
$scope.blockchain={};
$http.get(urlapi + 'blockchain')
.then(function(data, status, headers, config) {
console.log('data success');
console.log(data.data);
$scope.blockchain = data.data;
}, function(data, status, headers, config) {
console.log('data error');
});
});

Loading…
Cancel
Save