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 代币余额如何存储在以太坊区块链上的主要内容,如果未能解决你的问题,请参考以下文章