我怎样才能使这个 web3 python 脚本更快?

How can i make this web3 python script faster?

我想制作一个 python 脚本(用于 BSC)来跟踪钱包中特定代币的余额。我需要 python 脚本非常快。目前使用以下代码,脚本需要大约 6 秒的时间来检测进入钱包的代币。有没有更快、更有效的方法呢? (我添加了 sleep func 来充当某种缓冲区。不知道这是否是个好主意?) 编辑:删除了睡眠功能,但仍然需要 6 秒。

from web3 import Web3
import json

bsc = "https://bsc-dataseed.binance.org/"
web3 = Web3(Web3.HTTPProvider(bsc))
print(web3.isConnected())

main_address = "wallet to be tracked"
contract_address = "token contract address"
abi = json.loads('the abi')

contract = web3.eth.contract(address=contract_address, abi = abi)

balanceOfToken = contract.functions.balanceOf(main_address).call()
print(web3.fromWei(balanceOfToken, 'ether'))

while(True):
    balanceOfToken = contract.functions.balanceOf(main_address).call()
    if(balanceOfToken > web3.fromWei(0.5, 'ether')):
        break
    
    time.sleep(1.1)
    x+=1
    print(f"Still looking {x}")
    continue

second_address = "the other wallet address"
main_key = "private key of first wallet"

nonce = web3.eth.getTransactionCount(main_address)

token_tx = contract.functions.transfer(second_address, balanceOfToken).buildTransaction({
    'chainId':56, 'gas': 90000, 'gasPrice': web3.toWei('5', 'gwei'), 'nonce':nonce
})

signed_tx = web3.eth.account.signTransaction(token_tx, main_key)
web3.eth.sendRawTransaction(signed_tx.rawTransaction)

print(contract.functions.balanceOf(my_address).call() + " " + contract.functions.name().call())

您可以通过 运行 本地以太坊节点使其更快。因此,您拥有 100% 的以太坊节点服务器容量,并且没有网络延迟。 More information here.

回答您的问题的关键是:什么需要 6 秒?

  1. 运行从头到尾的代码?

如果我 运行 我的笔记本电脑上的代码 - 使用相同的节点 - 代码在 0.45-0.55 秒内执行。所以也许不是代码本身,而是你与节点的连接正在减慢调用或广播事务?如果是这样,也许尝试另一个节点会加快执行速度。参见 Binance's docs for alternatives or check a 3rd party provider.

不太可能,但也可能是您的笔记本电脑缺乏可用的处理能力 (?)

  1. 启动代码直到交易出现在区块中?

代码取c。 0.5 至 运行。在 BSC 上加上 3 秒的目标区块时间,你已经在 3.5 秒了,假设区块中有 space(/你的费用足以包含在内)并假设它被广播并立即被接收。我不确定下限应该是多少,但这需要几秒钟。

PS。正如 – @Mikko Ohtamaa - 21 年 8 月 17 日在 5:07 所提到的,“您可以订阅所有新块并自己过滤掉块中的事件。(..)”为此,您可以看看 web3py 中的 filtering