1

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

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

我想知道区块链上存储了多少副本。假设balances包含 10K 条记录,最高区块号为 100。现在我进行了一次代币转账,其中 2 条记录在balanceschanged 中,我们得到了一个新的balances,并且此转账由一个新的区块 101 确认。

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

余额存放在哪里?是否可以检索块 100 中的余额?(我想我们必须能够这样做,因为区块链可以回滚)。

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

非常感激!

4

1 回答 1

0

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

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

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

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

于 2018-03-31T19:24:29.563 回答