繁体   English   中英

用户帐户如何拥有 ERC20 令牌

[英]How does a User account own an ERC20 Token

这个问题有点概念性,所以希望这张图片能帮助消除我的误解。 在此处输入图像描述

图片在地址 0x2 上部署了一个众筹智能合约。 地址为 0x01 的用户购买了代币。 这是我对发生的事情的理解:

  1. 众筹合同(@地址:0x2)接受来自用户账户(@地址:0x1)的以太币
  2. 众筹合约将 0x1 存储为已购买代币(重要:此信息存储在智能合约@address 0x2 中)

现在我的问题是:如果 0x1 是用户帐户(而不是智能合约),则地址 0x1 处没有代码。 我以为一个用户帐户只包含一个地址 + 与该地址相关联的以太币,它怎么还可以存储 0x1 拥有 ERC20 令牌的事实呢? 例如,我可以登录到 MetaMask 并且(在单击“添加令牌”选项之前)MetaMask 可以看到我有一个令牌……这怎么可能?

每个 ERC20 合约都具有以下功能:
function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; }

您的钱包只需使用您的地址从已知的代币合约中调用此函数。 因为它是一个视图函数,所以它不消耗任何 gas。

我发现大多数 ERC20 代币会很快添加到 Metamask 或 MEW 等钱包中。 但是如果你的余额没有自动显示,你可以手动添加合约地址(至少在 MEW 中,不确定 Metamask),它会在之后显示。

在 Solidity 中,有两种方法可以获取发送交易的人的地址

  • tx.origin
  • msg.sender

在您的示例中,在ERC20 Token.sol内的方法中,值tx.origin将为0x1 ,而msg.sender将为0x2

因此,要回答您的问题,ERC20 代币如何知道0x2是:这取决于代币合约的编写方式以及它使用的是tx.origin还是msg.sender 我想它会使用msg.sender ,因为这是更普遍的一种。

如果它确实使用msg.sender ,您仍然可以通过首先购买代币然后立即将代币从众筹合同转移给调用者来使众筹合同生效。

有关详细信息,请参阅“msg.sender”和“tx.origin”之间有什么区别?

它如何存储 0x1 拥有 ERC20 令牌这一事实?

代币转移,或一般会计中的转移,都保存在账本中。 在这种情况下,分类账是 ERC-20 智能合约,它在内部保持余额谁拥有以及balances映射中的内容。 或者,智能合约管理保存所有权记录的存储(EVM SSTORE指令)。

请注意,其他一些区块链,如 Telos 和 EOS(以及 mayne Solana)可能是相反的,并且存储在用户帐户上维护(用户帐户具有关联的 RAM 和用户拥有的任何令牌的表)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM