想象你走进一家数码城,想买一个移动硬盘。货架上琳琅满目:希捷、西部数据、三星……但无论你选哪一款,只要它是USB接口,插到任何电脑上都能立刻读出来。你不需要为每个品牌定制一根专属数据线,也不需要担心换了电脑就认不出硬盘。这种“即插即用”的便利,靠的不是某一个硬盘厂商的良心,而是背后一套被所有人共同遵守的接口标准——USB标准。 以太坊世界也在上演同样的故事。链上有成千上万种“数字资产”:有的用来投票,有的代表游戏道具,有的是一张数字艺术品的“房产证”。如果每个项目都自创一套转账规则,那钱包、交易所、借贷协议就得为每一种资产单独开发一套对接系统——那将是灾难。ERC标准(Ethereum Request for Comments,以太坊征求意见稿)就是区块链世界的“USB接口协议”。它规定了代币之间彼此识别、转账、查询余额的统一语言,让钱包像电脑读取U盘一样,轻松读取任何符合标准的代币资产。本文将带你从ERC-20这个“标准USB口”出发,走过ERC-721这个“每把钥匙都独一无二”的防伪身份证,最后抵达ERC-1155这个“一头插U盘、一头插HDMI”的万能转接头,完整理解以太坊资产标准的设计智慧。
对AI从业者的价值:ERC标准是你与链上资产交互的“通用语言”。掌握它,你就能设计出能被钱包、交易所、DeFi协议自动识别的资产,让你的AI应用轻松接入加密经济网络。
可视化演示
展示ERC-20同质化代币、ERC-721非同质化NFT与ERC-1155多代币标准的接口方法、转移流程与互操作性对比。
本节配有交互动效(进入视口后自动加载,约 3KB)。
三大代币标准对比 ERC-20:同质化代币,每个代币等价可互换,适合货币/积分场景 ERC-721:非同质化代币(NFT),每个代币唯一不可替换,适合收藏品/资产 ERC-20: balanceOf(addr) -> uint, ERC-721: ownerOf(tokenId) -> addr
标准诞生背景
回到数码城的场景。如果USB标准从未诞生,希捷会做自家接口,西部数据用另一套接口,三星再发明第三种——那么你的书桌上将堆满各种专用数据线,每买一个新硬盘就要重新布线。更糟糕的是,这些接口互不兼容,数据无法在不同设备之间自由流动。区块链世界早期正是如此:2015年前后,每个项目方都自己定义代币的转账函数,A项目的代币在B项目的钱包里根本无法识别,“数字资产”沦为了一个个孤岛。
ERC标准是社会契约式的一次“行业自救”。开发者通过EIP(以太坊改进提案)流程提交协议草案,社区讨论、测试、达成共识后,新的ERC标准被正式采纳。这个过程不靠行政命令,而靠“大家都用才能都受益”的博弈逻辑——类似USB-IF组织制定USB规范时,各厂商参与讨论、共享利益。2015年,ERC-20标准率先落地,它定义了6个核心函数和2个事件,相当于规定了一个“标准USB口的物理尺寸和引脚定义”。
ERC-20的核心贡献在于,它把“一个代币是什么”抽象为一张数学上可操作的总账。从根本上看,区块链上的代币状态本质上是一个映射函数,它将每个地址映射到一个账户余额:
这就是标准的力量:它规定了你必须查哪张表(函数名)、表的格式是什么(参数和返回值)。至于表背后是数据库还是纸本账——合约内部用什么存储技巧——完全自由。正如USB标准只规定接口形状,不关心硬盘内部是机械盘还是固态盘。ERC-20为整个区块链资产生态打下的地基,至今仍是无数DeFi协议互操作的基石。
- 定义域——地址集合
\text{Address}代表以太坊上的账户地址,类似每个人在银行体系内唯一的身份证号。映射从地址出发,意味着我们给每一个账户都分配一个“代币额度槽位”。 - 值域——无符号整数
\text{uint256}是固体性语言中的256位无符号整数,取值范围从0到2^{256}-1——一个比宇宙原子总数还大得多的数字,保证任何代币总量都不会溢出。 - 映射的逻辑含义这个函数不是“计算”出来的,而是账本中记录的“状态”。转账就是在更新这张表——A减100,B加100,仅此而已,不需要搬运任何实体物品。
ERC-20同质化
有了“标准USB口”之后,U盘厂商开始批量生产。这些U盘容量可能不同、外观各异,但只要接口统一,插到电脑上体验完全一致——1个U盘和另1个U盘交换,你毫无感觉。这就是“同质化”(Fungible):每一枚代币都与其他任何一枚完全等价。法定货币是同质化的最好例子:你手里的100元和我手里的100元,价值完全相同,可以无差别互换。
ERC-20将这种同质化思想编码为智能合约。一个符合ERC-20标准的合约,必须实现一组接口,如同U盘必须遵守USB的引脚定义。除了上面讲的 balanceOf 余额查询,还包括 transfer 转账、approve 授权、transferFrom 代扣等核心函数。我们用数学语言精确描述一次转账:
值得强调的是 approve 与 transferFrom 这对组合——它允许你授权某个第三方合约,在不超过授权额度的前提下替你花掉代币。这就像你给家政阿姨一把限额信用卡,她只能在额度内替你付款,超了就会被拒。DeFi 中的自动理财、自动还款,全靠这个机制安全地运转。没有 ERC-20 的授权机制,整个链上金融的自动化和可组合性将无从谈起。
以比喻收束:ERC-20 就是那个“标准USB口”最成功的版本——它足够简单、足够通用,以至于成了整个数字资产世界的默认底座。你今天在钱包里看到的大部分代币余额,背后都是 ERC-20 标准的功劳。
to 和金额 value。合约先检查发送方余额是否足够,如果够就执行扣除和增加的操作。严谨的逻辑保证了账本不会凭空多出钱来。- 前置条件——余额充足
\text{balanceOf}[msg.sender] \geq value是一条“守卫条件”,类似银行柜员在付款前必须先确认账户余额不小于取款金额。不满足这个条件,整个转账会回滚,账户状态不会有一丝改变。 - 借贷记账法转账的本质是“一减一增”的配对操作。
value从发送方余额中扣除,同时精确地加到收款方余额上。总供应量不变,只是分布位置发生了变化,会计学上称之为“借贷平衡”。 - 事件通知——链上日志
Transfer事件被触发并写入交易日志,像快递签收时系统自动给寄件人和收件人发送通知。钱包和区块浏览器监听这些事件,就能实时更新用户的资产列表。
ERC-721独一无二
U盘复制100个,一模一样,这是同质化。但如果是世界名画《蒙娜丽莎》呢?真迹只有一张,无法复制、无法替代,任何两幅高仿印刷品哪怕是像素级一致,市场价值也千差万别。区块链世界也需要表达“独一无二”的资产:数字艺术品、游戏皮肤、域名、房产证、甚至有纪念意义的社交代币。ERC-721 就是为这种“不可替代”资产量身定制的“数字防伪身份证”。
ERC-721 引入了“非同质化代币”(Non-Fungible Token,NFT)的概念。同质化代币的“单位”之间没有区别,而 NFT 的每一枚都携带一个不可互换的 tokenId。我们可以把 tokenId 想象为你身份证上的唯一编号,它对应着链下一份具体的元数据——图片、视频、艺术品描述。这种所有权结构可以用以下映射表达:
ERC-721 的精妙之处在于,它把“所有权”和“内容”分离了:链上只存一个轻量的唯一标识和所有者地址,内容可以放在 IPFS 或中心化服务器上。这就像房产证本身只是一张纸,但它指向的是一套真实的房子。没有 ERC-721,数字艺术永远无法被确权、交易、流转——NFT 市场、加密艺术运动都无从谈起。
用开始的比喻回扣:如果说 ERC-20 是通用 U盘,那 ERC-721 就是每把钥匙齿纹都不同的房门钥匙——无法复制、无法互换,你手里的那把只能开你一人的门,这是数字稀缺性的根基。
tokenId=001 指向 0xabc……,意味着这个地址拥有编号为001的NFT。- 唯一的钥——tokenId
\text{tokenId}是整个合约内全局唯一的正整数标识符。铸造时用一个自增计数器生成,类似派出所把身份证号按顺序分配给你,永不重复。 - 所有权映射
\text{ownerOf}函数返回该tokenId当前的所有者地址。这个映射就像房产登记簿,不论这枚 NFT 被转手多少次,査询这个函数永远能告诉你当下的房主是谁。 - 元数据关联
tokenURI函数返回一个指向链下资源的链接(如 IPFS 哈希),把链上的tokenId和链下的“作品本身”关联起来。链上记录的是所有权,链下存储的是内容。
ERC-1155混合模式
现在设想一个游戏玩家:他背包里同名武器有 100 把(同质化),还有一把传说级武器(非同质化)。传统方案下,如果游戏用 ERC-20 发武器代币,传奇武器无法体现独特性;用 ERC-721 发所有道具,100 把普通武器又需要创建 100 个 NFT,每个都要单独转账,Gas 费高得惊人。ERC-1155 的出现,既保留了 ERC-20 的同质化效率,又兼顾了 ERC-721 的独特性,实现了“同质化/非同质化”的双模支持。
ERC-1155 的核心创新是“多代币单合约”:一个合约可以同时管理任意多种代币,每种代币用一个 id 区分。id 下可以发行任意数量,数量大时它就是同质化的,数量为1时它就是非同质化的。更关键的是,它引入了 safeBatchTransferFrom 批量转账接口——一次交易同时转移多种代币,犹如一笔快递单同时寄出多种商品,省去了逐件下单的打包费:
ERC-1155 是“跨界接头的胜利”——一个合约就是一个保险箱,格子里既放着完全相同的金条(同质化),也放着独一無二的收藏卡(非同质化)。用户只需要记住一个合约地址,就能管理全部资产。对开发者来说,部署一次合约、维护一套代码就满足了全部资产需求,成本骤降。
标准的意义不在标准本身,而在于它打通了生态的“任督二脉”。正如 USB 标准让一台电脑能接键盘、鼠标、硬盘、手机、打印机,ERC 系列的互操作体现在三个层面:钱包自动识别、交易所统一接入、DeFi 协议自由组合。
钱包层:只要代币实现 ERC-20 的 balanceOf 和 transfer,钱包就能自动显示余额并发起转账,无需项目方提前对接。这种“自动发现”机制让新发行的代币瞬间获得全生态支持,恰如新出的 U盘插入任何电脑即能用。
交易所层:中心化交易所和去中心化交易所(DEX)都基于 ERC-20 构建订单簿和流动池。Uniswap 只需要调 transferFrom 就能把用户的代币注入资金池——同一套代码支持无数种代币,无需为每种代币编写专用适配器。
DeFi 组合层:这是 ERC 标准最迷人的地方。借贷协议 Aave 接受 ERC-20 存款并发放利息代币 aToken;aToken 又可以作为抵押品去借另一种 ERC-20;衍生品协议再把这笔借贷打包成新的 ERC-20 代币出售……这些合约从未事先协调,却因为共同遵循 ERC-20 的接口而天然兼容——如乐高积木,标准化的凸点和凹槽让任意两块积木都能拼插。
安全注意事项:互操作的便利也伴随风险。标准只规定接口形状,不保证实现的安全。approve 授权如果给得不加限额,恶意合约就有机会耗尽你的全部代币;转账到错误地址通常无法追回。理解标准接口与信任边界,是每个参与者必须补的一课。
以比喻收束:ERC 互操作生态就像电器行业的“万能插座”——无论你买的是哪个品牌的吹风机、充电器、电饭煲,插上去就能用。标准让不同的服务彼此理解,这种理解又催生了远超单个项目能力的组合创新。
- 多代币统一映射用“ID + 账户”双键模型管理所有代币的余额。一个地址对每个代币 ID 都有一个余额,数据库的存储键从“每代币一张表”压缩为“一张大表多字段”。
- 批量转账——打包发送一次调用中传入两种数组——目标地址数组
to和代币数量数组amounts——合约依次校验并执行每一笔转移。所有操作在同一交易里原子完成:要么全部成功,要么全部回滚。 - 半同质化 SFT当某种
id的代币铸造了多个副本时,它表现为同质化;只铸造 1 个时,与 NFT 无异。这种“由发行数量决定性质”的灵活状态,被称作半同质化代币(Semi-Fungible Token)。
演进与展望
USB 标准并未停在 1.0,而是通过 USB 2.0、3.0、Type-C 不断演进。ERC 标准的旅程同样如此。每个新标准都是对旧标准局限性的回应:ERC-20 解决了同质化资产的统一,但无法表达唯一性;ERC-721 填补了唯一性,但牺牲了批量效率;ERC-1155 兼收并蓄,却依然只服务于单条链。未来方向清晰地指向三个维度:
跨链桥接:资产在以太坊、Solana、Arbitrum 之间流转,需要一种“跨链 USB-C 转接头”。当前主流方案是锁定/铸造模式——在源链上锁定代币,在目标链上铸造等价的包装代币。但跨链安全始终是悬顶之剑,标准化的跨链通证协议是行业正在摸索的方向。
模块化架构:未来的资产标准可能进一步解耦:所有权账本、代币经济逻辑、元数据管理各自成为独立模块,开发者像搭积木一样组合出定制化资产。ERC-3525(半同质化金融票据)已经探索了“嵌套所有权”的形态——一个包含多个子份额的资产容器。
动态NFT:链上数据或外部预言机可以改变 NFT 的元数据——游戏角色的等级会随对局提升,体育 NFT 会随真实比赛数据变化。这种“活着的资产”打破了 NFT 静态图片的刻板印象,让数字资产真正与真实世界联动。
回到主线比喻,这一切正如 USB 从方口到 Type-C 的进化:更小、更快、既能正反插,还能同时传输视频、数据和电力。ERC 系列从 20 到 721 再到 1155,始终在回答同一个问题——如何让区块链资产在更广泛的世界里自由流通?标准的力量就在于,它把个别项目的创新凝聚为全行业的共同基础设施,而新的基础设施又去滋养下一波创新。理解 ERC 标准,不只是学会几个函数签名,更是掌握数字资产“接口思维”的起点。
AI 应用场景
DeFi流动池自动化做市
阶段:数据获取与协议交互
解决的问题:传统方式需要逐笔监控链上交易、为每种代币单独维护解析逻辑。AI 交易策略需要同时跟踪数百种 ERC-20 代币的流动池变化,没有统一标准,数据解析与交互代码量将爆炸式增长。
具体案例:一位量化研究员编写 AI 套利策略,为捕捉 DEX 间的价差,策略需要实时读取 Uniswap 各交易对池中的代币余额。由于所有代币都遵循 ERC-20 标准,研究员只需写一个通用函数调用 balanceOf 和 getReserves,就能监控上千个池子。AI 模型基于这些数据预测价格波动,自动识别套利窗口。
NFT策展与真伪鉴别AI
阶段:数据标注与模型推断
解决的问题:NFT 市场鱼龙混杂,人工辨别作品真伪与价值极为耗时。基于 ERC-721 标准,AI 系统可以自动读取每个代币的 tokenURI、获取链下元数据、分析创作者地址和交易历史,为收藏者提供数字资产的真伪评估。
具体案例:一家 NFT 估值平台部署了 AI 助手:用户输入某幅加密艺术的 tokenId,AI 自动调用 ERC-721 合约的 ownerOf 和 tokenURI 接口,爬取作品历史交易记录、创作者影响力、稀缺度特征,产出一份含市场参考价的评估报告。整个过程无需项目方配合,因为标准接口人人可调用。
链游资产跨游戏互通
阶段:推荐系统与资产匹配
解决的问题:传统链游中每款游戏使用独立的资产合约,玩家资产无法跨游戏复用。基于 ERC-1155 的批量转移能力,AI 可管理玩家在多游戏中的大量道具资产,实现“一处持有、多处使用”的游戏生态。
具体案例:一个游戏平台采用 ERC-1155 发行统一道具,玩家在游戏 A 打到的武器、在游戏 B 收集的皮肤都存放在同一个合约中。AI 推荐引擎分析玩家资产组合,自动为他匹配适合参与的游戏活动;当玩家想要整合资产时,通过 safeBatchTransferFrom 一次将十几种道具转移到新的游戏账户,Gas 费比逐笔转账节省 60% 以上。
Python 演示
"""MiniToken: 用 Python 模拟 ERC-20 / ERC-721 / ERC-1155 的核心账本逻辑纯教学演示,用 dict 模拟链上状态存储"""from typing import Dict, Tuple class ERC20Simulator: """模拟 ERC-20 同质化代币的账本""" def __init__(self, name: str, symbol: str, total_supply: int): self.name = name self.symbol = symbol self.total_supply = total_supply self.balances: Dict[str, int] = {} self.allowances: Dict[Tuple[str, str], int] = {} self._mint("0x0", total_supply) def _mint(self, to: str, amount: int) -> None: """内部铸造函数,把新代币记入指定账户""" self.balances[to] = self.balances.get(to, 0) + amount def balance_of(self, owner: str) -> int: """查询余额, 对应 ERC-20 的 balanceOf""" return self.balances.get(owner, 0) def transfer(self, sender: str, to: str, value: int) -> bool: """直接转账, 对应 ERC-20 的 transfer""" if self.balances.get(sender, 0) < value: raise ValueError("insufficient balance") self.balances[sender] -= value self.balances[to] = self.balances.get(to, 0) + value return True def approve(self, owner: str, spender: str, value: int) -> bool: """授权第三方可花费额度, 对应 ERC-20 的 approve""" self.allowances[(owner, spender)] = value return True def transfer_from(self, spender: str, owner: str, to: str, value: int) -> bool: """代扣转账, 对应 ERC-20 的 transferFrom""" allowance = self.allowances.get((owner, spender), 0) if allowance < value: raise ValueError("allowance exceeded") self.transfer(owner, to, value) self.allowances[(owner, spender)] = allowance - value return True class ERC721Simulator: """模拟 ERC-721 非同质化代币的所有权映射""" def __init__(self, name: str, symbol: str): self.name = name self.symbol = symbol self.token_owner: Dict[int, str] = {} self.owner_tokens: Dict[str, list] = {} self._next_id = 1 def mint(self, to: str) -> int: """铸造一枚新的NFT, 返回唯一的 tokenId""" token_id = self._next_id self._next_id += 1 self.token_owner[token_id] = to self.owner_tokens.setdefault(to, []).append(token_id) return token_id def owner_of(self, token_id: int) -> str: """查询NFT当前所有者, 对应 ERC-721 的 ownerOf""" if token_id not in self.token_owner: raise ValueError("token does not exist") return self.token_owner[token_id] def transfer(self, from_addr: str, to: str, token_id: int) -> bool: """转移NFT所有权, 模拟 ERC-721 的 transferFrom""" if self.token_owner.get(token_id) != from_addr: raise ValueError("not the owner") self.token_owner[token_id] = to self.owner_tokens[from_addr].remove(token_id) self.owner_tokens.setdefault(to, []).append(token_id) return True class ERC1155Simulator: """模拟 ERC-1155 多代币批量账本""" def __init__(self) -> None: self.balances: Dict[Tuple[str, int], int] = {} def mint(self, to: str, token_id: int, amount: int) -> None: key = (to, token_id) self.balances[key] = self.balances.get(key, 0) + amount def balance_of(self, account: str, token_id: int) -> int: """查询某账户对某代币的余额""" return self.balances.get((account, token_id), 0) def batch_transfer(self, from_addr: str, to: str, ids: list, amounts: list) -> bool: """批量转移多种代币, 对应 ERC-1155 的 safeBatchTransferFrom""" for tid, amt in zip(ids, amounts): key_from = (from_addr, tid) if self.balances.get(key_from, 0) < amt: raise ValueError("insufficient balance") for tid, amt in zip(ids, amounts): self.balances[(from_addr, tid)] -= amt self.balances[(to, tid)] = self.balances.get((to, tid), 0) + amt return True if __name__ == "__main__": # ERC-20 演示: 转账与授权 token = ERC20Simulator("DemoCoin", "DMC", 10000) token.transfer("0x0", "0xAlice", 500) token.approve("0xAlice", "0xDEX", 200) token.transfer_from("0xDEX", "0xAlice", "0xBob", 150) print(f"Alice余额: {token.balance_of('0xAlice')}") print(f"Bob余额: {token.balance_of('0xBob')}") # ERC-721 演示: 铸造与转移 NFT nft = ERC721Simulator("DemoNFT", "DNFT") nid = nft.mint("0xCarol") print(f"NFT #{nid} 所有者: {nft.owner_of(nid)}") nft.transfer("0xCarol", "0xDave", nid) print(f"转移后所有者: {nft.owner_of(nid)}") # ERC-1155 演示: 批量转移 multi = ERC1155Simulator() multi.mint("0xEve", 1, 10) multi.mint("0xEve", 2, 3) multi.batch_transfer("0xEve", "0xFrank", [1, 2], [4, 1]) print(f"Frank 的 ID1 余额: {multi.balance_of('0xFrank', 1)}") print(f"Frank 的 ID2 余额: {multi.balance_of('0xFrank', 2)}")
self.balances: Dict[str, int] = {}用字典存储“地址 → 余额”的映射,模拟链上存储的账本def balance_of(self, owner: str) -> int对应 ERC-20 的标准查询接口,外部调用方不需要关心内部存储方式self.allowances: Dict[Tuple[str, str], int]用“所有者+授权者”二元组作为键,记录第三方可代扣的额度if self.balances.get(sender, 0) < value转账前必须先校验余额,相当于银行柜台的面核self.token_owner: Dict[int, str]NFT 所有权的核心数据结构:tokenId 指向持有者地址self._next_id = 1用自增计数器铸造唯一 tokenId,保证不重复self.owner_tokens[from_addr].remove(token_id)NFT 转移时,必须同时更新所有者和持有列表两头数据self.balances: Dict[Tuple[str, int], int]用“账户+代币ID”双键管理多种代币余额,正是ERC-1155的账本模型for tid, amt in zip(ids, amounts)批量转移先统一校验全部余额,再统一扣款,全程原子性——要么全部成功要么全不执行
常见误区
误区“我买了一个 NFT,我就拥有了那张 JPEG 图片的版权,可以随意商用。”
正解ERC-721 标准只定义了 ownerOf(tokenId) 这个所有权映射——它记录的是“谁拥有这个 tokenId”,而不是“谁拥有这个图片的知识产权”。tokenURI 指向的图片文件通常只附带个人使用权,版权仍在创作者手中。这就好比买房时拿到了房产证(所有权),但屋里挂的画(作品)版权仍归画家。NFT 是“数字房产证”,不是“作品本身”。
为何常见:人们习惯把“拥有数字文件”等同于“拥有版权”。传统购物中你买一本书就拥有了那本书的实体,但并没有拥有书中的文字版权。NFT 的元数据存储在链下,反而加剧了这种混淆。
误区“既然 ERC-1155 支持批量转移,那所有场景都应该用它替代 ERC-721,肯定更省钱。”
正解ERC-1155 的 Gas 优势体现特定的批量场景——同时转移多种或同种多枚代币时,共享交易开销。如果你只需要发行一枚独一无二的收藏品,且每次只转移一枚,ERC-1155 和 ERC-721 的 Gas 差异微乎其微。相当于你买 10 件商品用“合并购物车”结账省运费,但只买 1 件时,合并结账没有任何优势。
为何常见:人们容易记住“批量 = 省钱”这个直观结论,忽略“批量”这个词本身隐含的数量前提。推荐阅读 ERC-1155 的 EIP-1155 规范,其中明确写明了设计目标是“减少多代币场景下的交易开销”。
误区“所有 ERC-20 代币的合约代码都一样,只是参数不同。”
正解ERC-20 只是定义了“接口规范”——函数名、参数类型和事件格式。具体实现完全自由:有的代币有增发函数,有的是固定总量;有的带交易税,有的是纯转账;有的支持销毁,有的不支持。相当于 USB 标准规定了接口形状,但绝不规定 U盘内部用多少闪存颗粒、什么主控芯片。正是这种“接口统一、实现自由”的灵活性让 ERC-20 生态如此丰富。
为何常见:初学者看到多个代币合约的 ABI(应用二进制接口)一样,就误认为实现也一样。ABI 相同只代表“外观一样”,内部逻辑可能天差地别。
误区“反正都是转账,给每个 NFT 分配唯一的 tokenId 当成 ERC-20 的子 ID 不就行了?或者给每个 NFT 单独部署一个 ERC-20 合约。”
正解ERC-20 中每个地址只有一个余额数值,没有“子ID”的概念,无法区分“两枚同地址的 NFT”。单独给每个 NFT 部署一个 ERC-20 合约,在转账、查询、交易时极其繁琐——100 万个 NFT 需要管理 100 万个合约,Gas 和存储成本都是天文数字。ERC-721 的 ownerOf 映射天生为唯一性设计。这就像用一堆圆形容器去装方形的冰块——容器本身没有方形格子的概念。
为何常见:从“转账”这个共性出发,容易忽略账本模型的本质差异。同质化账本的核心是“每个账户一个数”,非同质化账本的核心是“每个 ID 一个归属”。两种数据结构完全不同,无法简单复用。
面试题
Q1. ERC-20 标准最核心的贡献是什么?
- A.定义了代币之间的汇率兑换机制
- B.统一了代币转账与余额查询接口← 正确答案
- C.规定了代币最大发行量上限
- D.实现了跨链资产自动转移
答案:B。ERC-20 的本质是“接口标准化”,它规定所有同质化代币实现统一的转账、查询函数,而汇率、发行量、跨链属于业务逻辑,不在标准范围内。就像 USB 标准只定义接口形状,不管硬盘容量和速度。
Q2. 在 ERC-20 的 balanceOf 映射中,uint256 表示什么?
- A.代币的价格
- B.账户地址长度
- C.账户的代币余额← 正确答案
- D.以太坊区块高度
答案:C。balanceOf: Address → uint256 的含义是“每个地址对应一个无符号整数余额”,这个整数就是该账户持有的代币数量。价格不由标准定义,地址长度固定为 160 位,区块高度与账户余额无关。
Q3. ERC-721 标准中,ownerOf(tokenId) 返回的值是什么?
- A.该代币的市场价格
- B.拥有该代币的账户地址← 正确答案
- C.该代币的元数据链接
- D.该代币的铸造时间
答案:B。ownerOf 是 NFT 所有权的核心查询函数——输入唯一 tokenId,输出持有者地址。它就像房产登记簿查房主,元数据链接由 tokenURI 负责,价格和时间与标准函数无关。
Q4. ERC-1155 与 ERC-721 相比,最重要的优势是什么?
- A.完全取代了 ERC-20 的所有功能
- B.支持同地址多代币的批量转移← 正确答案
- C.代币可以无限增发无上限
- D.无需部署合约即可发行代币
答案:B。ERC-1155 的核心创新是多代币单合约及批量转账——一次交易转移多种资产,共享开销。它并不取代 ERC-20,增发和控制由业务逻辑决定,合约部署始终是必需的。
Q5. 关于 transferFrom 函数,调用它的前提条件是什么?
- A.调用者必须是代币的发行方
- B.调用者必须先获得所有者授权← 正确答案
- C.代币价格必须高于预设阈值
- D.收款方必须是非合约账户
答案:B。transferFrom 是 ERC-20 的“代扣”机制,需要所有者事先调用 approve 给调用者授权额度。这就像家政阿姨刷卡需要你的信用卡授权,不授权就无法代付。发行方身份、价格阈值、账户类型都不是条件。
Q6. 一个符合 ERC-721 标准的合约,必须实现哪些函数?
- A.ownerOf← 正确答案
- B.balanceOf← 正确答案
- C.approve← 正确答案
- D.transfer
答案:ABC。ERC-721 标准要求实现 ownerOf、balanceOf(按所有者查持有数量)、approve(授权)等核心函数。注意 ERC-721 的 balanceOf 参数是所有者地址、返回值是所持 NFT 数量,与 ERC-20 的语义不同。
Q7. 关于 ERC-1155 的半同质化特性,说法正确的有哪些?
- A.某种代币供应量为 1 时呈现 NFT 属性← 正确答案
- B.某种代币供应量大于 1 时呈现同质化属性← 正确答案
- C.代币的同质化属性由发行数量动态决定← 正确答案
- D.半同质化意味着代币不可交易
答案:ABC。ERC-1155 中每种 id 的代币数量由铸造决定:供应量为 1 就是“准 NFT”,多人持有便是同质化。这种灵活性被称为半同质化。所有代币都可以交易,SFT 不影响流动性。
Q8. approve 授权机制在 DeFi 中被广泛使用,下列哪种操作必须依赖它?
- A.用户直接向好友转账代币
- B.DEX 协议从用户账户代扣代币← 正确答案
- C.用户查询自己的代币余额
- D.合约发行新的代币
答案:B。DEX 要让用户代币进入流动性池,需要调用 transferFrom,这就必须用户先 approve 授权给 DEX 合约。直接转账调 transfer 不需要授权,查询余额和铸造也不需要。
Q9. 下列哪一项是 ERC 标准存在的核心价值?
- A.提高代币市场价格
- B.降低钱包与交易所对接成本← 正确答案
- C.保证所有代币的收益
- D.消除所有智能合约安全风险
答案:B。ERC 标准最大的价值是互操作——钱包、交易所、DeFi 协议只需写一次对接代码,就能支持所有合规代币,极大降低集成成本。标准不干预价格、不承诺收益,更无法消除安全风险。
Q10. 关于 ERC-20 和 ERC-721 的区别,正确的有?
- A.ERC-20 强调可互换性,ERC-721 强调唯一性← 正确答案
- B.ERC-20 余额模型是每地址一个数值← 正确答案
- C.ERC-721 使用 tokenId 区分每枚代币← 正确答案
- D.ERC-20 可以表达数字艺术品的所有权
答案:ABC。ERC-20 是同质化代币,余额模型为“每地址一个数”;ERC-721 以 tokenId 作为全球唯一标识,适合表达独一无二的数字艺术品。ERC-20 无法表达唯一性,因为所有单位等价。