【问题标题】:Get token amount from ETH address从 ETH 地址获取代币数量
【发布时间】:2018-08-08 23:27:46
【问题描述】:

我正在尝试在浏览器中获取 ETH 地址的令牌数量。我已经尝试过使用 web3.getBalance() 方法,但它只能获得 ETH 金额。

我需要获取 ETH 地址下的代币金额。比如这个地址有30多种token类型,我要获取具体一种的数量:https://etherscan.io/address/0xe853c56864a2ebe4576a807d26fdc4a0ada51919

我应该使用哪种方法,或者是否有可以获取该信息的 API?

【问题讨论】:

  • 您对除 javascript 之外的任何其他语言的解决方案感兴趣吗?
  • 我很想知道是否有其他语言的解决方案

标签: javascript ethereum web3js web3 cryptocurrency


【解决方案1】:

代币与 ETH 的不同之处在于它们作为状态保存在智能合约中,而不是直接与地址相关联。以太坊地址可以是合约或 EOA(外部拥有的账户)。这两种地址类型都可以持有 ETH。使用 web3.getBalance() 返回与地址关联的 ETH(同样,该地址可以是合约或 EOA)。

另一方面,代币作为状态的一部分保存在合约内部。通常,您会在合约本身中看到类似mapping(address => uint256) balance 的内容,它将存储特定代币的所有余额。

那么最终的结果是,如果你想知道一个特定地址跨多种代币类型的代币余额,你需要为你感兴趣的每个代币的合约地址调用合约的balanceOf方法。

【讨论】:

    【解决方案2】:

    查询特定代币的余额

    选择令牌

    这个地址有30多种token类型,我要获取具体的数量

    我将此解释为您已经知道要跟踪哪个令牌。

    获取令牌地址

    你知道令牌在哪个地址吗?如果没有,有几种方法可以找出答案:

    1. 从创建团队那里找到地址 - 注意诈骗/假推特帐户/等等
    2. 单击 Etherscan 下拉列表中的代币并从“ERC20 合约”字段中读取值。 (例如~对于 OmiseGo,合约地址为0xd26114cd6EE289AccF82350c8d8487fedB8A0C07
    3. 使用thetoken.eth 下的令牌符号通过ENS 查找地址,例如omg.thetoken.eth
    4. 询问其他受信任的第三方

    最可靠的方法是跨多个来源进行交叉检查。

    最有声望的团队将为他们的代币合约设置一个 ENS 名称,但不一定在 thetoken.eth 下。

    从合约中获取余额

    所以现在你有了代币合约的地址。让我们进一步假设它是ERC-20 compatible

    既然你说:

    我很想知道是否有其他语言的解决方案

    我将使用ethtoken.py* 作为最快的示例,然后深入了解它的工作原理:

    >>> from ethtoken import token
    
    # Use the ENS name that points to your token contract here:
    >>> omg = token("omg.thetoken.eth")
    
    >>> omg.token_balance("0xE853c56864A2ebe4576a807D26Fdc4A0adA51919")
    Decimal('246224.517546226920613329')
    

    * ethtoken.py 是我编写的一个小型开源包。

    ethtoken 是怎么做到的?

    1. 根据规范生成ERC20 ABI
    2. 使用来自Web3.py v4-betaomg = w3.eth.contract(address, abi) 创建合约
    3. 将合约对象包装在 ConciseContract 中以进行短合约调用
    4. 使用omg.balanceOf(address)获取代币余额
    5. 将余额的小数点向左移动这么多次:omg.decimals()

    列出“所有”标记

    正如亚当所提到的,代币余额存储在合约的分类账中,而不是您帐户中的状态。每个代币(通常)有一个合约,并且没有所有代币合约的完美清单。

    但是让我们假设一些令牌列表已经足够好了,比如MyEtherWallet's Big List-o-Tokens

    您可以遍历该列表中的令牌地址列表并应用相同的方法,获取每个地址的余额。

    【讨论】:

    • 哇,这个答案值得爱。谢谢@carver!
    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 2019-06-28
    • 2018-09-16
    • 2021-05-17
    • 2022-12-23
    • 2022-06-25
    • 1970-01-01
    • 2014-09-06
    相关资源
    最近更新 更多