diff --git a/peer/blockchain.go b/peer/blockchain.go index 7d2d2b2..eb42250 100644 --- a/peer/blockchain.go +++ b/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() } diff --git a/peer/peer b/peer/peer index 3869ce4..805c16d 100755 Binary files a/peer/peer and b/peer/peer differ diff --git a/runTestPeers.sh b/runTestPeers.sh index 5956d26..8ad63c2 100644 --- a/runTestPeers.sh +++ b/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' & diff --git a/serverCA/blockchain.go b/serverCA/blockchain.go new file mode 100644 index 0000000..9c96996 --- /dev/null +++ b/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("---") + } +} diff --git a/serverCA/main.go b/serverCA/main.go index 4f662a3..87dc40b 100644 --- a/serverCA/main.go +++ b/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() diff --git a/serverCA/restRoutes.go b/serverCA/restRoutes.go index 1efdefb..31d89ab 100755 --- a/serverCA/restRoutes.go +++ b/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)) +} diff --git a/serverCA/webapp/views/main/main.html b/serverCA/webapp/views/main/main.html index c9bd879..d51500f 100644 --- a/serverCA/webapp/views/main/main.html +++ b/serverCA/webapp/views/main/main.html @@ -1,16 +1,45 @@
-
+
+
+
+

+ Peers +

+ {{peerslist.PeerID}} +
+
+ {{peer.id}} - {{peer.role}} +
+ - {{peer.ip}}:{{peer.port}}, {{peer.restport}} +
+
+
+
+
+
- {{peerslist.PeerID}} -
-
- {{peer.id}} - {{peer.role}} -
- - {{peer.ip}}:{{peer.port}}, {{peer.restport}} -
+
+

+ Blockchain +

+
+
+ Hash: {{block.hash}} - Height: {{block.height}} +
+ Emitter: {{block.emitter}} +
+ Date: {{block.date}} +
+ Data: {{block.data}} +
+ PreviousHash: {{block.previoushash}} +
+ NextHash: {{block.nexthash}} +
+
diff --git a/serverCA/webapp/views/main/main.js b/serverCA/webapp/views/main/main.js index 9903a97..7e10d6e 100644 --- a/serverCA/webapp/views/main/main.js +++ b/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'); + }); });