Skip to content

Commit

Permalink
Start observing blockchain after unlock (#229)
Browse files Browse the repository at this point in the history
* Start bc listener when unlocking wallet

* Store mnemonic in config when creating new Vault

* Disable checks for race condition for e2e test

* Improve log message

* Lock wallet outside the closure to grant it's always locked

* fee deposit log message changed

Co-authored-by: Marco Argentieri <3596602+tiero@users.noreply.github.com>
  • Loading branch information
altafan and tiero authored Nov 25, 2020
1 parent 1c6b06d commit a7aa391
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 45 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -120,4 +120,4 @@ integrationtest:
export TDEX_LOG_LEVEL=5; \
export TDEX_BASE_ASSET=5ac9f65c0efcc4775e0baec4ec03abdde22473cd3cf33c0419ca290e0751b225; \
export TDEX_FEE_ACCOUNT_BALANCE_THRESHOLD=1000; \
go test -v -count=1 -race ./cmd/tdexd
go test -v -count=1 ./cmd/tdexd
20 changes: 10 additions & 10 deletions cmd/tdexd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,15 @@ func main() {
ErrorHandler: func(err error) { log.Warn(err) },
IntervalInMilliseconds: config.GetInt(config.CrawlIntervalKey),
})
blockchainListener := application.NewBlockchainListener(
unspentRepository,
marketRepository,
vaultRepository,
crawlerSvc,
explorerSvc,
dbManager,
)

