MultiversXDeFi 金融数学技能:用 BPS/PPM/WAD/RAY 四级精度与半上舍入,守住链上 DeFi 的每一分精度
核心结论速览
- 它是什么:
mvx_defi_math是一个面向 MultiversX 链上 DeFi 的金融数学技能,把精度管理、半上舍入、安全重缩放、百分比计算这四类最容易出问题的环节,沉淀成一套可直接复用的模式与 Rust 代码。 - 它解决什么:
ManagedDecimal默认截断导致系统性价值损失、混合精度未重缩放、费用计算被粉尘存款套利——这些在审计中反复出现的舍入问题,技能都给出了明确对策。 - 它怎么用:不是让你自己推导公式,而是把业务场景(借贷利息、DEX 定价、质押奖励、金库费用)描述给 AI,由技能输出精度选型、舍入方向判定与可落地的 Rust 实现片段。
- 它的价值:把「精度该用几级、舍入该朝哪边」这种依赖经验的判断标准化,减少合约上线后的资金损耗与安全暴露。
- 适合谁用:在 MultiversX 上写 DeFi 合约的 Rust 开发者、做合约审计与代码评审的安全工程师、以及需要快速校验数值模型的协议设计者。
1. 该技能叫什么?如何一键安装 AI 技能提升开发效率?
技能基本信息
| 项目 | 内容 |
|---|---|
| 技能中文名 | MultiversXDeFi 金融数学技能 |
| 技能英文名 | mvx_defi_math |
| 技能 ID | 12576 |
| 定位 | MultiversX DeFi 的金融数学模式库——精度管理、半上舍入、安全重缩放、百分比计算 |
| 技术栈 | Rust / MultiversX 智能合约框架(ManagedDecimal、BigUint) |
它到底解决什么问题
在 MultiversX 上用 Rust 写 DeFi 合约,几乎所有资金相关的 bug 都归到同一类根因:数值精度处理不当。
ManagedDecimal的默认行为是截断,长期累积会造成系统性价值损失,并且这种损失方向可预测,天然成为攻击者的套利空间;- 不同模块各自采用不同精度(手续费按万分比、代币数量按 18 位小数、利息指数按 27 位小数),混合精度却不重缩放是最常见的反模式;
- 费用计算如果使用截断除法,攻击者可以用大量粉尘小额操作,把每次舍入“剩下的零头”一点点攒走。
这个技能把这些经验固化下来:告诉你该用哪一级精度、舍入该朝哪个方向、中间结果该保留到什么精度,并直接给出对应的 Rust 实现。
一键安装 AI 技能的思路与步骤
「一键安装」的本质,是把这套领域知识作为一个可被 AI 编程助手按需加载的技能包挂载上去,而不是让你每次对话都重新贴一遍规范文档。通用流程如下(具体命令、入口地址与命名以官方说明为准,本文不编造):
- 确认安装前提:你使用的是支持 Skill/技能挂载机制的 AI 编程助手客户端,且已登录可用;本地已具备 Rust 与 MultiversX 合约的开发环境(用于后续验证生成的代码)。
- 找到技能入口:在客户端的技能市场、技能商店或插件管理页面中检索技能 ID
12576,或直接按英文名mvx_defi_math/ 中文名「MultiversXDeFi 金融数学技能」搜索。 - 执行安装:点击安装/启用按钮完成挂载。若使用命令行方式管理技能,请参照官方文档给出的安装指令执行,具体命令以官方说明为准。
- 验证是否生效:在对话中提一个只有该技能能准确回答的问题,例如「BPS、PPM、WAD、RAY 分别对应多少位小数、各自适用什么场景?」或「费用计算为什么必须用向上舍入除法?」。如果回复能给出四级精度对照与舍入方向建议,说明技能已正确加载。
- 纳入日常流程:把「涉及金额计算的代码,先让技能给出精度与舍入方案,再落笔写实现」写进团队的开发约定。
这种方式的效率提升点在于:安装一次,长期复用。你不需要在每次写利息模型时重新翻审计报告,也不需要凭记忆判断「这里该不该重缩放」。
2. 该技能的主要功能和特点
- 四级精度体系对照表:BPS(4 位小数,10,000 = 100%,用于费用与简单百分比)、PPM(6 位小数,1,000,000 = 100%,用于细粒度百分比)、WAD(18 位小数,1e18 = 1.0,用于代币数量与价格)、RAY(27 位小数,1e27 = 1.0,用于利息指数、复利与高精度数学)。配套规则是:选用能避免舍入误差的最低精度,中间计算使用比最终结果更高的精度。
- 半上舍入(half-up)实现:提供
mul_half_up、div_half_up两个函数,通过在乘积/分子上补scaled / 2再整除,把截断带来的系统性偏差压到最小。这是针对「粉尘存款窃取舍入」这类攻击的直接缓解手段。 - 安全重缩放
rescale_half_up:升精度时直接rescale,降精度时先加半个因子再除,避免降精度过程中的单向损失。这一条直击「混合精度而不重缩放」的反模式。 - 百分比计算三条路径:优先使用框架内置的
BigUint::proportion(part, total)(示例中 100% 基准为 100,000);需要手动时提供apply_bps(除以 10,000)与apply_ppm(除以 1,000,000)。 - 舍入攻击向量与缓解对照表:粉尘存款窃取舍入 → 在缩放金额上使用半上舍入;重复小操作 → 设置最小金额并在指数上使用半上舍入;转换中的精度损失 → 中间数学使用 RAY 精度;费用计算中的截断 → 费用向上舍入,让舍入方向对协议有利。
- 明确的反模式清单:混合精度而不重缩放、费用用截断除法、中间结果停留在低精度(正确做法是计算时用 RAY,最后再降精度)。
- 领域应用知识库:借贷(利息模型、复利、利用率,RAY 精度)、DEX(价格影响、LP 份额,WAD 精度 + 半上舍入)、质押(奖励分配、份额比率,RAY 指数)、保险库(费用计算、收益,BPS 费用 + 向上舍入除法)。
和普通工具比强在哪:通用计算器或通用大模型能算出「数值是多少」,但回答不了「这个场景该用哪一级精度、舍入该朝哪边、中间结果保留几位」——而这恰恰是链上资金安全的分界线。这个技能提供的是带安全语义的领域决策,不是裸算术。
3. 如何使用该技能?
第 1 步:安装并确认技能已启用。按第 1 部分的方式完成挂载,并用一问一答验证生效。
第 2 步:用「业务场景 + 参与方 + 资金流向」描述需求,而不是直接让 AI 写代码。描述得越像需求文档,输出的精度选型越准。
输入示例:
我在写一个 MultiversX 借贷合约的利息累积逻辑,借款本金按 WAD 存储,利率按年化表示,需要按区块时间做复利累积,最终结算金额要写回账本。请给出精度选型、每一步的舍入方向,以及安全的重缩放写法。
输出说明:技能应给出——利息指数使用 RAY 精度累积复利;本金与价格使用 WAD;跨精度衔接处必须调用 rescale_half_up 而不是裸 rescale;乘除使用 mul_half_up / div_half_up;最后结算落账前再降精度。并会附上类似下面的实现片段:
fn mul_half_up(&self, a: &ManagedDecimal<Self::Api, NumDecimals>, b: &ManagedDecimal<Self::Api, NumDecimals>, precision: NumDecimals) -> ManagedDecimal<Self::Api, NumDecimals> {
let product = a.rescale(precision).into_raw_units() * b.rescale(precision).into_raw_units();
let scaled = BigUint::from(10u64).pow(precision as u32);
let rounded = (product + &scaled / 2u64) / scaled;
self.to_decimal(rounded, precision)
}
第 3 步:追问「费用场景」时显式说明资金归属。例如「这笔手续费归协议金库,希望舍入方向对协议有利」,技能会推荐向上舍入除法,而不是截断除法。
输入示例:
金库赎回要收千分之三的费用,费用归协议,用户拿到剩余部分。请给出避免粉尘套利的写法。
输出说明:应给出 BPS 精度下的费用计算、向上舍入的费用分支,并提示「设置最小操作金额」和「在缩放金额上使用半上舍入」这两条缓解措施,必要时用框架内置的 proportion() 替代手写公式:
pub const PERCENT_BASE_POINTS: u64 = 100_000; // 100% = 100_000
let fee = amount.proportion(fee_percent, PERCENT_BASE_POINTS);
第 4 步:让技能做「反模式自检」。把已写好的数值代码贴回去,请它按技能内的反模式清单逐条比对:是否存在混合精度未重缩放、费用是否用了截断除法、中间结果是否停留在低精度。
第 5 步:本地编译与单元测试验证。技能的产出是设计与代码建议,落库前仍需在本地跑通编译与边界值测试(零值、极小值、极大值、精度边界)。
第 6 步:形成团队规范。把「先问精度再写代码」固化为评审检查项,让技能的判断沉淀成流程。
4. 同类型竞品对比分析
| 方案名称 | 定位 | 核心功能 | 安装/使用门槛 | 适用场景 | 优势与不足 |
|---|---|---|---|---|---|
| mvx_defi_math(本技能) | MultiversX DeFi 专用金融数学模式库 | 四级精度体系、半上舍入、安全重缩放、百分比计算、舍入攻击缓解、反模式清单 | 低:在支持技能的 AI 助手中挂载即可,无需额外配置运行时 | MultiversX 上借贷、DEX、质押、金库的数值逻辑设计与评审 | 优势:领域贴合度高,直接覆盖 ManagedDecimal 的截断陷阱,带安全语义;不足:聚焦 MultiversX 生态,跨链项目参考价值有限 |
| 通用 AI 编程助手(未挂载技能) | 通用代码生成与问答 | 能写 Rust 语法、能解释 BigUint 基本运算 | 极低:开箱即用 | 通用 CRUD、脚手架代码 | 优势:泛化能力强;不足:容易给出「能跑但舍入方向错误」的实现,默认忽略精度体系与攻击向量 |
| 通用定点/大数数学库(如 rust_decimal、num-bigint 等) | 语言层面的精确数值计算基础库 | 任意精度整数、定点小数、四舍五入等基础算子 | 中:需要自行设计精度模型与舍入策略 | 泛金融计算、离线计算 | 优势:成熟稳定、性能可控;不足:只提供算子,不提供「该用几级精度、该朝哪舍」的领域决策,DeFi 语义要自己补 |
| 其他链的 DeFi 数学库(如 Solidity 生态的定点数学库) | 面向 EVM 等链的定点数学实现 | 高精度乘除、指数运算、对数近似 | 中:需按目标链语言与 ABI 适配 | EVM 系合约开发 | 优势:在对应生态内成熟;不足:语言与类型系统不同(Solidity 的定点方案无法直接迁移到 ManagedDecimal),跨链复用需重写 |
结论性建议:如果你的项目在 MultiversX 上,并且涉及真实资金流转,本技能的「精度选型 + 舍入方向」判断是通用库无法替代的部分;通用数学库仍然应该作为底层依赖存在,两者是互补而非替代关系。
5. 该技能的典型应用场景与实际体验情况
场景一:借贷协议的利息累积与利用率模型
- 角色与痛点:DeFi 协议开发者。利息按时间连续累积,用低精度存储会让复利在高频调用下产生可见偏差,甚至被反复借款/还款的操作薅走零头。
- 使用方式:把本金精度(WAD)、利率表示、累积频率告知技能,请它输出精度选型与舍入方向;重点确认利息指数用 RAY、跨精度处使用
rescale_half_up。 - 实际体验:上手门槛低,只要能把场景说清楚就能拿到可用方案。效果最明显的是「中间结果用 RAY、最后降精度」这条建议——很多实现恰恰反过来做。注意事项:降精度的时机必须由业务确定,技能不会替你决定账本字段用几位小数。
场景二:DEX 的价格影响与 LP 份额计算
- 角色与痛点:做 AMM 的开发者。LP 份额的极小值差异会在大量兑换中被不断放大,而截断除法会让系统持续向某一方向倾斜。
- 使用方式:说明「价格与数量用 WAD」,请求给出乘法路径的半上舍入实现,并让技能对照「粉尘存款窃取舍入」这条向量做自检。
- 实际体验:技能直接点明「标准 ManagedDecimal 截断会导致系统性价值损失且可被利用」,这句话本身就是评审时的有力依据。注意事项:半上舍入不是万能药,仍需配合最小金额限制,否则单纯换舍入方式并不能完全挡住高频小额操作。
场景三:质押奖励分配与份额比率
- 角色与痛点:质押模块开发者。奖励按份额比率分配,尾差留在池子里会形成「无人认领的沉淀」,也可能让最后一个领取者承担额外损失。
- 使用方式:请求以 RAY 指数表达份额比率,并明确「尾差归属哪一方」的业务规则,技能据此推荐舍入方向。
- 实际体验:技能对「向上舍入 = 对协议有利」的映射非常清晰,能帮助团队在写代码前就把利益分配规则讲明白。注意事项:一旦选择了对协议有利的舍入方向,需在文档中明示,避免用户侧误解。
场景四:金库费用计算与收益结算
- 角色与痛点:收益聚合类产品的开发者。手续费通常用千分比/万分比表示,是最容易出现截断除法的地方,也是最容易被粉尘套利的地方。
- 使用方式:说明费用比例与归属方,技能会推荐 BPS 精度、向上舍入除法,并提示优先使用框架内置的
proportion()。 - 实际体验:这是四个场景里最快见效的——改动量小、风险明确。注意事项:
proportion()的基准值需与业务约定一致,示例中 100% 基准为 100,000,写代码前务必与团队口径对齐。
6. 该技能能为用户带来的价值
- 把「靠经验」变成「有依据」:精度选型与舍入方向原本依赖资深工程师的直觉与审计经验,现在可以按场景直接查询,新人也能写出符合安全预期的数值代码。
- 显著压缩排查成本:舍入类问题的特点是「不报错、只漏钱」,线上极难定位。技能内置的舍入攻击向量表与反模式清单,可以在编码阶段就把问题挡住,而不是等审计或事后对账时才发现。
- 降低审计沟通成本:代码评审时不再需要长篇解释「为什么这里要加半个因子」,技能给出的模式本身就是行业可沟通的共识语言。
- 减少可被套利的资金损耗:粉尘存款、重复小操作、转换精度损失这几类向量都有对应的缓解手段,直接对应协议金库中真实流失的资金。
- 可量化的收益方向:把「每笔操作因截断损失的零头 × 操作频次」与「被粉尘套利搬走的累计差值」作为评估口径,改动越早、调用越频繁,收敛的资金量越大。
- 长期价值:一套统一的精度约定,会让协议后续新增模块(清算、预言机、跨模块结算)不必重新讨论同一批问题,形成可继承的工程资产。
7. 常见问题 FAQ
Q1:这个技能怎么安装?需要付费吗?
在支持 Skill 机制的 AI 编程助手中,通过技能市场或插件管理页面检索技能 ID 12576,或按英文名 mvx_defi_math 搜索后启用即可。若使用命令行方式管理技能,请参照官方文档执行,具体命令与入口以官方说明为准。关于是否收费、是否有额度限制,本文无法确认,同样以官方说明为准。
Q2:我只做简单的万分比手续费,需要关心 RAY 这种高精度吗? 不需要。技能的规则是「使用能避免舍入误差的最低精度」——简单费用用 BPS(10,000 = 100%)即可。但要注意两点:费用计算应使用向上舍入而非截断除法;如果这个费用后续还要参与复利或指数运算,中间计算应临时提升到 RAY,最后再降回来。
Q3:它和直接用 BigUint / ManagedDecimal 手写计算有什么区别?
BigUint 和 ManagedDecimal 只提供算子,默认行为是截断;技能提供的是决策层:这个场景该用哪一级精度、这一步该向上还是半上舍入、中间结果该不该提升精度、哪些写法属于反模式。换句话说,它防的是「代码能编译、测试也过、但资金在缓慢流失」这类问题。
Q4:这个技能适合谁用?不写 Rust 的人有用吗? 主要适合在 MultiversX 上开发 DeFi 合约的 Rust 工程师、做合约审计与代码评审的安全人员、以及需要校验数值模型的协议设计者。从事其他链开发的工程师,也能从「精度分级」「舍入方向影响资金归属」「粉尘套利」这些通用思路上获得参考,但具体代码示例基于 MultiversX 的 ManagedDecimal,不能直接迁移。
Q5:它和 EVM 生态的定点数学库(如 Solidity 的定点库)怎么选?
按目标链选。技能明确面向 MultiversX DeFi 的 ManagedDecimal 体系,属于「领域模式 + 实现建议」;EVM 定点库属于「算子库」。如果项目在 MultiversX 上,用本技能做精度与舍入决策,底层仍可依赖通用大数库;如果项目在 EVM 上,则应选对应生态的定点库,不要把这里的 Rust 片段直接套用。