working, next step convert REST functions to tcp msg p2p connections
arnaucode arnaucode@gmail.com
Sat, 27 Jan 2018 13:03:27 +0100
7 files changed,
75 insertions(+),
25 deletions(-)
M
peer/blockchainlib/blockchain.go
→
peer/blockchainlib/blockchain.go
@@ -119,6 +119,45 @@ }
} bc.Print() } +func (bc *Blockchain) ReconstructBlockchainFromBlockRESTversion(urlAPI string, h string) { + color.Yellow("reconstructing the blockchain from last block in memory") + var block Block + var err error + + block, err = bc.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 = bc.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 = bc.AddBlock(block) + check(err) + } + } + bc.Print() +} func (bc *Blockchain) Print() { color.Green("Printing Blockchain stored in memory")
A
peer/blockchainlib/init.go
@@ -0,0 +1,21 @@
+package blockchainlib + +import ( + p2plib "../p2plib" +) + +func (bc *Blockchain) InitializeBlockchain(role, ip, port, restport, serverip, serverport string) p2plib.ThisPeer { + + //read the stored blockchain + err := bc.ReadFromDisk() + check(err) + bc.Print() + + //get blockchain msgHandlerCases + configuredMsgCases := bc.CreateMsgHandlerCases() + //initialize p2plib, adding the configuredMsgCases to the p2plib msgCases to handle + tp := p2plib.InitializePeer(role, ip, port, restport, serverip, + serverport, configuredMsgCases) + //return thisPeer (tp) + return tp +}
M
peer/main.go
→
peer/main.go
@@ -25,25 +25,20 @@ color.Blue("Starting Peer")
//read configuration file readConfig("config.json") - //read the stored blockchain - err := blockchain.ReadFromDisk() - check(err) - blockchain.Print() - - //initialize p2plib - configuredMsgCases := createMsgHandlerCases() - tp = p2plib.InitializePeer(os.Args[1], "127.0.0.1", - os.Args[2], os.Args[3], config.ServerIP, config.ServerPort, configuredMsgCases) + //initialize blockchainlib + //InitializeBlockchain(role, ip, port, restport, serverip, serverport) + config.RESTPort = os.Args[3] + tp := blockchain.InitializeBlockchain(os.Args[1], "127.0.0.1", + os.Args[2], os.Args[3], config.ServerIP, config.ServerPort) if tp.RunningPeer.Role == "client" { color.Red("http://" + config.IP + ":" + config.ServerRESTPort) fmt.Println(blockchain.GenesisBlock) blockchain.ReconstructBlockchainFromBlock("http://"+config.IP+":"+config.ServerRESTPort, blockchain.GenesisBlock) } - color.Blue("initialized") - go runRestServer() + color.Blue("peer and blokcchain initialized") + go runRestServer() //TODO this will not be necessary, due the communications will go full over tcp connections - fmt.Println(tp.Running) for tp.Running { time.Sleep(1000 * time.Millisecond) }
M
peer/messageHandler.go
→
peer/blockchainlib/messageHandler.go
@@ -1,21 +1,19 @@
-package main +package blockchainlib import ( "fmt" - p2plib "./p2plib" - - blockchainlib "./blockchainlib" + p2plib "../p2plib" ) -func createMsgHandlerCases() map[string]func(p2plib.Peer, p2plib.Msg) { +func (bc *Blockchain) CreateMsgHandlerCases() map[string]func(p2plib.Peer, p2plib.Msg) { configuredMsgCases := make(map[string]func(p2plib.Peer, p2plib.Msg)) configuredMsgCases["Block"] = func(peer p2plib.Peer, msg p2plib.Msg) { //TODO check if the block is signed by an autorized emitter //block = msg.Data converted to Block - var block blockchainlib.Block - if !blockchain.BlockExists(block) { - blockchain.AddBlock(block) + var block Block + if !bc.BlockExists(block) { + bc.AddBlock(block) p2plib.PropagateData(peer, "block in string format") } }
M
peer/restRoutes.go
→
peer/restRoutes.go
@@ -106,7 +106,7 @@ }
func GenesisBlock(w http.ResponseWriter, r *http.Request) { var genesis blockchainlib.Block - if len(blockchain.Blocks) >= 0 { + if len(blockchain.Blocks) > 0 { genesis = blockchain.Blocks[0] }
M
runTmuxTestPeers.sh
→
runTmuxTestPeers.sh
@@ -7,7 +7,7 @@ tmux split-window -d -t 0 -h
tmux send-keys -t 0 'cd peer && go run *.go server 3001 3002' enter sleep 2 -tmux send-keys -t 1 "curl -X POST http://127.0.0.1:3002/register -d '{\"address\": \"firstaddress\"}'" enter +#tmux send-keys -t 1 "curl -X POST http://127.0.0.1:3002/register -d '{\"address\": \"firstaddress\"}'" enter sleep 1 tmux send-keys -t 1 'cd peer && go run *.go client 3003 3004' enter tmux send-keys -t 2 'cd peer && go run *.go client 3005 3006' enter