JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

代币与标准(ERC-20、ERC-721)

代币不是放在金库里的一枚硬币——它只是某个合约维护的一张表里的一行记录。来看看 ERC-20 与 ERC-721 如何把这个朴素的想法,变成全世界每个钱包都能读懂的东西。

代币不过是一份记账的合约

想象墙上挂着一本共享的笔记本,人人都能看,却只有一套规则能改写。本子有两列:多少。爱丽丝有 50,鲍勃有 12,其余都是零。要把 10 从爱丽丝「转」给鲍勃,没人递出任何实物——规则只是划掉爱丽丝的 50,写上 40,再把鲍勃加到 22。这本笔记本*就是*那枚代币。哪儿都没有硬币;有的只是余额账本,以及更新它的那套规则。

以太坊上,这种「笔记本加规则」恰恰就是一份智能合约:代码和存储,住在同一个地址上。因此一枚代币并不是链的内建功能——它只是一份恰好在记账的普通合约。任何人都能在一个下午里部署一个。链本身甚至不知道它是「代币」;它只看到一份合约,其存储把一些地址映射到一些数字。

ERC-20:当每一单位都可互换

你常听说的大多数代币都是同质化的:每一单位都完全相同、可以互换,就像美元或一粒粒米。你的 10 单位,和别人的 10 单位价值完全一样——没有哪个单位「特别」。它们的标准是 ERC-20,其核心就是那张两列账本:一个从每个地址到单一数字(也就是余额)的映射。

下面是一个精简版,用以太坊的主力合约语言 Solidity 写成。请留意,这里没有任何魔法——只有一张余额表,和一条 `transfer` 规则:从发送方扣减,给接收方增加。

// a minimal fungible token (ERC-20 idea)
mapping(address => uint256) public balanceOf;

function transfer(address to, uint256 amount) public {
    require(balanceOf[msg.sender] >= amount, "too poor");
    balanceOf[msg.sender] -= amount;   // debit sender
    balanceOf[to]         += amount;   // credit receiver
    emit Transfer(msg.sender, to, amount);
}
整枚代币,就是一张余额表,外加一条在行与行之间挪动数字的规则。

ERC-20 还定义了一对 approve / transferFrom:你可以授权另一份合约,代你挪动一笔约定额度——这正是在 DeFi 交易所里完成兑换的机制。你只需对交易所授权一次,之后你交易时,它便按约定额度把币取走。

ERC-721:当每一件都独一无二

有些东西不能互换。某趟航班上的 14C 座位、某栋房子的房契、一张编号的演唱会门票——把你的换成别人的,会改变你手里握着的*具体*是哪一件。这些是非同质化的,其标准是 ERC-721。关键的改动微小却深刻:它不再把地址映射到*多少*,而是把唯一的代币编号(token id) 映射到*归谁所有*。

// fungible (ERC-20):  address -> amount
  balanceOf[alice] = 40       // 40 identical units

// non-fungible (ERC-721): tokenId -> owner
  ownerOf[1] = alice          // she holds item #1
  ownerOf[2] = bob            // he holds item #2
  ownerOf[3] = alice          // and item #3, a different thing

// transfer just reassigns one id's owner:
  ownerOf[1] = bob            // item #1 is now bob's
同样的笔记本思路,翻转一下:记录每个编号物品归谁,而非每个人有几单位。

每个编号都能指向自己的图片、歌曲或文件,所以一份 ERC-721 合约就是一份各不相同的收藏品登记册。这正是 NFT 背后的机器——但同样的模式也能为一块地确权、签发一张会员通行证,或登记一把游戏里的剑。无论是否同质化,这两种标准做的都是*同一件*基本工作:让一份合约诚实、公开地记录谁持有什么。

为什么标准才是真正的魔法

如果代币只是一份合约,那么人人都能自创函数名——`send`、`give`、`move`、`yeet`。这样一来,钱包就得为有史以来的每一种代币都写一套专门代码,根本做不到。代币标准通过事先约定好确切的接口来解决这个问题:函数的名字、它们的输入,以及它们发出的事件。ERC-20 承诺提供 `transfer`、`balanceOf`、`approve`;ERC-721 承诺提供 `ownerOf`、`safeTransferFrom`,等等。

可以把它想成电源插头的形状。你不需要知道一盏灯是谁造的;只要它带着标准插头,就能插进插座。正因为成千上万的代币都对外露出*同一种* ERC-20 形状,一个钱包就能显示它们当中的每一个,一家交易所也能在某个全新代币上线当天就把它挂牌——无需任何专门对接。

所以,要带走的心智模型很简单:代币是一份在记账的合约,ERC-20 用于可互换的单位,ERC-721 用于独一无二的物品,而共享的标准接口,就是那条让网络上每个应用都能与它对话的无声约定。有了这块基石,后面的指南就能展示这些代币*能做什么*——汇聚成市场、治理组织,并在整个以太坊经济中流转价值。