forked from cerc-io/plugeth
		
	Updated seed peers
This commit is contained in:
		
							parent
							
								
									3e400739a7
								
							
						
					
					
						commit
						7ccf51fd30
					
				
							
								
								
									
										12
									
								
								ethereum.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								ethereum.go
									
									
									
									
									
								
							| @ -72,10 +72,13 @@ func (s *Ethereum) AddPeer(conn net.Conn) { | |||||||
| 	peer := NewPeer(conn, s, true) | 	peer := NewPeer(conn, s, true) | ||||||
| 
 | 
 | ||||||
| 	if peer != nil { | 	if peer != nil { | ||||||
|  | 		if s.peers.Len() > -1 { | ||||||
|  | 			log.Println("SEED") | ||||||
|  | 			peer.Start(true) | ||||||
|  | 		} else { | ||||||
| 			s.peers.PushBack(peer) | 			s.peers.PushBack(peer) | ||||||
| 		peer.Start() | 			peer.Start(false) | ||||||
| 
 | 		} | ||||||
| 		log.Println("Peer connected ::", conn.RemoteAddr()) |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -164,8 +167,9 @@ func (s *Ethereum) Start() { | |||||||
| 	} else { | 	} else { | ||||||
| 		// Starting accepting connections
 | 		// Starting accepting connections
 | ||||||
| 		go func() { | 		go func() { | ||||||
| 			for { |  | ||||||
| 			log.Println("Ready and accepting connections") | 			log.Println("Ready and accepting connections") | ||||||
|  | 
 | ||||||
|  | 			for { | ||||||
| 				conn, err := ln.Accept() | 				conn, err := ln.Accept() | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					log.Println(err) | 					log.Println(err) | ||||||
|  | |||||||
							
								
								
									
										77
									
								
								peer.go
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								peer.go
									
									
									
									
									
								
							| @ -42,6 +42,9 @@ type Peer struct { | |||||||
| 	// Indicates whether a MsgGetPeersTy was requested of the peer
 | 	// Indicates whether a MsgGetPeersTy was requested of the peer
 | ||||||
| 	// this to prevent receiving false peers.
 | 	// this to prevent receiving false peers.
 | ||||||
| 	requestedPeerList bool | 	requestedPeerList bool | ||||||
|  | 
 | ||||||
|  | 	// Determines whether this is a seed peer
 | ||||||
|  | 	seed bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewPeer(conn net.Conn, ethereum *Ethereum, inbound bool) *Peer { | func NewPeer(conn net.Conn, ethereum *Ethereum, inbound bool) *Peer { | ||||||
| @ -81,9 +84,7 @@ func NewOutboundPeer(addr string, ethereum *Ethereum) *Peer { | |||||||
| 		atomic.StoreInt32(&p.connected, 1) | 		atomic.StoreInt32(&p.connected, 1) | ||||||
| 		atomic.StoreInt32(&p.disconnect, 0) | 		atomic.StoreInt32(&p.disconnect, 0) | ||||||
| 
 | 
 | ||||||
| 		log.Println("Connected to peer ::", conn.RemoteAddr()) | 		p.Start(false) | ||||||
| 
 |  | ||||||
| 		p.Start() |  | ||||||
| 	}() | 	}() | ||||||
| 
 | 
 | ||||||
| 	return p | 	return p | ||||||
| @ -115,6 +116,14 @@ func (p *Peer) writeMessage(msg *ethwire.Msg) { | |||||||
| 		p.Stop() | 		p.Stop() | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	// XXX TMP CODE FOR TESTNET
 | ||||||
|  | 	switch msg.Type { | ||||||
|  | 	case ethwire.MsgPeersTy: | ||||||
|  | 		if p.seed { | ||||||
|  | 			p.Stop() | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Outbound message handler. Outbound messages are handled here
 | // Outbound message handler. Outbound messages are handled here
 | ||||||
| @ -157,17 +166,14 @@ func (p *Peer) HandleInbound() { | |||||||
| out: | out: | ||||||
| 	for atomic.LoadInt32(&p.disconnect) == 0 { | 	for atomic.LoadInt32(&p.disconnect) == 0 { | ||||||
| 		// Wait for a message from the peer
 | 		// Wait for a message from the peer
 | ||||||
| 		msg, err := ethwire.ReadMessage(p.conn) | 		msgs, err := ethwire.ReadMessages(p.conn) | ||||||
|  | 		for _, msg := range msgs { | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				log.Println(err) | 				log.Println(err) | ||||||
| 
 | 
 | ||||||
| 				break out | 				break out | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 		if ethutil.Config.Debug { |  | ||||||
| 			log.Printf("Received %s\n", msg.Type.String()) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 			switch msg.Type { | 			switch msg.Type { | ||||||
| 			case ethwire.MsgHandshakeTy: | 			case ethwire.MsgHandshakeTy: | ||||||
| 				// Version message
 | 				// Version message
 | ||||||
| @ -183,8 +189,8 @@ out: | |||||||
| 				// active.
 | 				// active.
 | ||||||
| 				p.lastPong = time.Now().Unix() | 				p.lastPong = time.Now().Unix() | ||||||
| 			case ethwire.MsgBlockTy: | 			case ethwire.MsgBlockTy: | ||||||
| 			// Get all blocks and process them (TODO reverse order?)
 | 				// Get all blocks and process them
 | ||||||
| 			msg.Data = msg.Data.Get(0) | 				msg.Data = msg.Data | ||||||
| 				for i := msg.Data.Length() - 1; i >= 0; i-- { | 				for i := msg.Data.Length() - 1; i >= 0; i-- { | ||||||
| 					block := ethchain.NewBlockFromRlpValue(msg.Data.Get(i)) | 					block := ethchain.NewBlockFromRlpValue(msg.Data.Get(i)) | ||||||
| 					err := p.ethereum.BlockManager.ProcessBlock(block) | 					err := p.ethereum.BlockManager.ProcessBlock(block) | ||||||
| @ -222,13 +228,17 @@ out: | |||||||
| 					p.ethereum.ProcessPeerList(peers) | 					p.ethereum.ProcessPeerList(peers) | ||||||
| 					// Mark unrequested again
 | 					// Mark unrequested again
 | ||||||
| 					p.requestedPeerList = false | 					p.requestedPeerList = false | ||||||
|  | 
 | ||||||
| 				} | 				} | ||||||
| 			case ethwire.MsgGetChainTy: | 			case ethwire.MsgGetChainTy: | ||||||
| 				var parent *ethchain.Block | 				var parent *ethchain.Block | ||||||
| 			// FIXME
 |  | ||||||
| 			msg.Data = msg.Data.Get(0) |  | ||||||
| 				// Length minus one since the very last element in the array is a count
 | 				// Length minus one since the very last element in the array is a count
 | ||||||
| 				l := msg.Data.Length() - 1 | 				l := msg.Data.Length() - 1 | ||||||
|  | 				// Ignore empty get chains
 | ||||||
|  | 				if l <= 1 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
| 				// Amount of parents in the canonical chain
 | 				// Amount of parents in the canonical chain
 | ||||||
| 				amountOfBlocks := msg.Data.Get(l).AsUint() | 				amountOfBlocks := msg.Data.Get(l).AsUint() | ||||||
| 				// Check each SHA block hash from the message and determine whether
 | 				// Check each SHA block hash from the message and determine whether
 | ||||||
| @ -243,27 +253,31 @@ out: | |||||||
| 				// If a parent is found send back a reply
 | 				// If a parent is found send back a reply
 | ||||||
| 				if parent != nil { | 				if parent != nil { | ||||||
| 					chain := p.ethereum.BlockManager.BlockChain().GetChainFromHash(parent.Hash(), amountOfBlocks) | 					chain := p.ethereum.BlockManager.BlockChain().GetChainFromHash(parent.Hash(), amountOfBlocks) | ||||||
| 				p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, chain)) | 					p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, append(chain, amountOfBlocks))) | ||||||
| 				} else { | 				} else { | ||||||
| 					// If no blocks are found we send back a reply with msg not in chain
 | 					// If no blocks are found we send back a reply with msg not in chain
 | ||||||
| 					// and the last hash from get chain
 | 					// and the last hash from get chain
 | ||||||
| 				lastHash := msg.Data.Get(l) | 					lastHash := msg.Data.Get(l - 1) | ||||||
| 				p.QueueMessage(ethwire.NewMessage(ethwire.MsgNotInChainTy, lastHash.AsRaw())) | 					log.Printf("Sending not in chain with hash %x\n", lastHash.AsRaw()) | ||||||
|  | 					p.QueueMessage(ethwire.NewMessage(ethwire.MsgNotInChainTy, []interface{}{lastHash.AsRaw()})) | ||||||
| 				} | 				} | ||||||
| 			case ethwire.MsgNotInChainTy: | 			case ethwire.MsgNotInChainTy: | ||||||
| 			log.Println("Not in chain, not yet implemented") | 				log.Printf("Not in chain %x\n", msg.Data) | ||||||
| 				// TODO
 | 				// TODO
 | ||||||
| 
 | 
 | ||||||
| 				// Unofficial but fun nonetheless
 | 				// Unofficial but fun nonetheless
 | ||||||
| 			case ethwire.MsgTalkTy: | 			case ethwire.MsgTalkTy: | ||||||
| 			log.Printf("%v says: %s\n", p.conn.RemoteAddr(), msg.Data.Get(0).AsString()) | 				log.Printf("%v says: %s\n", p.conn.RemoteAddr(), msg.Data.AsString()) | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	p.Stop() | 	p.Stop() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (p *Peer) Start() { | func (p *Peer) Start(seed bool) { | ||||||
|  | 	p.seed = seed | ||||||
|  | 
 | ||||||
| 	if !p.inbound { | 	if !p.inbound { | ||||||
| 		err := p.pushHandshake() | 		err := p.pushHandshake() | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -277,6 +291,7 @@ func (p *Peer) Start() { | |||||||
| 	go p.HandleOutbound() | 	go p.HandleOutbound() | ||||||
| 	// Run the inbound handler in a new goroutine
 | 	// Run the inbound handler in a new goroutine
 | ||||||
| 	go p.HandleInbound() | 	go p.HandleInbound() | ||||||
|  | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (p *Peer) Stop() { | func (p *Peer) Stop() { | ||||||
| @ -294,9 +309,9 @@ func (p *Peer) Stop() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (p *Peer) pushHandshake() error { | func (p *Peer) pushHandshake() error { | ||||||
| 	msg := ethwire.NewMessage(ethwire.MsgHandshakeTy, ethutil.Encode([]interface{}{ | 	msg := ethwire.NewMessage(ethwire.MsgHandshakeTy, []interface{}{ | ||||||
| 		1, 0, p.ethereum.Nonce, | 		uint32(0), uint32(0), "/Ethereum(G) v0.0.1/", | ||||||
| 	})) | 	}) | ||||||
| 
 | 
 | ||||||
| 	p.QueueMessage(msg) | 	p.QueueMessage(msg) | ||||||
| 
 | 
 | ||||||
| @ -305,6 +320,7 @@ func (p *Peer) pushHandshake() error { | |||||||
| 
 | 
 | ||||||
| // Pushes the list of outbound peers to the client when requested
 | // Pushes the list of outbound peers to the client when requested
 | ||||||
| func (p *Peer) pushPeers() { | func (p *Peer) pushPeers() { | ||||||
|  | 
 | ||||||
| 	outPeers := make([]interface{}, len(p.ethereum.OutboundPeers())) | 	outPeers := make([]interface{}, len(p.ethereum.OutboundPeers())) | ||||||
| 	// Serialise each peer
 | 	// Serialise each peer
 | ||||||
| 	for i, peer := range p.ethereum.OutboundPeers() { | 	for i, peer := range p.ethereum.OutboundPeers() { | ||||||
| @ -312,7 +328,7 @@ func (p *Peer) pushPeers() { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Send message to the peer with the known list of connected clients
 | 	// Send message to the peer with the known list of connected clients
 | ||||||
| 	msg := ethwire.NewMessage(ethwire.MsgPeersTy, ethutil.Encode(outPeers)) | 	msg := ethwire.NewMessage(ethwire.MsgPeersTy, outPeers) | ||||||
| 
 | 
 | ||||||
| 	p.QueueMessage(msg) | 	p.QueueMessage(msg) | ||||||
| } | } | ||||||
| @ -320,29 +336,28 @@ func (p *Peer) pushPeers() { | |||||||
| func (p *Peer) handleHandshake(msg *ethwire.Msg) { | func (p *Peer) handleHandshake(msg *ethwire.Msg) { | ||||||
| 	c := msg.Data | 	c := msg.Data | ||||||
| 	// [PROTOCOL_VERSION, NETWORK_ID, CLIENT_ID]
 | 	// [PROTOCOL_VERSION, NETWORK_ID, CLIENT_ID]
 | ||||||
| 	if c.Get(2).AsUint() == p.ethereum.Nonce { |  | ||||||
| 		//if msg.Nonce == p.ethereum.Nonce {
 |  | ||||||
| 		log.Println("Peer connected to self, disconnecting") |  | ||||||
| 
 |  | ||||||
| 		p.Stop() |  | ||||||
| 
 |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	p.versionKnown = true | 	p.versionKnown = true | ||||||
| 
 | 
 | ||||||
|  | 	var istr string | ||||||
| 	// If this is an inbound connection send an ack back
 | 	// If this is an inbound connection send an ack back
 | ||||||
| 	if p.inbound { | 	if p.inbound { | ||||||
|  | 		/* | ||||||
| 			err := p.pushHandshake() | 			err := p.pushHandshake() | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				log.Println("Peer can't send ack back") | 				log.Println("Peer can't send ack back") | ||||||
| 
 | 
 | ||||||
| 				p.Stop() | 				p.Stop() | ||||||
| 			} | 			} | ||||||
|  | 		*/ | ||||||
|  | 		istr = "inbound" | ||||||
| 	} else { | 	} else { | ||||||
| 		msg := ethwire.NewMessage(ethwire.MsgGetChainTy, []interface{}{p.ethereum.BlockManager.BlockChain().CurrentBlock.Hash(), uint64(100)}) | 		msg := ethwire.NewMessage(ethwire.MsgGetChainTy, []interface{}{p.ethereum.BlockManager.BlockChain().CurrentBlock.Hash(), uint64(100)}) | ||||||
| 		p.QueueMessage(msg) | 		p.QueueMessage(msg) | ||||||
|  | 
 | ||||||
|  | 		istr = "outbound" | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	log.Printf("peer connect (%s) %v %s\n", istr, p.conn.RemoteAddr(), c.Get(2).AsString()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (p *Peer) RlpEncode() []byte { | func (p *Peer) RlpEncode() []byte { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user