[wallet] Avoid some unnecessary RPC requests
- avoid making RPC request for `zero - zero` range - avoid checking of nonce for a lower block in the range if it is zero in a higher block - on `wallet_getTransfersByAddress` scanning of history is skipped if zero block is already reached - no need to fetch block num before fetching token balances
This commit is contained in:
parent
2c0383ec22
commit
363ab0a2ab
|
@ -50,7 +50,8 @@ func (api *API) GetTransfersByAddress(ctx context.Context, address common.Addres
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if block == nil {
|
// if zero block was already checked there is nothing to find more
|
||||||
|
if block == nil || big.NewInt(0).Cmp(block) == 0 {
|
||||||
return castToTransferViews(rst), nil
|
return castToTransferViews(rst), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,13 +24,6 @@ func GetTokensBalances(parent context.Context, client *ethclient.Client, account
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
response = map[common.Address]map[common.Address]*hexutil.Big{}
|
response = map[common.Address]map[common.Address]*hexutil.Big{}
|
||||||
)
|
)
|
||||||
// requested current head to request balance on the same block number
|
|
||||||
ctx, cancel := context.WithTimeout(parent, requestTimeout)
|
|
||||||
header, err := client.HeaderByNumber(ctx, nil)
|
|
||||||
cancel()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, token := range tokens {
|
for _, token := range tokens {
|
||||||
caller, err := ierc20.NewIERC20Caller(token, client)
|
caller, err := ierc20.NewIERC20Caller(token, client)
|
||||||
token := token
|
token := token
|
||||||
|
@ -43,7 +36,6 @@ func GetTokensBalances(parent context.Context, client *ethclient.Client, account
|
||||||
group.Add(func(parent context.Context) error {
|
group.Add(func(parent context.Context) error {
|
||||||
ctx, cancel := context.WithTimeout(parent, requestTimeout)
|
ctx, cancel := context.WithTimeout(parent, requestTimeout)
|
||||||
balance, err := caller.BalanceOf(&bind.CallOpts{
|
balance, err := caller.BalanceOf(&bind.CallOpts{
|
||||||
BlockNumber: header.Number,
|
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
}, account)
|
}, account)
|
||||||
cancel()
|
cancel()
|
||||||
|
|
|
@ -41,7 +41,7 @@ func (c *ethHistoricalCommand) Command() Command {
|
||||||
func (c *ethHistoricalCommand) Run(ctx context.Context) (err error) {
|
func (c *ethHistoricalCommand) Run(ctx context.Context) (err error) {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
totalRequests, cacheHits := c.balanceCache.getStats(c.address)
|
totalRequests, cacheHits := c.balanceCache.getStats(c.address)
|
||||||
log.Info("balance cache before checking range", "total", totalRequests, "cached", totalRequests-cacheHits)
|
log.Info("balance cache before checking range", "total", totalRequests, "cached", totalRequests-cacheHits, "from", c.from, "to", c.to)
|
||||||
from, headers, err := findBlocksWithEthTransfers(ctx, c.client, c.balanceCache, c.eth, c.address, c.from, c.to, c.noLimit)
|
from, headers, err := findBlocksWithEthTransfers(ctx, c.client, c.balanceCache, c.eth, c.address, c.from, c.to, c.noLimit)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -648,6 +648,10 @@ func findFirstRange(c context.Context, account common.Address, initialTo *big.In
|
||||||
to := initialTo
|
to := initialTo
|
||||||
goal := uint64(20)
|
goal := uint64(20)
|
||||||
|
|
||||||
|
if from.Cmp(to) == 0 {
|
||||||
|
return to, nil
|
||||||
|
}
|
||||||
|
|
||||||
firstNonce, err := client.NonceAt(c, account, to)
|
firstNonce, err := client.NonceAt(c, account, to)
|
||||||
log.Info("find range with 20 <= len(tx) <= 25", "account", account, "firstNonce", firstNonce, "from", from, "to", to)
|
log.Info("find range with 20 <= len(tx) <= 25", "account", account, "firstNonce", firstNonce, "from", from, "to", to)
|
||||||
|
|
||||||
|
|
|
@ -111,11 +111,17 @@ func checkRanges(parent context.Context, client reactorClient, cache BalanceCach
|
||||||
if lb.Cmp(hb) == 0 {
|
if lb.Cmp(hb) == 0 {
|
||||||
log.Debug("balances are equal", "from", from, "to", to)
|
log.Debug("balances are equal", "from", from, "to", to)
|
||||||
|
|
||||||
ln, err := client.NonceAt(ctx, account, from)
|
hn, err := client.NonceAt(ctx, account, to)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
hn, err := client.NonceAt(ctx, account, to)
|
// if nonce is zero in a newer block then there is no need to check an older one
|
||||||
|
if hn == 0 {
|
||||||
|
log.Debug("zero nonce", "to", to)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ln, err := client.NonceAt(ctx, account, from)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue