簡體   English   中英

如何檢查或知道錢包在 web3 python 中有代幣

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM