2

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

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

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

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

4

3 回答 3

1

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

你的钱包只是从已知的代币合约中用你的地址调用这个函数。由于它是一个视图功能,它不需要任何气体。

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

于 2018-04-03T12:42:59.777 回答
0

它怎么还能存储 0x1 拥有 ERC20 代币的事实呢?

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

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

于 2021-06-07T19:04:57.900 回答
0

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

  • tx.origin
  • msg.sender

在您的示例中,在里面的方法中ERC20 Token.sol,值tx.origin将是0x1并且msg.sender将是0x2

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

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

有关更多信息,请参阅“msg.sender”和“tx.origin”有什么区别?

于 2018-03-28T12:16:01.683 回答