{"content":{"title":"现代稳定币 - M^0 是如何构建的","body":"![image.png](https://img.learnblockchain.cn/attachments/2025/03/rLLCfMde67cd88f8d6464.png)\r\n\r\n## 简介\r\n\r\n我们继续关于稳定币的系列文章，今天的重点是 M^0 Protocol。该项目位于完全托管的稳定币（如 USDT/USDC）和“纯”算法稳定币之间，通过无权限市场做市商的活动来维持其锚定。我们的目标是回顾这个项目，以展示一个更简单的稳定币设计，使用治理控制的参与者进行价格预言和验证。这种方法使得将实物资产（RWA）作为抵押品的使用成为可能，并主要依赖于验证人和铸造者的行动，而非市场活动，得到协议治理的验证。\r\n这种协议的设计比典型的算法稳定币要简单得多，只需要验证人和协议治理对抵押资产的数量和价格/数量做出诚实的决策。这种简单性使这些协议在算法漏洞方面更具韧性，因为它们不依赖复杂的数学模型、分配或激励机制。这些协议的安全性主要依赖于协议管理的完整性。\r\n这使得这种项目在“CeFi”和“DeFi”的交汇点上高度吸引人。如果与 RWA 有任何关联，最终稳定币也可以与 RWA 进行互动，共享与集中金融世界相关的风险。此外，这种协议提供了一种简单可靠的方法，以在任何可验证市场中发行以 RWA 资产为支持的稳定币。它为锚定多种国家货币的稳定币提供了一种有效的解决方案，利用不同国家的金融市场作为抵押品来源。\r\n\r\n让我们探索一下该协议的运作方式。\r\n\r\n## 高层设计\r\n\r\nM^0 Protocol 的参与者承担三种主要角色之一：铸造者、验证人和收益者。铸造者创建 M 稳定币（MToken），以经验证和批准的抵押品为支撑。实质上，这与 USDT/USDC 中的稳定币抵押和铸造过程类似，但由验证人的批准和操作延迟进行管理，使验证人能在每个步骤进行干预。铸造者需要更新其抵押品的数量，未能及时更新的将受到处罚。协议中的一个附加机制允许收益者（由治理批准的 M 代币持有者）赚取 M 代币，从铸造费用中产生收入。\r\n\r\n从现实世界的角度来看，M^0 协议可以如下运作：\r\n\r\n- 铸造者拥有产生收益的 RWA，例如股份或债券。\r\n- 铸造者定期向 M^0 协议更新抵押品的数量（反映 RWA 资产累积的收益）。\r\n- 铸造者铸造 MTokens，同时维持抵押率，并将其分发给常规用户。\r\n- 用户在其 MToken 余额上激活“收益”，使其余额增长。\r\n- 不断增长的 MToken 余额由增加的抵押品支持，保持协议的超额抵押。\r\n\r\nM^0 Protocol 中没有算法稳定机制；锚定只是通过铸造商的经济激励维持的：如果 MToken 价格低于 $1，铸造者将在二级市场回购 MTokens 并取回其抵押品，从而使价格上升。如果 MTokens 的价格在 $1 以上，铸造者将存入抵押品并铸造更多的 MTokens，从而使价格下降。\r\n\r\nMToken 的核心生命周期是简单的：经过治理批准的铸造者需要提供一定数量合格抵押品的所有权证明。该抵押品的价值在链上提交，并通过 验证人投票获得批准。一旦获得批准，铸造者可以铸造 M 稳定币（最高为其拥有的抵押品价值）。铸造者还必须定期更新抵押品的数量。协议会施加费用和处罚，例如铸造费用和未能提供抵押更新的罚款。在实践中，抵押品数量的提供作为价格预言，不断为协议提供其拥有资产的总价值，并维持抵押率。\r\n\r\n协议内所有数量（MToken 和抵押品）均以相同单位（美元）进行衡量，从而消除了换算、汇率或外部预言的需要，这大大简化了协议。此外，还存在例如未更新抵押惩罚和 MTokens 的双阶段铸造过程等其他机制，随后在文章中将进行探讨。\r\n\r\n这些场景在协议的 [白皮书](https://docs.m0.org/portal/overview/whitepaper) 中进行了描述，而我们的任务是检查实现情况，我们将直接在代码中分析这些机制。让我们深入了解。\r\n\r\n## MinterGateway\r\n\r\n首先我们来看 [MinterGateway.sol](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L38)，这是实现 MToken 生命周期的主要合约。首先，我们有 MinterState [结构体](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L57-L80)，它包含有关铸造者的信息。它包括“是否活跃”标志、抵押品的总额、待提取抵押品的数量以及与上次更新、惩罚、冻结和抵押品提取事件相关的时间戳集。\r\n\r\nMinterGateway 的主要全局状态包含 [两个](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L108-L112)“总供给”：principalOfTotalActiveOwedM（“活跃”铸造者拥有的 MTokens 的“原始”总量）和 totalInactiveOwedM（“非活跃”铸造者拥有的 MTokens）。全局状态 [映射](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L120-L130) 包括铸造者状态、MTokens 的原始余额、铸造提案和抵押品提取请求。此外，还有一个特别的 [映射](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L132-L133)，用于来自验证人的“逐铸造者”批准。\r\n\r\n现在，让我们讨论出现在各种函数中的 MTokens 的“本金”和“现值”数量（如 [这里](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L803-L804) 或 [这里](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L856)）。本金金额指的是“ [原始](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L517-L524)” MToken 余额，而现值则表示本金金额乘以不断增长的指数（我们稍后将讨论）。可以使用这些 [函数](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/abstract/ContinuousIndexing.sol#L77-L114) 在这些金额之间进行转换，提供“向上取整”和“向下取整”变种。正如我们在之前的许多文章中提到的，DeFi 协议中安全的取整方法总是优先考虑协议，即在 tokens “出” 协议时向下取整，而在 tokens “入” 协议时向上取整。\r\n\r\n另一个需要考虑的关键方面是使用 [collateralOf()](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L551-L565) 函数计算铸造者的抵押金额。此函数只返回“活跃”的抵押品，意味着不属于待提取的抵押品。提取请求会在创建时减少活跃抵押品，使该部分不再参与活跃计算。\r\n\r\n## 抵押品操作\r\n\r\n现在让我们检查 [updateCollateral()](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L176-L184) 函数，当铸造者想要证明其抵押品时会使用该函数。该函数的参数接受大量数据，例如验证者的列表、时间戳和签名。这种设计使铸造者能够离线收集所有必要的批准，并在一个事务中呈现，消除了链上审批的需求。此外，还有一个 bytes32 metadataHash_ 参数，用于在抵押品审核过程需要额外的离线活动验证时包含 off-chain 信息哈希。\r\n\r\n该函数以 [签名验证](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L189-L198) 开始，保存所有签名中的最小时间戳。签名验证程序 [迭代](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L1096) 所有签名，以检查其是否满足所需的 [阈值](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L1123-L1125)，这个阈值是由治理确定的 [常量](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/libs/TTGRegistrarReader.sol#L90-L93)。签名检查本身很简单，主要的 [验证](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L1154-L1163) 包括确保签名的时间戳不在未来且不早于该验证人的最后记录时间戳。验证人还必须在批准的 [验证人列表](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/libs/TTGRegistrarReader.sol#L111-L113) 中列出。\r\n\r\n一旦所有签名都验证完毕，就该 [施加](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L200C10-L200C48) 惩罚，第一个惩罚类型是“错过抵押更新的惩罚”，如果验证人在过去的期间内未能更新抵押量，则会施加。在此阶段，函数会 [确定](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L769-L773) 错过的时间间隔，计算自铸造者上次更新以来 [错过](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L971-L978) 多少个时间间隔。惩罚随后会被 [施加](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L780) 给铸造者。\r\n\r\n有趣的是，在 [\\_imposePenalty()](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L730) 函数中，惩罚会 [添加](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L752) 到铸造者的 MToken 余额。一开始，这可能看起来责罚奖励了铸造者。然而，由于“欠 MTokens” 实际上代表着债务，增加余额会提高铸造者赎回抵押品的成本（铸造者需要偿还更多的 BOLD 以返回他们的抵押品）。协议无法触及抵押品本身，或进行诸如“铸造”、“销毁”或“转移”等操作，因为抵押品代表的是实物资产（RWA），而这个资产在没有链外互动的情况下无法被转移或修改。这些约束对所有 RWA 相关的区块链项目构成了挑战，其中链外操作无法完全在链上进行，而 RWA 的处理仅限于链外参与者验证链外操作。\r\n\r\n[ \\_imposePenaltyIfUndercollateralized()](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L792) 函数实施第二种惩罚类型 - “不足抵押的惩罚”。在这个步骤中，函数 [检索](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L793C43-L793C67) 欠的 MTokens 的当前数量，并计算使用 [mintRatio](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L537-L542) 中定义的最大允许 MTokens 或抵押品数量，该值由治理设定（范围从 100% 到 650%）。如果抵押率是 [有效的](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L807)，则不施加惩罚。否则，函数会计算 [多余](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L818) 的 MTokens，确定 [不足抵押](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L828) 的时间间隔， 并根据多余的 MTokens 施加惩罚，按铸造者不足抵押的时间加权。\r\n\r\n在此之后，updateCollateral() 函数将 [处理](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L205) 待提取的抵押品。此操作 [实际上](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L889) “不做任何事”，只是更新提取队列和“总提取”值，因为与 RWA 的实际互动由铸造者在链外处理。\r\n\r\n然后该函数 [更新](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L215) 铸造者的抵押品余额和上次更新时间戳。\r\n\r\nupdateCollateral() 的最后一步是 [updateIndex()](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L219)，它调整两个指标（利率）：铸造者指数，不断增加 MToken 的余额，以及收益指数，增加已为其 MToken 启用“正在收益”标志的持有者的 MToken 余额。我们将会在本文的单独部分对这些指数进行详细探讨。\r\n\r\n接下来是抵押品提取，涉及两个步骤：提取提案和“[执行](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L205)”下一次调用 updateCollateral() 时执行。提案在 [proposeRetrieval()](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L223) 函数中实现。每个提取会分配一个唯一的 [retrievalId](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L227C13-L227C25)，其数量会被 [添加](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L240-L241) 到“待提取”的字段中。此“待提取”的数量 [排除](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L563) 了通过 `collateralOf()` 函数计算的“活跃”抵押品余额。\r\n\r\n## MToken 操作\r\n\r\n现在让我们讨论一下 MToken 的铸造和销毁。铸造遵循一个两步程序：铸造提案和执行。\r\n\r\n[proposeMint()](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L250) 函数执行不足抵押的 [检查](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L259)，并 [创建](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L265) 一个 MintProposal。每个铸造者一次只能有一个铸造提案；任何新的提案都会简单地覆盖先前的提案。\r\n\r\n之后，铸造者可以调用 [mintM()](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L271) 函数。只有在 [mintDelay()](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L290-L291)（允许验证者对恶意铸造做出响应）之后以及 [mintTTL()](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L293-L294)（以排除过时铸造）之前，允许调用该函数。这两个值由治理设置。后续步骤包括不足抵押检查和 [更新](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L320-L321) 铸造者的“原始” MToken 余额。值得注意的是，铸造者可以将 MTokens 铸造到 [外部](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L324) 目标地址，而不是他们自己的。\r\n\r\n销毁过程更简单，可以通过使用 [burnM()](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L341) 函数在一步中完成。该函数仅与活跃或“官方”被禁用的铸造者 [交互](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L352)，对未更新抵押品的信息施加 [惩罚](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L357)， [销毁](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L372) 交易发送者的 MTokens，并更新指数。该函数是无权限的，允许任何人“修复”铸造者在出现问题时。\r\n\r\n此外，任何验证人都有能力 [冻结](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L393) 铸造者，阻止他们在铸造者冻结时间内铸造 MTokens，这一时间段由治理设置。激活和停用是通过治理机制进行管理的。首先，铸造者必须获得批准，只有在获得批准后 [才能够](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L400-L401) 激活。类似的过程适用于 [停用](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L414-L415)，只有未获批准的铸造者才能被停用。\r\n\r\n协议治理负责处理激活和停用过程，并确定各种协议 [参数](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/libs/TTGRegistrarReader.sol#L56-L123)，超出了本文的范围。如需更多关于治理过程的细节，请参考协议的 [文档](https://docs.m0.org/portal/overview/whitepaper/iii.-governance)。主网（Mainnet）上部署的 TTG Registrar 合约可以在 [这里](https://etherscan.io/address/0x119FbeeDD4F4f4298Fb59B720d5654442b81ae2c#code) 找到。\r\n\r\n现在，让我们继续讲解利息积累和指数。\r\n\r\n## ContinuousIndexing\r\n\r\n[updateIndex()](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L446-L463) 函数的代码显示了两个指数更新：铸造者指数和收益指数。\r\n\r\n[首先](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/MinterGateway.sol#L457C24-L457C35)，铸造者利率直接使用由治理在 MinterRateModel.sol 中 [设置](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/rateModels/MinterRateModel.sol#L40-L42) 的利率。\r\n\r\n其次，是收益者利率。这里的主要挑战是确保收益者利率不会导致支付给收益者的 MTokens 超过从铸造者处收集的量。因此，这个利率必须依赖于铸造者利率和利用率，利用率被定义为 amount_receiving_minter_rate / amount_receiving_earner_rate（在代码中表示为 totalActiveOwedM_ 和 totalEarningSupply_）。系统会对利用率差异进行调整：当利用率 < 1（表示“收益者”比“铸造者”多时），系统会降低收益者利率（“滞后”），而当利用率 > 1（表示“收益者”比“铸造者”少时），则会提高利率（“赶上”）。\r\n\r\n“滞后”场景通过这个 [分支](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/rateModels/EarnerRateModel.sol#L114-L118) 处理。然而，“赶上”的 [分支](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/rateModels/EarnerRateModel.sol#L120-L141) 更复杂，因为它必须确保由铸造者利率生成的 MTokens 数量不超过由收益者利率生成的 MTokens 数量。要解决这个问题，需要“更频繁和灵敏”的利率调整。该协议使用 RATE_CONFIDENCE_INTERVAL（[30](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/rateModels/EarnerRateModel.sol#L25) 天）来计算更短周期内的“现金流”，涉及 [exp](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/rateModels/EarnerRateModel.sol#L88-L108) 和 ln 函数。此外，收益者利率不得超过由治理设定的 [hardlimit](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/rateModels/EarnerRateModel.sol#L33-L34)。\r\n\r\n## MToken\r\n\r\n接下来，我们来看一下 [MToken.sol](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MToken.sol#L37) 合约。\r\n\r\n首先，MToken [余额](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MToken.sol#L65) 不是简单的 uint256 值，而是表示为一个 MBalance [结构体](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MToken.sol#L45-L48)，它包括 isEarning 标志。MTokens 的铸造和销毁由两个不可变的治理 [地址](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MToken.sol#L52-L56) 管理。\r\n\r\n赚取 MTokens 的能力需要两个“总供给” [值](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MToken.sol#L58-L62)：它们表示未赚取和赚取 MTokens 的“原始”总量（第二个值在收益率索引中使用）。将用户的余额设为“收益” [的过程](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MToken.sol#L101-L105) 受到治理的限制。只有通过 [批准](https://github.com/m0-foundation/protocol/blob/b1c6e624ed09a9e28f4ae45cd87fda610fafe446/src/libs/TTGRegistrarReader.sol#L96-L98) 的账户才能赚取（金要求 KYC ）。开始和停止赚取的 [流程](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MToken.sol#L271-L327) 很简单，包括对“总收益”和“总未收益”供给的调整。\r\n\r\n[balanceOf()](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MToken.sol#L152-L159) 函数返回未赚取账户的原始余额和赚取账户的索引后的余额。\r\n\r\n## 实现细节\r\n\r\n由于 M^0 协议缺乏复杂的代码库，因此几乎所有的逻辑都非常直接和简单。\r\n\r\n一个值得注意的方面是溢出的处理，如 [这里](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MinterGateway.sol#L315) 或 [这里](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/MToken.sol#L247-L255)。\r\n\r\n另一个有趣的特性是治理控制值的“菱形”存储。这些值通过 [名称](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/libs/TTGRegistrarReader.sol#L14-L51) 识别，并便于使用这些名称访问 [的](https://github.com/m0-foundation/protocol/blob/9ae79c95e24013472e556f09bcb67cb70c0ca488/src/libs/TTGRegistrarReader.sol#L136-L138) 键。\r\n\r\n## 结论\r\n\r\nM^0 Protocol 提供了一种解决方案，使得能够实施以实物资产为支持的 M 稳定币，同时全面控制验证者、铸造者和收益者的治理。与此同时，M 代币本身可以作为常规 ERC20 代币用于任何目的。\r\n\r\n这种项目的代码库的简单性增强了其在 DeFi 领域的可靠性。由于这些协议的许可性质，可编程黑客的风险较低。然而，与治理和外部金融市场相关的链外风险在协议用户与服务提供者之间共享，如果基础 RWA 不稳，协议也会变得不稳定，这对治理、铸造者、验证者和收益者均有影响。\r\n\r\nM^0 Protocol 作为传统金融机构与去中心化资产之间的桥梁，使用户能够拥有和使用 M 代币，了解其得到真实债券、股份和其他传统金融资产的支持。例如，M^0 Protocol 可用于发行与国家货币挂钩的稳定币或创建专门针对特定行业的数字资产。\r\n\r\n \r\n\r\n- MixBytes 是谁？\r\n\r\n[MixBytes](https://mixbytes.io/) 是一支专注于为与 EVM 兼容的项目和基于 Substrate 的项目提供全面智能合约审计和技术咨询服务的区块链审计和安全研究专家团队。请关注我们在 [X](https://twitter.com/MixBytes) 上，以获取最新的行业趋势和见解。\r\n\r\n>- 原文链接： [mixbytes.io/blog/modern-...](https://mixbytes.io/blog/modern-stablecoins-how-they-re-made-m-0)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/24680","address":null},"history":null,"timestamp":1741523233,"version":1}