ERC20 代币余额如何存储在以太坊区块链上

Posted

技术标签:

【中文标题】ERC20 代币余额如何存储在以太坊区块链上【英文标题】:How ERC20 Token Balances are stored on the Ethereum blockchain 【发布时间】:2018-09-10 00:16:56 【问题描述】:

我真的很困惑 ERC20 代币余额是如何存储在链上的。似乎所有余额数据都存储为成员映射变量:

contract TestCoin is ERC20Interface 
    ...
    mapping(address => uint) balances;
    ...

我想知道区块链上存储了多少副本。假设 balances 包含 10K 条记录,最高区块号为 100。现在我进行代币转移,balances 中的 2 条记录发生了变化,我们得到了新的 balances,此转移由新的区块 101 确认。

 <------- [Block 100] <------- [Block 101]
              ^                    ^
              |                    |
           balance1             balance2

余额存储在哪里?是否可以检索块 100 中的余额? (我想我们一定能做到,因为区块链可以回滚)。

我正在使用 geth/web3/eth,如果您能将我引导到相关文档页面,那就太好了。

非常感谢!

【问题讨论】:

【参考方案1】:

以太坊区块链具有“状态”的概念,其中每个合约(和地址)都有一个状态,每个区块都会创建到该状态的增量(更改)。要获得当前余额,您必须扫描整个区块链。

因此,如果我向您发送 50 以太币,包含此交易的区块将有效地导致我的账户中出现 -50 以太币和您的账户中的 50 以太币。

同样适用于您在此处显示的映射。映射仅包含相关地址(涉及的地址),以及当相关交易发生时,在每个区块中向这些地址发送代币时这些地址中的增量。

这就是以太坊使用的“会计模型”和比特币使用的 UTXO 模型之间的区别。

【讨论】:

感谢您的回答。我了解 ETH 的工作原理。这里我说的是 ERC20 代币,它将整个账户/余额作为映射存储在智能合约中。

以上是关于ERC20 代币余额如何存储在以太坊区块链上的主要内容,如果未能解决你的问题,请参考以下文章

如何从以太坊地址获取 ERC20、ERC721 和 ERC827 代币列表

第三方可以向以太坊区块链发送 ERC20 代币交易吗?

以太坊私链部署erc20_usdt代币

ERC20代币标准初识

获取以太坊 ERC-20 代币信息的正确方法

以太坊ERC20代币开发