traderSvc := application.NewTradeService(
marketRepository,
tradeRepository,
Expand All @@ -67,18 +76,9 @@ func main() {
unspentRepository,
crawlerSvc,
explorerSvc,
blockchainListener,
)

blockchainListener := application.NewBlockchainListener(
unspentRepository,
marketRepository,
vaultRepository,
crawlerSvc,
explorerSvc,
dbManager,
)
blockchainListener.ObserveBlockchain()

operatorSvc := application.NewOperatorService(
marketRepository,
vaultRepository,
Expand Down
15 changes: 11 additions & 4 deletions internal/core/application/blockchain_listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ type blockchainListener struct {
crawlerSvc crawler.Service
explorerSvc explorer.Service
dbManager ports.DbManager
started bool
// Loggers
feeDepositLogged bool
feeBalanceLowLogged bool
Expand Down Expand Up @@ -69,12 +70,18 @@ func newBlockchainListener(
}

func (b *blockchainListener) ObserveBlockchain() {
go b.crawlerSvc.Start()
go b.handleBlockChainEvents()
if !b.started {
go b.crawlerSvc.Start()
go b.handleBlockChainEvents()
b.started = true
}
}

func (b *blockchainListener) StopObserveBlockchain() {
b.crawlerSvc.Stop()
if b.started {
b.crawlerSvc.Stop()
b.started = false
}
}

func (b *blockchainListener) handleBlockChainEvents() {
Expand Down Expand Up @@ -150,7 +157,7 @@ func (b *blockchainListener) checkFeeAccountBalance(ctx context.Context, event c
b.feeDepositLogged = false
} else {
if !b.feeDepositLogged {
log.Info("fee account deposited, trades can be served")
log.Info("fee account funded. Trades can be served")
b.feeDepositLogged = true
}
b.feeBalanceLowLogged = false
Expand Down
24 changes: 10 additions & 14 deletions internal/core/application/test_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,21 @@ func newMockServices(
ErrorHandler: func(err error) { fmt.Println(err) },
IntervalInMilliseconds: 100,
})
blockchainListener := NewBlockchainListener(
unspentRepo,
marketRepo,
vaultRepo,
crawlerSvc,
explorerSvc,
dbManager,
)

walletSvc := newWalletService(
vaultRepo,
unspentRepo,
crawlerSvc,
explorerSvc,
blockchainListener,
)

if !vaultRepositoryIsEmpty {
Expand Down Expand Up @@ -136,17 +145,6 @@ func newMockServices(
}
}

blockchainListener := NewBlockchainListener(
unspentRepo,
marketRepo,
vaultRepo,
crawlerSvc,
explorerSvc,
dbManager,
)
// observe the blockchain
blockchainListener.ObserveBlockchain()

// create services to test
tradeSvc := newTradeService(
marketRepo,
Expand Down Expand Up @@ -220,7 +218,6 @@ func newTestWallet(w *mockedWallet) (*walletService, context.Context, func()) {
ErrorHandler: func(err error) { fmt.Println(err) },
IntervalInMilliseconds: 100,
})

blockchainListener := NewBlockchainListener(
unspentRepo,
marketRepo,
Expand All @@ -229,14 +226,13 @@ func newTestWallet(w *mockedWallet) (*walletService, context.Context, func()) {
explorerSvc,
dbManager,
)
// observe the blockchain
blockchainListener.ObserveBlockchain()

walletSvc := newWalletService(
vaultRepo,
unspentRepo,
crawlerSvc,
explorerSvc,
blockchainListener,
)

ctx := context.Background()
Expand Down
45 changes: 32 additions & 13 deletions internal/core/application/wallet_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,25 +57,28 @@ type WalletService interface {
}

type walletService struct {
vaultRepository domain.VaultRepository
unspentRepository domain.UnspentRepository
crawlerService crawler.Service
explorerService explorer.Service
walletInitialized bool
walletIsSyncing bool
vaultRepository domain.VaultRepository
unspentRepository domain.UnspentRepository
crawlerService crawler.Service
explorerService explorer.Service
blockchainListener BlockchainListener
walletInitialized bool
walletIsSyncing bool
}

func NewWalletService(
vaultRepository domain.VaultRepository,
unspentRepository domain.UnspentRepository,
crawlerService crawler.Service,
explorerService explorer.Service,
blockchainListener BlockchainListener,
) WalletService {
return newWalletService(
vaultRepository,
unspentRepository,
crawlerService,
explorerService,
blockchainListener,
)
}

Expand All @@ -84,12 +87,14 @@ func newWalletService(
unspentRepository domain.UnspentRepository,
crawlerService crawler.Service,
explorerService explorer.Service,
blockchainListener BlockchainListener,
) *walletService {
w := &walletService{
vaultRepository: vaultRepository,
unspentRepository: unspentRepository,
crawlerService: crawlerService,
explorerService: explorerService,
vaultRepository: vaultRepository,
unspentRepository: unspentRepository,
crawlerService: crawlerService,
explorerService: explorerService,
blockchainListener: blockchainListener,
}
// to understand if the service has an already initialized wallet we check
// if the inner vaultRepo is able to return a Vault without passing mnemonic
Expand Down Expand Up @@ -136,13 +141,22 @@ func (w *walletService) InitWallet(
return nil
}

// lock vault no regardless an error occurs or not
var vault *domain.Vault
defer func() {
if vault != nil {
vault.Lock()
}
}()
w.walletIsSyncing = true

err := w.vaultRepository.UpdateVault(
ctx,
mnemonic,
passphrase,
func(v *domain.Vault) (*domain.Vault, error) {
vault = v

log.Debug("start syncing wallet")
ww, err := wallet.NewWalletFromMnemonic(wallet.NewWalletFromMnemonicOpts{
SigningMnemonic: mnemonic,
Expand All @@ -167,7 +181,7 @@ func (w *walletService) InitWallet(
return nil, err
}
}
v.Lock()

w.walletInitialized = true
return v, nil
},
Expand All @@ -189,7 +203,7 @@ func (w *walletService) UnlockWallet(
return ErrWalletNotInitialized
}

return w.vaultRepository.UpdateVault(
if err := w.vaultRepository.UpdateVault(
ctx,
nil,
"",
Expand All @@ -199,7 +213,12 @@ func (w *walletService) UnlockWallet(
}
return v, nil
},
)
); err != nil {
return err
}

w.blockchainListener.ObserveBlockchain()
return nil
}

func (w *walletService) ChangePassword(
Expand Down
5 changes: 4 additions & 1 deletion internal/core/domain/vault_model.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"strings"

"github.com/btcsuite/btcutil"
"github.com/tdex-network/tdex-daemon/config"
"github.com/tdex-network/tdex-daemon/pkg/wallet"
)

Expand Down Expand Up @@ -50,14 +51,16 @@ func NewVault(mnemonic []string, passphrase string) (*Vault, error) {
return nil, err
}

strMnemonic := strings.Join(mnemonic, " ")
encryptedMnemonic, err := wallet.Encrypt(wallet.EncryptOpts{
PlainText: strings.Join(mnemonic, " "),
PlainText: strMnemonic,
Passphrase: passphrase,
})
if err != nil {
return nil, err
}

config.Set(config.MnemonicKey, strMnemonic)
return &Vault{
EncryptedMnemonic: encryptedMnemonic,
PassphraseHash: btcutil.Hash160([]byte(passphrase)),
Expand Down
3 changes: 1 addition & 2 deletions pkg/crawler/service.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package crawler

import (
"fmt"
"sync"
"time"

Expand Down Expand Up @@ -113,7 +112,7 @@ func (u *utxoCrawler) AddObservable(observable Observable) {
if !contains(u.observables, observable) {
obs, ok := observable.(*AddressObservable)
if ok {
log.Debug("Start observing new account: " + fmt.Sprint(obs.AccountIndex))
log.Debugf("new address for account %d added to watchlist", obs.AccountIndex)
}

u.observables = append([]Observable{observable}, u.observables...)
Expand Down

0 comments on commit a7aa391

Please sign in to comment.