mirror of
https://github.com/tendermint/tendermint.git
synced 2026-09-20 15:04:22 +00:00
@@ -85,6 +85,12 @@ func NewRPCStateProvider(
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *stateProviderRPC) verifyLightBlockAtHeight(ctx context.Context, height uint64, ts time.Time) (*types.LightBlock, error) {
|
||||
ctx, cancel := context.WithTimeout(ctx, 10*time.Second)
|
||||
defer cancel()
|
||||
return s.lc.VerifyLightBlockAtHeight(ctx, int64(height), ts)
|
||||
}
|
||||
|
||||
// AppHash implements part of StateProvider. It calls the application to verify the
|
||||
// light blocks at heights h+1 and h+2 and, if verification succeeds, reports the app
|
||||
// hash for the block at height h+1 which correlates to the state at height h.
|
||||
@@ -93,7 +99,7 @@ func (s *stateProviderRPC) AppHash(ctx context.Context, height uint64) ([]byte,
|
||||
defer s.Unlock()
|
||||
|
||||
// We have to fetch the next height, which contains the app hash for the previous height.
|
||||
header, err := s.lc.VerifyLightBlockAtHeight(ctx, int64(height+1), time.Now())
|
||||
header, err := s.verifyLightBlockAtHeight(ctx, height+1, time.Now())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -101,7 +107,7 @@ func (s *stateProviderRPC) AppHash(ctx context.Context, height uint64) ([]byte,
|
||||
// We also try to fetch the blocks at H+2, since we need these
|
||||
// when building the state while restoring the snapshot. This avoids the race
|
||||
// condition where we try to restore a snapshot before H+2 exists.
|
||||
_, err = s.lc.VerifyLightBlockAtHeight(ctx, int64(height+2), time.Now())
|
||||
_, err = s.verifyLightBlockAtHeight(ctx, height+2, time.Now())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -112,7 +118,7 @@ func (s *stateProviderRPC) AppHash(ctx context.Context, height uint64) ([]byte,
|
||||
func (s *stateProviderRPC) Commit(ctx context.Context, height uint64) (*types.Commit, error) {
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
header, err := s.lc.VerifyLightBlockAtHeight(ctx, int64(height), time.Now())
|
||||
header, err := s.verifyLightBlockAtHeight(ctx, height, time.Now())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -140,15 +146,15 @@ func (s *stateProviderRPC) State(ctx context.Context, height uint64) (sm.State,
|
||||
//
|
||||
// We need to fetch the NextValidators from height+2 because if the application changed
|
||||
// the validator set at the snapshot height then this only takes effect at height+2.
|
||||
lastLightBlock, err := s.lc.VerifyLightBlockAtHeight(ctx, int64(height), time.Now())
|
||||
lastLightBlock, err := s.verifyLightBlockAtHeight(ctx, height, time.Now())
|
||||
if err != nil {
|
||||
return sm.State{}, err
|
||||
}
|
||||
currentLightBlock, err := s.lc.VerifyLightBlockAtHeight(ctx, int64(height+1), time.Now())
|
||||
currentLightBlock, err := s.verifyLightBlockAtHeight(ctx, height+1, time.Now())
|
||||
if err != nil {
|
||||
return sm.State{}, err
|
||||
}
|
||||
nextLightBlock, err := s.lc.VerifyLightBlockAtHeight(ctx, int64(height+2), time.Now())
|
||||
nextLightBlock, err := s.verifyLightBlockAtHeight(ctx, height+2, time.Now())
|
||||
if err != nil {
|
||||
return sm.State{}, err
|
||||
}
|
||||
@@ -233,13 +239,19 @@ func NewP2PStateProvider(
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *stateProviderP2P) verifyLightBlockAtHeight(ctx context.Context, height uint64, ts time.Time) (*types.LightBlock, error) {
|
||||
ctx, cancel := context.WithTimeout(ctx, 10*time.Second)
|
||||
defer cancel()
|
||||
return s.lc.VerifyLightBlockAtHeight(ctx, int64(height), ts)
|
||||
}
|
||||
|
||||
// AppHash implements StateProvider.
|
||||
func (s *stateProviderP2P) AppHash(ctx context.Context, height uint64) ([]byte, error) {
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
|
||||
// We have to fetch the next height, which contains the app hash for the previous height.
|
||||
header, err := s.lc.VerifyLightBlockAtHeight(ctx, int64(height+1), time.Now())
|
||||
header, err := s.verifyLightBlockAtHeight(ctx, height+1, time.Now())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -247,7 +259,7 @@ func (s *stateProviderP2P) AppHash(ctx context.Context, height uint64) ([]byte,
|
||||
// We also try to fetch the blocks at H+2, since we need these
|
||||
// when building the state while restoring the snapshot. This avoids the race
|
||||
// condition where we try to restore a snapshot before H+2 exists.
|
||||
_, err = s.lc.VerifyLightBlockAtHeight(ctx, int64(height+2), time.Now())
|
||||
_, err = s.verifyLightBlockAtHeight(ctx, height+2, time.Now())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -258,7 +270,7 @@ func (s *stateProviderP2P) AppHash(ctx context.Context, height uint64) ([]byte,
|
||||
func (s *stateProviderP2P) Commit(ctx context.Context, height uint64) (*types.Commit, error) {
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
header, err := s.lc.VerifyLightBlockAtHeight(ctx, int64(height), time.Now())
|
||||
header, err := s.verifyLightBlockAtHeight(ctx, height, time.Now())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -286,15 +298,15 @@ func (s *stateProviderP2P) State(ctx context.Context, height uint64) (sm.State,
|
||||
//
|
||||
// We need to fetch the NextValidators from height+2 because if the application changed
|
||||
// the validator set at the snapshot height then this only takes effect at height+2.
|
||||
lastLightBlock, err := s.lc.VerifyLightBlockAtHeight(ctx, int64(height), time.Now())
|
||||
lastLightBlock, err := s.verifyLightBlockAtHeight(ctx, height, time.Now())
|
||||
if err != nil {
|
||||
return sm.State{}, err
|
||||
}
|
||||
currentLightBlock, err := s.lc.VerifyLightBlockAtHeight(ctx, int64(height+1), time.Now())
|
||||
currentLightBlock, err := s.verifyLightBlockAtHeight(ctx, height+1, time.Now())
|
||||
if err != nil {
|
||||
return sm.State{}, err
|
||||
}
|
||||
nextLightBlock, err := s.lc.VerifyLightBlockAtHeight(ctx, int64(height+2), time.Now())
|
||||
nextLightBlock, err := s.verifyLightBlockAtHeight(ctx, height+2, time.Now())
|
||||
if err != nil {
|
||||
return sm.State{}, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user