关于ERC-20令牌的问题



我知道它们是什么,但我不太了解它们如何在区块链上表达、记录和发送的原始基础。

如果令牌只是智能合约,那么你究竟如何发送它们?这些代币交易是如何被记录在区块链上的?从智能合约中创建代币的基本原理是什么?

一个地址的令牌余额记录在令牌合约上。令牌合约被认为是满足ERC-20标准要求的所有标准的合约,例如实现指定的接口并在标准要求时发出事件。

余额主要以映射的形式存储,其中键是持有者地址,值是他们拥有的令牌数量,因为这在大多数情况下都很方便。但是,该标准没有指定特定的方式,因此,如果适合您的需要,您可以将余额存储在数组中,或任何其他方式。

令牌传输是与令牌合约transfer()函数(在ERC-20中标准化)的交互,该函数应该执行验证(为了简单起见,我的示例跳过了它),更新存储余额的本地变量,并发出(再次标准化)Transfer事件。

链下应用程序,如Etherscan,可以监听这些事件并更新自己的令牌持有者数据库。这允许他们通过自己的数据库中的地址过滤所有令牌,并在网站上显示它们。但同样,这不是区块链数据的一部分,它是建立在区块链之上的聚合数据库。

例子:地址0x123拥有1个USDT和2个DAI。USDT余额存储在USDT合约中,DAI余额存储在DAI合约中。没有0x123地址的全局属性来跟踪它的令牌。

contract USDT {
// for the key `0x123`, the value is 1 (and decimals)
mapping (address => uint256) balances;
event Transfer(address indexed from, address indexed to, uint256 amount);
function transfer(address to, uint256 amount) public {
balances[msg.sender] -= amount;
balances[to] += amount;
emit Transfer(msg.sender, to, amount);
}
}
contract DAI {
// for the key `0x123`, the value is 2 (and decimals)
mapping (address => uint256) balances;
}

完整的代码示例,请参阅OpenZeppelin实现,以及与此特定实现相关的文档。只是澄清一下,OpenZeppelin是一个发布开源代码的组织,但是如果适合您的用例,您也可以构建自己的标准实现或使用另一个标准。