forked from cerc-io/plugeth
Implemented get chain msg
This commit is contained in:
parent
4a82230de5
commit
3e400739a7
40
peer.go
40
peer.go
@ -178,9 +178,14 @@ out:
|
||||
// Respond back with pong
|
||||
p.QueueMessage(ethwire.NewMessage(ethwire.MsgPongTy, ""))
|
||||
case ethwire.MsgPongTy:
|
||||
// If we received a pong back from a peer we set the
|
||||
// last pong so the peer handler knows this peer is still
|
||||
// active.
|
||||
p.lastPong = time.Now().Unix()
|
||||
case ethwire.MsgBlockTy:
|
||||
for i := 0; i < msg.Data.Length(); i++ {
|
||||
// Get all blocks and process them (TODO reverse order?)
|
||||
msg.Data = msg.Data.Get(0)
|
||||
for i := msg.Data.Length() - 1; i >= 0; i-- {
|
||||
block := ethchain.NewBlockFromRlpValue(msg.Data.Get(i))
|
||||
err := p.ethereum.BlockManager.ProcessBlock(block)
|
||||
|
||||
@ -189,10 +194,15 @@ out:
|
||||
}
|
||||
}
|
||||
case ethwire.MsgTxTy:
|
||||
// If the message was a transaction queue the transaction
|
||||
// in the TxPool where it will undergo validation and
|
||||
// processing when a new block is found
|
||||
for i := 0; i < msg.Data.Length(); i++ {
|
||||
p.ethereum.TxPool.QueueTransaction(ethchain.NewTransactionFromRlpValue(msg.Data.Get(i)))
|
||||
}
|
||||
case ethwire.MsgGetPeersTy:
|
||||
// Flag this peer as a 'requested of new peers' this to
|
||||
// prevent malicious peers being forced.
|
||||
p.requestedPeerList = true
|
||||
// Peer asked for list of connected peers
|
||||
p.pushPeers()
|
||||
@ -214,22 +224,31 @@ out:
|
||||
p.requestedPeerList = false
|
||||
}
|
||||
case ethwire.MsgGetChainTy:
|
||||
blocksFound := 0
|
||||
l := msg.Data.Length()
|
||||
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
|
||||
l := msg.Data.Length() - 1
|
||||
// Amount of parents in the canonical chain
|
||||
amountOfBlocks := msg.Data.Get(l).AsUint()
|
||||
// Check each SHA block hash from the message and determine whether
|
||||
// the SHA is in the database
|
||||
for i := 0; i < l; i++ {
|
||||
if p.ethereum.BlockManager.BlockChain().HasBlock(msg.Data.Get(i).AsString()) {
|
||||
blocksFound++
|
||||
// TODO send reply
|
||||
if data := msg.Data.Get(i).AsBytes(); p.ethereum.BlockManager.BlockChain().HasBlock(data) {
|
||||
parent = p.ethereum.BlockManager.BlockChain().GetBlock(data)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// If a parent is found send back a reply
|
||||
if parent != nil {
|
||||
chain := p.ethereum.BlockManager.BlockChain().GetChainFromHash(parent.Hash(), amountOfBlocks)
|
||||
p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, chain))
|
||||
} else {
|
||||
// If no blocks are found we send back a reply with msg not in chain
|
||||
// and the last hash from get chain
|
||||
if blocksFound == 0 {
|
||||
lastHash := msg.Data.Get(l - 1)
|
||||
p.QueueMessage(ethwire.NewMessage(ethwire.MsgNotInChainTy, lastHash))
|
||||
lastHash := msg.Data.Get(l)
|
||||
p.QueueMessage(ethwire.NewMessage(ethwire.MsgNotInChainTy, lastHash.AsRaw()))
|
||||
}
|
||||
case ethwire.MsgNotInChainTy:
|
||||
log.Println("Not in chain, not yet implemented")
|
||||
@ -320,6 +339,9 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) {
|
||||
|
||||
p.Stop()
|
||||
}
|
||||
} else {
|
||||
msg := ethwire.NewMessage(ethwire.MsgGetChainTy, []interface{}{p.ethereum.BlockManager.BlockChain().CurrentBlock.Hash(), uint64(100)})
|
||||
p.QueueMessage(msg)
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user