用户帐户如何拥有ERC20令牌

时间:2018-03-26 19:33:40

标签: ethereum solidity smartcontracts open-zeppelin

这个问题有点概念化,所以希望这张图片能够帮助我解决我的误解。enter image description here

图片在地址0x2上部署了众包智能合约。地址为0x01的用户购买令牌。 以下是我对发生的事情的理解:

  1. 众筹合约(@ address:0x2)接受来自用户帐户的以太网(@ address:0x1)
  2. 众筹合约将0x1存储为购买令牌(重要:此信息存储在智能合约@address 0x2中)
  3. 现在我的问题:如果0x1是用户帐户(而不是智能合约),则地址0x1处没有代码。我认为用户帐户只包含与地址相关联的地址+以太网,它如何存储0x1拥有ERC20令牌的事实?例如,我可以登录MetaMask并(在点击“添加令牌”选项之前)MetaMask可以看到我有一个令牌......这怎么可能?

3 个答案:

答案 0 :(得分:0)

在可靠性方面,有两种方法可以获取发送交易的人的地址

  • tx.origin
  • msg.sender

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

为了回答您的问题,ERC20令牌如何了解0x2:它取决于令牌合同的编写方式以及是否使用tx.originmsg.sender。我想它会使用msg.sender,因为那是更普遍的。

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

有关详细信息,请参阅What's the difference between 'msg.sender' and 'tx.origin'?

答案 1 :(得分:0)

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

您的钱包只是使用您的地址从已知令牌合同中调用此功能。由于它具有视图功能,因此不会产生任何气体成本。

我将大部分ERC20令牌重新加入到Metamask或MEW等钱包中。但如果您的余额没有自动显示,您可以手动添加合约地址(至少在MEW中,不确定Metamask),之后会显示。

答案 2 :(得分:0)

<块引用>

它还如何存储 0x1 拥有 ERC20 代币的事实?

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

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