diff --git a/client/blockbook/client.go b/client/blockbook/client.go index 70dbdcd..546ddf4 100644 --- a/client/blockbook/client.go +++ b/client/blockbook/client.go @@ -28,6 +28,8 @@ import ( "golang.org/x/net/proxy" ) +const maxInfightQueries = 25 + var Log = logging.MustGetLogger("client") type wsWatchdog struct { @@ -350,14 +352,19 @@ func (i *BlockBookClient) GetTransactions(addrs []btcutil.Address) ([]model.Tran Txs []model.Transaction Err error } - txChan := make(chan txsOrError) + var ( + txChan = make(chan txsOrError) + queryChan = make(chan struct{}, maxInfightQueries) + wg sync.WaitGroup + ) + wg.Add(len(addrs)) go func() { - var wg sync.WaitGroup - wg.Add(len(addrs)) for _, addr := range addrs { + queryChan <- struct{}{} go func(a btcutil.Address) { txs, err := i.getTransactions(maybeConvertCashAddress(a)) txChan <- txsOrError{txs, err} + <-queryChan wg.Done() }(addr) } @@ -439,13 +446,20 @@ func (i *BlockBookClient) GetUtxos(addrs []btcutil.Address) ([]model.Utxo, error Utxo *model.Utxo Err error } - utxoChan := make(chan utxoOrError) - var wg sync.WaitGroup + var ( + wg sync.WaitGroup + queryChan = make(chan struct{}, maxInfightQueries) + utxoChan = make(chan utxoOrError) + ) wg.Add(len(addrs)) go func() { for _, addr := range addrs { + queryChan <- struct{}{} go func(addr btcutil.Address) { defer wg.Done() + defer func() { + <-queryChan + }() resp, err := i.RequestFunc("/utxo/"+maybeConvertCashAddress(addr), http.MethodGet, nil, nil) if err != nil { utxoChan <- utxoOrError{nil, err} diff --git a/litecoin/address/address.go b/litecoin/address/address.go index b812075..2626667 100644 --- a/litecoin/address/address.go +++ b/litecoin/address/address.go @@ -160,26 +160,24 @@ func DecodeAddress(addr string, defaultNet *chaincfg.Params) (Address, error) { prefix := addr[:oneIndex+1] if IsBech32SegwitPrefix(prefix) { witnessVer, witnessProg, err := decodeSegWitAddress(addr) - if err != nil { - return nil, err - } - - // We currently only support P2WPKH and P2WSH, which is - // witness version 0. - if witnessVer != 0 { - return nil, UnsupportedWitnessVerError(witnessVer) - } - - // The HRP is everything before the found '1'. - hrp := prefix[:len(prefix)-1] - - switch len(witnessProg) { - case 20: - return newAddressWitnessPubKeyHash(hrp, witnessProg) - case 32: - return newAddressWitnessScriptHash(hrp, witnessProg) - default: - return nil, UnsupportedWitnessProgLenError(len(witnessProg)) + if err == nil { + // We currently only support P2WPKH and P2WSH, which is + // witness version 0. + if witnessVer != 0 { + return nil, UnsupportedWitnessVerError(witnessVer) + } + + // The HRP is everything before the found '1'. + hrp := prefix[:len(prefix)-1] + + switch len(witnessProg) { + case 20: + return newAddressWitnessPubKeyHash(hrp, witnessProg) + case 32: + return newAddressWitnessScriptHash(hrp, witnessProg) + default: + return nil, UnsupportedWitnessProgLenError(len(witnessProg)) + } } } }