Lazy wallet utxo sync after broadcasting a tx

This commit is contained in:
Ori Newman 2023-12-26 17:30:43 +02:00
parent 629faa8436
commit 524a654886
4 changed files with 35 additions and 28 deletions

View File

@ -54,11 +54,7 @@ func (s *server) broadcast(transactions [][]byte, isDomain bool) ([]string, erro
}
}
err = s.refreshUTXOs()
if err != nil {
return nil, err
}
s.forceSync()
return txIDs, nil
}

View File

@ -43,11 +43,6 @@ func (s *server) createUnsignedTransactions(address string, amount uint64, isSen
return nil, err
}
err = s.refreshUTXOs()
if err != nil {
return nil, err
}
var fromAddresses []*walletAddress
for _, from := range fromAddressesString {
fromAddress, exists := s.addressSet[from]

View File

@ -36,6 +36,7 @@ type server struct {
nextSyncStartIndex uint32
keysFile *keys.File
shutdown chan struct{}
forceSyncChan chan struct{}
addressSet walletAddressSet
txMassCalculator *txmass.Calculator
usedOutpoints map[externalapi.DomainOutpoint]time.Time
@ -91,6 +92,7 @@ func Start(params *dagconfig.Params, listen, rpcServer string, keysFilePath stri
nextSyncStartIndex: 0,
keysFile: keysFile,
shutdown: make(chan struct{}),
forceSyncChan: make(chan struct{}),
addressSet: make(walletAddressSet),
txMassCalculator: txmass.NewCalculator(params.MassPerTxByte, params.MassPerScriptPubKeyByte, params.MassPerSigOp),
usedOutpoints: map[externalapi.DomainOutpoint]time.Time{},
@ -100,8 +102,8 @@ func Start(params *dagconfig.Params, listen, rpcServer string, keysFilePath stri
}
log.Infof("Read, syncing the wallet...")
spawn("serverInstance.sync", func() {
err := serverInstance.sync()
spawn("serverInstance.syncLoop", func() {
err := serverInstance.syncLoop()
if err != nil {
printErrorAndExit(errors.Wrap(err, "error syncing the wallet"))
}

View File

@ -23,7 +23,7 @@ func (was walletAddressSet) strings() []string {
return addresses
}
func (s *server) sync() error {
func (s *server) syncLoop() error {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
@ -37,24 +37,34 @@ func (s *server) sync() error {
return err
}
for range ticker.C {
err = s.collectFarAddresses()
if err != nil {
return err
}
err = s.collectRecentAddresses()
if err != nil {
return err
}
err = s.refreshExistingUTXOsWithLock()
if err != nil {
return err
for {
select {
case <-ticker.C:
err := s.sync()
if err != nil {
return err
}
case <-s.forceSyncChan:
err := s.sync()
if err != nil {
return err
}
}
}
}
return nil
func (s *server) sync() error {
err := s.collectFarAddresses()
if err != nil {
return err
}
err = s.collectRecentAddresses()
if err != nil {
return err
}
return s.refreshExistingUTXOsWithLock()
}
const (
@ -280,6 +290,10 @@ func (s *server) refreshUTXOs() error {
return s.updateUTXOSet(getUTXOsByAddressesResponse.Entries, mempoolEntriesByAddresses.Entries)
}
func (s *server) forceSync() {
s.forceSyncChan <- struct{}{}
}
func (s *server) isSynced() bool {
return s.nextSyncStartIndex > s.maxUsedIndex()
}