[client.keyset] added 'Rescue()' method to keyset
This commit is contained in:
parent
3b282e397b
commit
d759e85735
|
@ -206,3 +206,45 @@ func (s T) MigrationCode(optional... uint8) uint8 {
|
|||
return s.mcode
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (7) Updates depth for rescuing from desynchroisation
|
||||
*
|
||||
* @lastHash<[]byte> Last received hash
|
||||
*
|
||||
* @return error<err> Error or NIL if not
|
||||
*
|
||||
* @description We must update @depth so the next sent hash h_depth(k)
|
||||
* hashed MIN times equals the received hash @lastHash
|
||||
* We must find depth = i-MIN+1
|
||||
* with i so that h_MIN( h_i(k) ) = lastHash
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
func (s *T) Rescue(lastHash []byte) error {
|
||||
|
||||
/* (1) Browse possible values
|
||||
---------------------------------------------------------*/
|
||||
for i := s.depth ; i <= s.depth+s.ctx.MinDepth() ; i++ {
|
||||
|
||||
/* (1) Process hash */
|
||||
currentHash, err := s.Hash();
|
||||
if err != nil { return err }
|
||||
|
||||
/* (2) If not found -> try again */
|
||||
if string(currentHash) != string(lastHash) { continue }
|
||||
|
||||
/* (3) Store new depth */
|
||||
s.depth = i - s.ctx.MinDepth() + 1
|
||||
|
||||
/* (4) Update migration code */
|
||||
s.mcode = 2
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
return errors.New("Cannot find an available rescue depth");
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue