Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ERC-3525: 半同质化代币规范 (Semi-Fungible Token - SFT)

ERC-3525 定义了**半同质化代币(Semi-Fungible Token, SFT)**标准。

在数字资产建模中,ERC-20 代币是完全同质化的(数值可随意拆分与合并,但无法承载独立的特征属性);ERC-721 NFT 是完全非同质化的(每个 TokenId 全局唯一,但无法直接拆分数量或进行局部转账)。在现实商业世界与高阶金融衍生品中,存在大量既具备独特独立属性、又包含可拆分数值属性的资产,例如:附带利息与到期日的债券、分批发放的归属凭证(Vesting Allocations)、碳信用额度以及存折票据。ERC-3525 确立了统一的“<ID, SLOT, VALUE>”三元组资产模型。


核心数据模型:三元组体系结构

ERC-3525 通过在 ERC-721 基础之上引入槽位(Slot)与面值(Value),实现了资产分类与数值流转的解耦:

$$ \text{Asset} = \langle \text{TokenId}, ; \text{Slot}, ; \text{Value} \rangle $$

graph TD
  subgraph 资产结构划分
    SlotA["Slot 1: 2026 年到期国债 (年化 5%)"]
    SlotB["Slot 2: 2027 年到期企业债 (年化 8%)"]
  end

  SlotA --> Token1["TokenId #101<br/>持有面值: 5,000 USD"]
  SlotA --> Token2["TokenId #102<br/>持有面值: 12,000 USD"]
  SlotB --> Token3["TokenId #201<br/>持有面值: 80,000 USD"]

  Token1 -. "允许拆分/转账 Value (同 Slot 互通)" .-> Token2
  1. TokenId (唯一凭证标识):遵循 ERC-721 规范,全局唯一,归属于特定的拥有者账户(Owner)。
  2. Slot (属性槽位 / 业务分类):定义资产的内在属性集合(如金融产品类型、计息规则、到期时间戳)。只有当两个 TokenId 的 Slot 完全相同时,它们持有的面值才可以相互转移或合并。
  3. Value (可拆分面值):当前 TokenId 所拥有的具体数值份额,支持数学上的加减合并与按需拆分。

核心状态机与流转接口

ERC-3525 包含三种不同层级的资产转移语义:

interface IERC3525 /* is IERC165, IERC721 */ {
    event TransferValue(uint256 indexed fromTokenId, uint256 indexed toTokenId, uint256 value);
    event ApprovalValue(uint256 indexed tokenId, address indexed operator, uint256 value);
    event SlotChanged(uint256 indexed tokenId, uint256 indexed oldSlot, uint256 indexed newSlot);

    // 查询该 TokenId 所属的属性槽位
    function slotOf(uint256 tokenId) external view returns (uint256);

    // 查询该 TokenId 持有的可拆分面值
    function balanceOf(uint256 tokenId) external view returns (uint256);

    // 1. 同 Slot 内:将面值从一个 Token 转移至另一个已有 Token
    function transferFrom(
        uint256 fromTokenId,
        uint256 toTokenId,
        uint256 value
    ) external payable;

    // 2. 拆分铸造:将面值从源 Token 扣减,并在目标地址直接铸造一个全新的 TokenId 接收该面值
    function transferFrom(
        uint256 fromTokenId,
        address to,
        uint256 value
    ) external payable returns (uint256 toTokenId);
}

参考文献与规范