[{"data":1,"prerenderedAt":19},["ShallowReactive",2],{"blog-content-zh-erc-20-vs-spl-vs-jetton":3},{"slug":4,"title":5,"excerpt":6,"description":7,"bodyHtml":8,"faqItems":9},"erc-20-vs-spl-vs-jetton","ERC-20 vs SPL vs Jetton：为什么「同一种」代币在每条链上的运作方式都不一样","ERC-20、SPL 和 Jetton 描述的都是「代币」，但它们把余额存放在完全不同的地方。本文讲清楚在以太坊、Solana 和 TON 上底层究竟发生了什么，以及这为何会改变转账的成败方式。","ERC-20、SPL 与 Jetton 的区别：代币余额在以太坊、Solana 和 TON 上分别存放在哪里，以及为什么同一个代号在每条链上其实是不同的代币。","\u003Cblockquote>ERC-20、SPL 和 Jetton 用三种方式回答同一个问题：记录你余额的那个数字究竟存放在哪里。以太坊把所有持有者的余额都放在同一份共享的代币合约里，Solana 为每个持有者放在一个独立的代币账户里，TON 则为每个持有者放在一份独立的合约里。这一差别解释了授权、手续费和大多数失败模式，也解释了为什么同一个代号在每条链上其实是不同的代币。像 WATS 这样三者通吃的钱包——它覆盖 EVM、Solana 和 TON，但并不原生支持比特币——必须同时讲通这三种语法。\u003C\u002Fblockquote>\u003Ch2>「代币标准」到底是什么\u003C\u002Fh2>\u003Cp>代币标准是一套约定好的接口：函数名、消息格式和事件，钱包与交易所都依赖它们。标准之下不过是普通的代码，而每条链运行这些代码的方式，决定了一个代币能成为什么样子。\u003C\u002Fp>\u003Cp>\u003Cstrong>ERC-20、SPL 和 Jetton 并不是同一件事的三种方言。\u003C\u002Fstrong>它们用三种方式回答同一个问题：\u003Cem>那个写着「你拥有 500 枚代币」的数字究竟存放在哪里？\u003C\u002Fem>以太坊把它放在一个共享合约里，Solana 为每个持有者放在一个独立账户里，TON 则为每个持有者放在一个独立合约里——这些存储模型几乎解释了实践中的所有怪异之处，而它们所依托的架构差异可参见\u003Ca href=\"\u002Fblog\u002Fevm-vs-solana-vs-ton\">EVM、Solana 与 TON 对比\u003C\u002Fa>。\u003C\u002Fp>\u003Ch2>以太坊上的 ERC-20：一个合约保管所有人的余额\u003C\u002Fh2>\u003Cp>一个 ERC-20 代币就是位于某个地址上的一份智能合约，它维护着一本把地址映射到数字的账本。你并不「持有」代币；是合约里记着一笔账，说你的地址应得多少。\u003C\u002Fp>\u003Cp>转账是一次\u003Cem>对代币合约的调用\u003C\u002Fem>，把一行的数字减少、另一行增加。你的地址无需任何准备：即便这个地址从未接触过某个 ERC-20，也能收到它。\u003C\u002Fp>\u003Cp>这也解释了为什么你可能持有一大笔代币却动不了：调用合约需要 gas，默认以链的原生代币结算。截至 2026 年，这个默认并非绝对——ERC-4337 的 paymaster 允许账户所有者以外的人代付，EIP-7702 则允许第三方提交并支付那笔设置账户委托的 type-4 交易，不过此后能否继续代付，取决于被委托的代码实现了什么。网络仍然会为这些计算收费；改变的只是由谁支付。\u003C\u002Fp>\u003Ch2>Solana 上的 SPL：代币账户、租金与 mint\u003C\u002Fh2>\u003Cp>Solana 把这项工作一分为二。\u003Cstrong>mint 账户\u003C\u002Fstrong>定义代币——总量、精度，以及谁有权铸造或冻结。余额则存放在独立的\u003Cstrong>代币账户\u003C\u002Fstrong>中。这些账户数据归 Token Program 所有，而账户本身指明某个持有者为其 owner 和消费权限方；并没有规则限制你在一个 mint 下只能有一个账户。\u003C\u002Fp>\u003Cp>因此钱包统一采用关联代币账户（ATA），它由你的钱包地址、mint 和 token program id 派生而来。这个账户必须存在并有资金：免租金机制会在账户中锁定一小笔可退还的 SOL，以维持它的存续。\u003C\u002Fp>\u003Cp>所以在 Solana 上收到一种新的 SPL 代币是一次链上事件，尽管大多数转账会把账户创建一并打包进去。截至 2026 年，Token-2022 增加了可选的转账手续费、机密余额和 transfer hook；由于它的 program id 是派生种子之一，它的 mint 派生出的关联代币账户与传统标准并不相同。\u003C\u002Fp>\u003Ch2>TON 上的 Jetton：每个持有者都有自己的合约\u003C\u002Fh2>\u003Cp>TON 把这种拆分推到了极致。一个 jetton 有一份保存元数据和总量的\u003Cstrong>主合约\u003C\u002Fstrong>，而每个持有者都会拥有自己的 \u003Cstrong>jetton 钱包合约\u003C\u002Fstrong>，其中只存放他在这一种代币上的余额。\u003C\u002Fp>\u003Cp>转账是异步消息，而不是对共享账本的调用：你的 jetton 钱包合约向接收方的合约发送消息，后者为其余额记账。由于 TON 采用分片，这一过程会在连续的若干个区块中完成，而不是一个原子步骤。\u003C\u002Fp>\u003Cp>每条消息都必须携带足够的 TON，用于支付它在下游触发的计算，包括在必要时部署接收方的 jetton 钱包；附带得太少，消息可能被退回或卡住。这种设计取向（TEP-74，截至 2026 年）让 TON 得以横向扩展，也让照搬 EVM 思路写出的转账代码频频出错。\u003C\u002Fp>\u003Ch2>授权、手续费与失败模式：三者分歧最大的地方\u003C\u002Fh2>\u003Cp>授权是分歧最尖锐的一处。ERC-20 采用 allowance 模式：你授予某个合约在一定额度内动用你代币的权限，且在撤销之前一直有效——这正是为什么一个不慎的签名可能在几个月后掏空钱包，详见\u003Ca href=\"\u002Fblog\u002Ftoken-approvals-and-permit-explained\">代币授权与 permit 详解\u003C\u002Fa>以及\u003Ca href=\"\u002Fblog\u002Fhow-to-revoke-token-approvals\">如何撤销代币授权\u003C\u002Fa>。\u003C\u002Fp>\u003Cp>Solana 并不是解药：SPL 的 approve 会在你的代币账户上设置一个 delegate，它在交易结束后依然存在，而 setAuthority 更可以直接把账户的权限转移出去——两者都是已知的盗币手法。Solana 交易会列出它将触及的每一个账户，但这只约束被签名的那笔交易，并不约束长期有效的权限。TON 则没有 ERC-20 式的 allowance。\u003C\u002Fp>\u003Cp>手续费同样分歧明显：EVM 按计算单元定价 gas，Solana 按每个签名收取固定基础费加可选的优先费，TON 则按消息计费。失败模式也各不相同：在 EVM 上，代币可能被卡在无法处理它们的合约里；在 Solana 上，是缺少代币账户；在 TON 上，是附带的价值太少。\u003C\u002Fp>\u003Ch2>为什么同一个代号在不同链上并不是同一种代币\u003C\u002Fh2>\u003Cp>两种共用一个代号的资产，在技术上毫无关系。USDC 在以太坊上是一个合约地址，在 Solana 上是一个 mint 地址；在 TON 上，像 USDT 这类原生发行的稳定币背后是它自己的 jetton 主合约。每一个都是独立的链上对象，各有各的供应量，而跨链桥版本又是另一种不同的权益凭证。\u003C\u002Fp>\u003Cp>跨生态发送——把一个 EVM 代币发到 Solana 或 TON 地址——通常无法挽回；\u003Ca href=\"\u002Fblog\u002Fsent-crypto-to-wrong-network-how-to-recover\">把加密资产发错网络后如何找回\u003C\u002Fa>说明了哪些情况还有救。EVM 到 EVM 往往宽容得多：一个外部拥有账户（包括根据 EIP-7702 完成委托的账户）在每条链上都由同一把私钥控制、地址完全相同，而一个 ERC-4337 式的智能账户即便尚未部署到目标链，通常也能用完全相同的工厂合约和初始化代码在那里重新部署。地址格式是一条线索，详见\u003Ca href=\"\u002Fblog\u002Fcrypto-address-formats-explained\">加密货币地址格式详解\u003C\u002Fa>；至于移动的是同一份规范化供应量，还是铸造出一份新的权益凭证，则是\u003Ca href=\"\u002Fblog\u002Fomnichain-vs-wrapped-bridged-tokens\">全链代币与封装／跨链桥代币\u003C\u002Fa>之间的分野。\u003C\u002Fp>\u003Ch2>这对你的钱包意味着什么（以及 WATS 如何处理）\u003C\u002Fh2>\u003Cp>一个多链钱包必须同时讲通这三种语法，而你本不该察觉到其中的差别——但手续费还是会渗出来，因为每条链都期待自己的原生 gas 代币。截至 2026 年，这个期待是可以协商的，前提是钱包为此而设计。\u003C\u002Fp>\u003Cp>WATS Hot Wallet 做的正是这件事：每一次操作——转账、兑换、质押——都以单一代币 ATS 计费，而不是用链上的原生 gas，在 EVM 上通过 ERC-4337 paymaster 实现，在 Solana 和 TON 上则通过等效的付费方与中继机制，因为 ERC-4337 仅适用于 EVM。ATS 是一枚 LayerZero OFT，因此一份余额可在 EVM、Solana 和 TON 上通用。这并不改变网络收取的费用——\u003Ca href=\"\u002Fats-fee\">ATS 费用\u003C\u002Fa>跟随实时的网络成本——它改变的是这笔成本用哪种代币结算。收取的 ATS 会被销毁，从 1 亿枚朝着 3000 万枚的下限递减。它始终是非托管的：私钥由你掌握，WATS 从不持有任何私钥。WATS 是首个也是唯一一个将 ERC-4337 与 OFT 单代币手续费（以其替代原生 gas 收取）和这一销毁机制结合起来的钱包。\u003C\u002Fp>",[10,13,16],{"q":11,"a":12},"为什么在 Solana 上接收 SPL 代币要花钱，而在以太坊上却不用？","在以太坊上，你的余额只是代币自身合约里的一行记录，所以接收方无需任何设置，也不用付费。在 Solana 上，你第一次接收某个 mint 时，必须存在一个对应的代币账户，而让这个账户留在链上需要一笔小额的免租金 SOL 押金，账户关闭时可以取回。实际操作中，发送方的交易通常会在同一步里创建并出资建立该账户，因此成本落在发送方身上，接收方根本感觉不到。",{"q":14,"a":15},"TON 的 jetton 转账与 ERC-20 转账有什么不同？","jetton 会给每个持有者一份自己的智能合约，其中只存放他的余额。转账是从你的 jetton 钱包合约发往接收方合约的异步消息，会在连续的若干个区块中完成，而不是在一次原子调用里完成。每条消息都必须携带足够的 TON 来支付它触发的计算，否则可能被退回。",{"q":17,"a":18},"以太坊上的 USDC 和 Solana 上的 USDC 是同一种代币吗？","不是。它们是独立的链上对象，各有各的地址、供应量和标准，尽管共用一个代号和同一个发行方。把其中一个发送到另一条链的地址上，通常无法找回，而某个代号的跨链桥版本与原生发行的版本也是彼此不同的。",1786059402089]