diff --git a/core/Blockchain.go b/core/Blockchain.go index f8f689e..9528414 100644 --- a/core/Blockchain.go +++ b/core/Blockchain.go @@ -1,6 +1,7 @@ package core import ( + "bytes" "encoding/json" "log" "net/http" @@ -10,6 +11,7 @@ import ( // Blockchain struct type Blockchain struct { + Hostname string Blocks []Block PendingTransactions []Transaction Peers []string @@ -38,10 +40,10 @@ func (bc *Blockchain) MineBlock() Block { } // NewBlockchain creates a new Blockchain -func NewBlockchain() Blockchain { +func NewBlockchain(hostname string) Blockchain { log.Print("Creating Blockchain...") - blockchain := Blockchain{Blocks: make([]Block, 0), PendingTransactions: make([]Transaction, 0), Peers: make([]string, 0)} + blockchain := Blockchain{Hostname: hostname, Blocks: make([]Block, 0), PendingTransactions: make([]Transaction, 0), Peers: make([]string, 0)} // Mine Genesis Block blockchain.MineBlock() @@ -77,6 +79,12 @@ func (bc *Blockchain) AddPeer(peer string) (resp *http.Response, err error) { // Add Peer, if it is not already in the list if !contains(bc.Peers, peer) { bc.Peers = append(bc.Peers, peer) + + var body []string + data, _ := json.Marshal(append(body, bc.Hostname)) + + log.Println("request http://" + peer + "/add_peers") + http.Post("http://"+peer+"/add_peers", "application/json", bytes.NewBuffer(data)) } return resp, nil } diff --git a/server/webserver.go b/server/webserver.go index 659bd06..26841bd 100644 --- a/server/webserver.go +++ b/server/webserver.go @@ -4,7 +4,9 @@ import ( "encoding/gob" "encoding/json" "log" + "net" "net/http" + "os" "github.com/garritfra/blockchain-project/core" ) @@ -17,7 +19,7 @@ func ServeHTTP(port string) { gob.Register(core.Transaction{}) gob.Register(core.Blockchain{}) - blockchain = core.NewBlockchain() + blockchain = core.NewBlockchain(getHostAddress() + port) registerRouteHandlers() @@ -27,6 +29,23 @@ func ServeHTTP(port string) { } } +func getHostAddress() string { + addrs, err := net.InterfaceAddrs() + if err != nil { + os.Stderr.WriteString("Oops: " + err.Error() + "\n") + os.Exit(1) + } + + for _, a := range addrs { + if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { + if ipnet.IP.To4() != nil { + return ipnet.IP.String() + } + } + } + return "" +} + func registerRouteHandlers() { http.HandleFunc("/", handleListBlocks) http.HandleFunc("/mine_block", handleMineBlock)