diff --git a/memory.md b/memory.md index f155507..a30d265 100644 --- a/memory.md +++ b/memory.md @@ -1,4 +1 @@ -- p2plib/messages.go / MessageHandler -put in a way that the messages handlers can be created from the main code (not from the package) - - subsitute the REST functions by the messages in the MessageHandler diff --git a/peer/blockchainlib/blockchain.go b/peer/blockchainlib/blockchain.go index 21be2dd..1ea0f69 100644 --- a/peer/blockchainlib/blockchain.go +++ b/peer/blockchainlib/blockchain.go @@ -119,6 +119,45 @@ func (bc *Blockchain) ReconstructBlockchainFromBlock(urlAPI string, h string) { } 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") diff --git a/peer/blockchainlib/init.go b/peer/blockchainlib/init.go new file mode 100644 index 0000000..91965dd --- /dev/null +++ b/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 +} diff --git a/peer/messageHandler.go b/peer/blockchainlib/messageHandler.go similarity index 62% rename from peer/messageHandler.go rename to peer/blockchainlib/messageHandler.go index 9c2bdec..f5eb612 100644 --- a/peer/messageHandler.go +++ b/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") } } diff --git a/peer/main.go b/peer/main.go index 0b34144..f385574 100644 --- a/peer/main.go +++ b/peer/main.go @@ -25,25 +25,20 @@ func main() { //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) } diff --git a/peer/restRoutes.go b/peer/restRoutes.go index 9bec3fe..621b2a6 100755 --- a/peer/restRoutes.go +++ b/peer/restRoutes.go @@ -106,7 +106,7 @@ func PropagateBlock(b blockchainlib.Block) { 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] } diff --git a/runTmuxTestPeers.sh b/runTmuxTestPeers.sh index d7a5870..8f83852 100644 --- a/runTmuxTestPeers.sh +++ b/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