type
Post
status
Published
date
Jun 7, 2026
slug
wad-and-ray
summary
tags
智能合约
Crypto
Agent
category
开发
icon
password
WAD/RAY
WAD 通常表示 10^18 精度的定点数,也就是把真实数值放大1e18再存成整数。RAY 代表27位精度,最早DeFi中这样的设计是来是MakerDAO体系的DappHub DSMath,最早的RAY其实是36位的精度,在后面大量的实践中,逐步改为了27位的精度。在Sky(MakerDao)里还有一个RAD,保存WAD和RAY的结果,是45位精度。
WAD:更适合表示金额结果,比如余额、代币数量、存款、借款数量等
RAY:一般是用来表示反复乘除的中间因子、比如利率、借款/存款指数等,因为这些值不是只算一次,而是会持续参与后续计算。中间变量如果精度不足,误差会在长期复利中不断放大。
AAVE V2:
这一版的实现是0.6时期的实现,代码可读性最高,是非汇编版本的代码,计算遵循四舍五入的规则。
AAVE V3:
相比v2,数学语义基本没变,主要是实现优化,两者都是四舍五入,只是v3改成了Yul/assembly的实现,相当于性能版本。
AAVE V4:
从“默认四舍五入”改成了“显式舍入方向”,向上向下的控制权由具体的业务来决定。
SUSDS(SKY):
SUSDS的复利公式P*(1+r)^n实现,用RAY精度参与复利计算。
Morpho Blue:
Morpho Blue基本就是围绕WAD精度来开发的。
根据这些协议的设计,我们可以看出来:
使用 `1e27` 的核心目的是给利率因子和全局指数累加提供更高精度,降低复利计算中的舍入误差。
在金融合约里,基础资产数量通常用 `1e18` 精度表示,但像利率、增长因子、累计指数这类会反复参与乘法、除法和指数运算的中间量,需要更多保护位。否则单次误差虽然很小,经过长期累计后会被放大。
因此,`1e27` 不是单纯为了“表示更多小数”,而是为了让类似 `chi`、`liquidityIndex`、`borrowIndex` 这类全局参数在长期复利过程中更稳定。尤其在总资金规模很大时,微小的单位误差也可能放大成可见的利息偏差。