[英]How to check or know that a wallet has tokens in web3 python
如果某個 bsc 地址有令牌或交易,我試圖找出是否有可能知道或檢查 python web3。
我可以使用nonce = web3.eth.getTransactionCount(address)
檢查地址是否有 bnb 或 bsc 交易,但我想知道某個地址是否有除 bnb 或 bsc 之外的令牌。
例如,這個地址0x7DBbA1e788b169139F5602CCb734137F45a59aa9
有代幣但沒有 bnb 或 bsc 交易。
從最廣泛的意義上說,在計算上很難檢查地址是否具有任意標記。 即使我們只限於 ERC-20(或 BEP-20,或類似的)代幣,它仍然很棘手。
為什么? ERC-20(和類似代幣)的實現方式意味着代幣余額存儲在代幣的地址中,而不是包含代幣的地址。 例如,ECR20 的 OpenZeppelin 實現有這個變量用於存儲余額:
mapping(address => uint256) private _balances;
如果您知道代幣的地址,則查找具有該代幣的所有地址在計算上是有效的,但不可能有效地搜索其余額中包含特定地址的所有代幣。
另一方面,如果您知道令牌的地址,則只需調用令牌的balanceOf
函數,將目標帳戶地址作為參數即可:
uint256 userBalance = IERC20(tokenAddress).balanceOf(account);
據我了解,像 Etherscan 這樣的公共服務通常會保留 ERC20 和類似代幣的列表,並通過這些列表顯示地址中“所有”代幣的余額。 例如,BscScan 有一個 BSC 上實現 BEP-20 接口的所有智能合約的索引列表(根據網站,有 2,450,333 個代幣合約)。 以某種方式獲取整個列表並通過它是一種選擇。 僅查看一組更有限的“頂級”令牌是另一回事。
請參閱此示例 PY 代碼。 我不記得它是否正常工作。
import json
from web3 import Web3, HTTPProvider
# truffle development blockchain address
blockchain_address = 'http//:127.0.0.1:7545'
#client instance to interact with the blockchain
web3 = Web3(HTTPProvider(blockchain_address))
compiled_contract_path = 'build/contracts/FirstContract.json'
deployed_contract_address = '0x'
with open(compiled_contract_path) as file:
contract_json = json.load(file) #load contract info as JSON
contract_abi = contract_json['abi']
contract = web3.eth.contract(address=deployed_contract_address, abi=contract_abi)
result = contract.functions.setValue(10).transact() #use transact to store value in blockchain
print(result)
print(result.hex())
message = contract.functions.getValue().call()
print(message)
abi = '[]'
見行:
message = contract.functions.getValue().call()
message變量從 PY getValue() function 接收信息。 您可以實現 erc20 balanceOf ABI,並在代幣合約中直接調用此 function。
至於 BSCscan 和 Etherscan 顯示余額的方式,它們不會查詢代幣合約的 balanceOf。 他們只需提取 Emit Transfer 事件歷史並進行發送和接收計算以顯示余額。 這是一種費力、奇怪且不平凡的方式,我不知道他們為什么更喜歡這樣工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.