name: midnight-core-concepts:data-models description: 当询问UTXO与账户模型、账本代币、屏蔽/非屏蔽代币、作废符、硬币、余额,或在Midnight中选择代币范式时使用。
Midnight 数据模型
Midnight 支持两种不同的代币范式:基于UTXO的账本代币和基于账户的合约代币。根据隐私要求和用例复杂性进行选择。
快速决策指南
| 需求 | 使用UTXO(账本代币) | 使用账户(合约代币) |
|---|---|---|
| 隐私关键 | 是 - 独立,可屏蔽 | 否 - 余额可见 |
| 并行处理 | 是 - 无顺序依赖 | 否 - 顺序随机数 |
| 简单转账 | 是 | 过度设计 |
| 复杂DeFi逻辑 | 有限 | 是 |
| 游戏状态机 | 否 | 是 |
| 治理/委托 | 否 | 是 |
UTXO模型(账本代币)
UTXO = 未花费交易输出。每个代币都是一个离散的数字硬币,必须完全花费。
核心机制
创建 → 存在 → 消费 → 防止重用
- 创建:UTXO随价值、所有者、加密承诺一起诞生
- 存在:可在活跃UTXO集中查询
- 消费:在交易中花费整个UTXO(找零作为新的UTXO返回)
- 防止:作废符添加到全局集合,防止双花
作废符创新
与比特币的已花费标记不同,Midnight使用作废符:
作废符 = Hash(UTXO_承诺, 所有者密钥)
隐私优势:作废符不透露任何关于哪个UTXO被花费的信息。无需暴露原始UTXO身份即可计算作废符。
屏蔽与非屏蔽
每个UTXO独立选择隐私级别:
- 屏蔽:承诺隐藏,价值/所有者私有
- 非屏蔽:价值可见,用于监管合规
// 接收屏蔽代币
接收 硬币: 硬币[];
// 发送代币(可以是屏蔽或非屏蔽)
发送 价值: 限定价值, 至: 地址;
账户模型(合约代币)
在Compact合约内维护地址到余额的映射。类似于ERC-20。
何时使用
- 需要复杂交互的复杂DeFi状态机
- 具有状态化游戏逻辑的游戏系统
- 具有委托机制的治理代币
- 跟踪关系的社会代币
权衡
| 方面 | 账户模型限制 |
|---|---|
| 隐私 | 每笔交易永久可见 |
| 排序 | 随机数产生顺序依赖 |
| MEV | 内存池可见性导致抢先交易 |
| 可扩展性 | 每个节点上的冗余计算 |
账本结构
Midnight的账本有两个组成部分:
1. Zswap状态
- 硬币承诺的默克尔树
- 空闲槽索引
- 作废符集合
- 有效的历史默克尔根
2. 合约映射
- 将合约地址与状态关联
- 包含公共和私有状态组件
代币类型
代币类型是256位抗碰撞哈希:
- 原生代币:预定义的零值
- 自定义代币:合约地址 + 域分隔符的哈希
// 从合约发行自定义代币
// 类型 = Hash(合约地址, 域分隔符)
实际应用
选择UTXO当:
- 用户需要交易隐私
- 需要高吞吐量(并行处理)
- 简单价值转账占主导
- 通过选择性披露(查看密钥)实现监管合规
选择账户当:
- 需要复杂的状态逻辑
- 代币需要与复杂的合约逻辑交互
- 功能性优先于隐私
- 与现有DeFi模式集成
参考资料
详细技术信息:
references/utxo-mechanics.md- 完整的UTXO生命周期,作废符计算references/ledger-structure.md- Zswap状态内部结构,默克尔树详情
示例
有效的Compact模式:
examples/token-handling.compact- 接收和发送代币