@@ -162,6 +162,7 @@ type Wallet struct {
162
162
rescanFinished chan * RescanFinishedMsg
163
163
rescanLock sync.Mutex
164
164
RescanStartStamp * waddrmgr.BlockStamp
165
+ RollbackFromStamp * waddrmgr.BlockStamp
165
166
166
167
// Channel for transaction creation requests.
167
168
createTxRequests chan createTxRequest
@@ -507,28 +508,34 @@ func (w *Wallet) syncWithChain(birthdayStamp *waddrmgr.BlockStamp) error {
507
508
addrmgrNs := tx .ReadWriteBucket (waddrmgrNamespaceKey )
508
509
txmgrNs := tx .ReadWriteBucket (wtxmgrNamespaceKey )
509
510
510
- for height := rollbackStamp .Height ; true ; height -- {
511
- hash , err := w .Manager .BlockHash (addrmgrNs , height )
512
- if err != nil {
513
- return err
514
- }
515
- chainHash , err := chainClient .GetBlockHash (int64 (height ))
516
- if err != nil {
517
- return err
518
- }
519
- header , err := chainClient .GetBlockHeader (chainHash )
520
- if err != nil {
521
- return err
522
- }
511
+ // NB: if the rollback specified in config we will do rollback from here
512
+ if w .RollbackFromStamp != nil {
513
+ rollbackStamp = * w .RollbackFromStamp
514
+ rollback = true
515
+ } else {
516
+ for height := rollbackStamp .Height ; true ; height -- {
517
+ hash , err := w .Manager .BlockHash (addrmgrNs , height )
518
+ if err != nil {
519
+ return err
520
+ }
521
+ chainHash , err := chainClient .GetBlockHash (int64 (height ))
522
+ if err != nil {
523
+ return err
524
+ }
525
+ header , err := chainClient .GetBlockHeader (chainHash )
526
+ if err != nil {
527
+ return err
528
+ }
523
529
524
- rollbackStamp .Hash = * chainHash
525
- rollbackStamp .Height = height
526
- rollbackStamp .Timestamp = header .Timestamp
530
+ rollbackStamp .Hash = * chainHash
531
+ rollbackStamp .Height = height
532
+ rollbackStamp .Timestamp = header .Timestamp
527
533
528
- if bytes .Equal (hash [:], chainHash [:]) {
529
- break
534
+ if bytes .Equal (hash [:], chainHash [:]) {
535
+ break
536
+ }
537
+ rollback = true
530
538
}
531
- rollback = true
532
539
}
533
540
534
541
// If a rollback did not happen, we can proceed safely.
0 commit comments