forked from TrueCloudLab/neoneo-go
network: request state roots if needed
This commit is contained in:
parent
f8051da0bd
commit
e2e1bd09ae
2 changed files with 25 additions and 3 deletions
|
@ -620,12 +620,31 @@ func (s *Server) handleGetRootsCmd(p Peer, gr *payload.GetStateRoots) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleStateRootsCmd processees `roots` request.
|
// handleStateRootsCmd processees `roots` request.
|
||||||
func (s *Server) handleRootsCmd(rs *payload.StateRoots) error {
|
func (s *Server) handleRootsCmd(p Peer, rs *payload.StateRoots) error {
|
||||||
for i := range rs.Roots {
|
for i := range rs.Roots {
|
||||||
_ = s.chain.AddStateRoot(&rs.Roots[i])
|
_ = s.chain.AddStateRoot(&rs.Roots[i])
|
||||||
}
|
}
|
||||||
|
// request more state roots from peer if needed
|
||||||
|
return s.requestStateRoot(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
// requestStateRoot sends `getroots` message to get verified state roots.
|
||||||
|
func (s *Server) requestStateRoot(p Peer) error {
|
||||||
|
stateHeight := s.chain.StateHeight()
|
||||||
|
hdrHeight := s.chain.BlockHeight()
|
||||||
|
count := uint32(payload.MaxStateRootsAllowed)
|
||||||
|
if diff := hdrHeight - stateHeight; diff < count {
|
||||||
|
count = diff
|
||||||
|
}
|
||||||
|
if count == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
gr := &payload.GetStateRoots{
|
||||||
|
Start: stateHeight + 1,
|
||||||
|
Count: count,
|
||||||
|
}
|
||||||
|
return p.EnqueueP2PMessage(s.MkMsg(CMDGetRoots, gr))
|
||||||
|
}
|
||||||
|
|
||||||
// handleStateRootCmd processees `stateroot` request.
|
// handleStateRootCmd processees `stateroot` request.
|
||||||
func (s *Server) handleStateRootCmd(r *state.MPTRoot) error {
|
func (s *Server) handleStateRootCmd(r *state.MPTRoot) error {
|
||||||
|
@ -772,7 +791,7 @@ func (s *Server) handleMessage(peer Peer, msg *Message) error {
|
||||||
return s.handlePong(peer, pong)
|
return s.handlePong(peer, pong)
|
||||||
case CMDRoots:
|
case CMDRoots:
|
||||||
rs := msg.Payload.(*payload.StateRoots)
|
rs := msg.Payload.(*payload.StateRoots)
|
||||||
return s.handleRootsCmd(rs)
|
return s.handleRootsCmd(peer, rs)
|
||||||
case CMDStateRoot:
|
case CMDStateRoot:
|
||||||
r := msg.Payload.(*state.MPTRoot)
|
r := msg.Payload.(*state.MPTRoot)
|
||||||
return s.handleStateRootCmd(r)
|
return s.handleStateRootCmd(r)
|
||||||
|
|
|
@ -251,6 +251,9 @@ func (p *TCPPeer) StartProtocol() {
|
||||||
if p.LastBlockIndex() > p.server.chain.BlockHeight() {
|
if p.LastBlockIndex() > p.server.chain.BlockHeight() {
|
||||||
err = p.server.requestBlocks(p)
|
err = p.server.requestBlocks(p)
|
||||||
}
|
}
|
||||||
|
if err == nil {
|
||||||
|
err = p.server.requestStateRoot(p)
|
||||||
|
}
|
||||||
if err == nil {
|
if err == nil {
|
||||||
timer.Reset(p.server.ProtoTickInterval)
|
timer.Reset(p.server.ProtoTickInterval)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue