VE锁仓模型:从投票权48倍差距到代币经济设计实战
2026/9/7 12:47:51 网站建设 项目流程

锁住 10000 个代币,锁 1 个月和锁 4 年,投票权差多少?按 Curve 最早使用的 VE 模型来算,答案大约是 48 倍。这个 48 倍不是产品经理拍脑袋想出来的,背后是一套叫 Vote Escrow(投票托管)的机制:用户把基础代币锁定一段时间,换回一种只能用于投票和获取收益的 veToken,而 veToken 的余额会随着锁仓到期时间逐步衰减。谁剩下的等待时间越长,谁在协议里的话语权就越大。

对 Web3 开发者来说,VE 锁仓不是某个项目的专属玩法,而是一套可复用的代币经济学设计模板。Curve 靠着这套模板,把单纯发币激励变成了治理权和收益权的分层;后来 Balancer、Frax、Solidly 以及 ve(3,3) 模型,都在这套模板上做变体。如果你正在设计新的代币经济,或者准备开发一个带锁仓、质押、投票功能的合约,理解 VE 的设计逻辑是关键的一步。

这篇文章会从一条公式讲起,用 Python 代码把锁仓收益算清楚,再落到合约接口、经济参数扫描和常见坑上。读完后,你能回答三个问题:锁 1 个月和锁 4 年的真实差距有多大?VE 模型为什么能抑制“挖提卖”?照搬 VE 模型后项目失效,问题通常出在哪个环节?

1. 锁 1 个月 vs 锁 4 年:先把这个倍数算清楚

Curve 的 veCRV 采用线性锁仓公式:

veToken 数量 = 锁仓数量 × 剩余锁定期限 / 最大锁定期限

最大锁定期限是 4 年,也就是 1460 天。假设你有 10000 个基础代币,锁 1 个月(30 天)时,获得的 veToken 是:

  • 10000 × 30 / 1460 ≈ 205.48

锁满 4 年时,获得的 veToken 是:

  • 10000 × 1460 / 1460 = 10000

两者相差约 48.67 倍。按月份数去理解更直观:锁 4 年有 48 个月,锁 1 个月只有 1 个月,投票权差了 48 倍。

下面是完整可运行的 Python 演示脚本:

# 文件路径:ve_ratio_demo.py MAX_LOCK_DAYS = 4 * 365 def calc_ve(amount, remaining_days): if remaining_days <= 0 or remaining_days > MAX_LOCK_DAYS: return 0 return amount * remaining_days / MAX_LOCK_DAYS amount = 10000 ve_1m = calc_ve(amount, 30) ve_4y = calc_ve(amount, MAX_LOCK_DAYS) print(f"锁1个月:veToken = {ve_1m:.2f}") print(f"锁4年:veToken = {ve_4y:.2f}") print(f"倍数:{ve_4y / ve_1m:.2f} 倍") # 模拟时间衰减 remaining_days = [1460, 1000, 730, 365, 30, 0] for rd in remaining_days: print(f"剩余 {rd} 天,veToken = {calc_ve(amount, rd):.2f}") # 手续费分成示意:假设两个用户分别锁1个月和锁4年 total_ve = ve_1m + ve_4y daily_fee = 10000 fee_1m = daily_fee * ve_1m / total_ve fee_4y = daily_fee * ve_4y / total_ve print(f"假设单日手续费收入 {daily_fee} 单位:") print(f"锁1个月用户分成:{fee_1m:.2f}") print(f"锁4年用户分成:{fee_4y:.2f}")

运行结果如下:

锁1个月:veToken = 205.48 锁4年:veToken = 10000.00 倍数:48.67 倍 剩余 1460 天,veToken = 10000.00 剩余 1000 天,veToken = 6849.32 剩余 730 天,veToken = 5000.00 剩余 365 天,veToken = 2500.00 剩余 30 天,veToken = 205.48 剩余 0 天,veToken = 0.00 假设单日手续费收入 10000 单位: 锁1个月用户分成:201.39 锁4年用户分成:9798.61

这里有一点需要特别注意:VE 模型中的 veToken 是随时间衰减的。即使你一开始锁了 4 年,当剩余时间只剩下 1 年时,你的 veToken 余额会降到原来的 25%,剩余 30 天时,基本接近零。这意味着,锁仓权益本质上是“剩余承诺”的函数,而不是一次锁仓终身有效。

锁定时间10000 个基础代币得到的 veToken相对锁 4 年的权重
30 天205.482.05%
90 天616.446.16%
365 天250025%
730 天500050%
1460 天10000100%

所以,VE 机制真正惩罚的是“快到期的人”。用户如果不续锁,话语权会不断缩水,这就倒逼长期参与者持续关注协议、持续维护自己的锁仓头寸。

2. 为什么要设计 VE:从“挖提卖”说起

很多 DeFi 项目发币后都会遇到一个典型的死亡螺旋。

项目方为了激励流动性,把治理代币按日释放给流动性提供者。流动性提供者领到代币后,并不一定会继续留在池子里,很多人在市场上一卖掉,代币价格就会持续承压。价格下跌之后,新的流动性提供者不愿入场,旧的 LP 继续砸盘,协议总流动性不断下滑,最终陷入“奖励越多、币价越低、流动性越少”的负循环。社区把这种状态叫“挖提卖”。

要解决挖提卖,最直接的办法是让用户把代币锁定起来。但只锁仓不够,还需要回答三个问题:

  1. 锁多久才算合理?
  2. 锁仓之后给什么回报?
  3. 谁有权决定代币奖励的流向?

VE 模型的答案非常明确:锁定期从最短到最长,锁得越久,治理权重越大,同时能分享协议真实收入。Curve 把它落地成 veCRV 后,效果不只是锁住了流通量,更重要的是,治理权被交到了愿意长期维护协议的用户手里。当用户决定把代币锁 4 年时,他已经没有短期的“砸盘自由”,利益和协议的长期健康绑定在了一起。

VE 机制上线之后,DeFi 世界里还衍生出一个现象,叫“Curve War”。不少协议为了争夺 Curve 的流动性分配权,开始大量收购并长期锁定 CRV,再通过 veCRV 投票把 Curve 的奖励引向自己的资金池。这件事说明,veToken 的投票权一旦和真实收益挂钩,就会变成战略资产,而不只是社区礼貌性的投票工具。对于 Web3 开发者,这个视角很重要:经济模型的设计会直接影响链上资产的控制权分布,没有哪一行奖励参数是真正中立的。

3. 基础概念:Token、veToken 与 Vote Escrow

在继续深入之前,先把几个容易混淆的术语理清。

术语定义主要特征
Token(基础代币)项目发行的可交易代币可转让、可在交易所或 DEX 中流通
Vote Escrow(投票托管)把基础代币锁定一段时间的智能合约机制锁定期内所有权受限
veToken(锁仓权益凭证)锁仓后获得的治理权益代币通常不可直接转让,余额随时间衰减
剩余锁仓时间从当前时间到解锁时间的剩余天数计算 veToken 余额的核心变量
收益权按 veToken 份额获得手续费、奖励或投票议价收入是用户愿意锁仓的经济基础

通俗理解:veToken 像一张会随时间缩水的“会员卡”。你存入的钱越多、承诺继续留在协议里的时间越长,卡片级别越高。但卡片每天都会变弱一点,到期归零。只有持续投入或反复续锁,卡片效力才能维持。

这种设计让协议的治理者始终是“现在愿意承担锁仓成本的人”,而不是“过去做过贡献后再也不关心协议的人”。

新手最容易误解的地方是:veToken 到底算不算一个普通 ERC20 代币?

原生 veToken 通常不支持随意转账,余额也不通过标准 ERC20 的 balanceOf 字段存储,而是通过函数实时计算。你在 Etherscan 等区块链浏览器里查看一个 veCRV 地址时,未必能看到像普通代币那样清晰的余额,原因是它的余额本质上是“锁仓数量”和“剩余时间”共同作用的结果。真正可转账的 veCRV 衍生品,比如 Convex 生态里的 cvxCRV,已经是包装层之后的产物,不是 Curve 原生 ve 模型的一部分。

4. 治理权与收益权:veToken 的价值来源

veToken 如果没有真实收益,就只是一个投票纪念章。Curve 在设计初期就把治理权和收益权绑定在一起,这是整个经济模型能够成立的关键。

在 Curve 的模式里,veCRV 持有者能做的事主要包括:

  • 投票决定 CRV 奖励的池子分配方向;
  • 根据 veCRV 余额获得协议交易手续费分成;
  • 在同时提供流动性的情况下,获得更高的流动性挖矿奖励加成。

这种设计把两条线连接了起来:用户关心奖励流向,因为奖励流向决定自己持有的流动性资产能否获得更多补贴;用户也关心协议手续费,因为手续费直接回流到自己的 ve 头寸上。

后来的项目在此基础上不断扩展权益。有的项目把协议收入的回购代币再分给 ve 锁定者;有的项目允许持有人在治理投票中获得额外代币奖励;还有项目引入了公开的“投票贿赂”市场,项目方为了吸引 ve 大户投票支持自己的池子,主动向投票者支付额外代币。这种市场在 DeFi 里是公开透明的机制,它把沉默低效的投票权变成了可定价的资产。对于代币经济设计者,这既是杠杆,也是风险:投票权一旦能买卖,治理就更像一个资源市场,而不只是社区讨论。

还有一个反直觉的点值得注意:如果 veToken 没有提供“真实收入”,只是给张空头表决权,用户很快就没动力锁仓。很多新项目复制了 VE 的外壳,却没有设计持续的手续费来源。结果用户锁进去就后悔,社区治理形同虚设。VE 模型是一种更重的承诺机制,使用它的前提是协议本身有稳定现金流,比如交易费、稳定币收益、借贷利差等。

5. 主流 VE 模型变体:Curve、Convex 与 ve(3,3)

VE 模型不是一成不变的。经过几次迭代,生态里形成了几个典型变体,理解它们之间的差异,有助于你在自己的代币设计里做选择。

协议代表资产最大锁定期投票权特征设计亮点
CurveveCRV4 年线性衰减,不可转让首次落地 VE 模型,绑定手续费分成
ConvexcvxCRV非原生锁仓无自身时间衰减把锁仓资产包装成可转让衍生品
SolidlyveNFT4 年剩余时间线性衰减融合 (3,3) 博弈,锁仓头寸 NFT 化
BalancerveBAL1 年线性衰减与 BPT 流动性深度绑定

Curve 是原版 VE,核心是线性时间折扣。Convex 则是在 Curve 基础之上的“解包层”。因为原生 veCRV 锁定后资金不灵活,普通用户参与成本高,Convex 提供了一种方案:存入 CRV 后获得 cvxCRV,相当于把 veCRV 的收益权和治理权包装成可转让资产。这带来一个启示:当基础模型门槛太高,市场上一定会出现一个套利层。与其抗拒这种衍生品,不如在一开始考虑清楚,协议需不需要自己的流动性和表达方式。

Solidly 系协议把 VE 推向了另一个方向,也就是 ve(3,3)。(3,3) 这个说法来自博弈论框架:当系统中所有人都选择锁定和质押时,所有参与者都受益;如果有人选择卖出,系统积累的效率就会受损。Solidly 将这种博弈关系引入 VE 模型,把每个锁仓头寸铸造成一个 veNFT。veNFT 可以在市场流通,也可以合并、拆分,继承时间权重和投票权。后来 Velodrome、Aerodrome 等项目又在这个框架上做了调整,把代币释放与真实流动性池的匹配度作为投票激励的核心。

这些变体的共同点,是给“时间投入”定价。区别在于:时间曲线是线性还是非线性、锁仓权益能否转让、最高锁定时间有多长。这些参数不同,用户行为会完全不同。比如,锁仓权益越容易转让,投机性越强;锁定期越长,治理权重越倾向于长期主义者,但也会降低代币的市场流动启动速度。

6. 如何在 Web3 开发中落地 VE 锁仓模型

如果你决定在项目里引入 VE 机制,开发路径可以分为四步:定义场景、设计合约结构、做经济参数模拟、测试部署。

第一步是定义场景。你要先回答:这个协议有没有可持续的现金流?用户锁仓之后,能投票决定什么?如果协议没有真正的收入和治理边界,VE 就不适合直接套用。

第二步是设计合约结构。VE 锁仓的核心数据结构是一个锁定头寸,包含谁锁的、锁了多少、锁定起点、锁定到期时间。下面是一个示意性 Solidity 接口,实际实现需要结合你的协议修改:

// 文件路径:contracts/IVEVault.sol interface IVEVault { event Locked(address indexed user, uint256 veId, uint256 amount, uint256 duration); event IncreasedAmount(uint256 indexed veId, uint256 amount); event ExtendedDuration(uint256 indexed veId, uint256 newDuration); event Withdrawn(uint256 indexed veId, uint256 amount); function lock(uint256 amount, uint256 duration) external returns (uint256 veId); function increaseAmount(uint256 veId, uint256 amount) external; function increaseDuration(uint256 veId, uint256 newDuration) external; function withdraw(uint256 veId) external; function veBalanceOf(address user) external view returns (uint256); function remainingTime(uint256 veId) external view returns (uint256); function votingPower(uint256 veId) external view returns (uint256); }

实现时要注意几个工程细节。

veToken 不建议做成标准 ERC20 余额字段,而应该通过函数实时计算余额,避免被误转账。

延长锁定期时,只能允许用户向未来延长,不允许缩短,否则会形成一种异常套利:用户先把到期时间拉长获取高票权,再马上缩短时间变现。

用户提现时必须判断剩余锁定期为 0,否则任何人都可以在锁定期内提走资产,模型直接崩塌。

第三步是做经济参数模拟。这一步很多人会跳过,但恰恰是最容易出问题的环节。下面是一个简单的 Python 参数扫描脚本:

# 文件路径:ve_model_scan.py MAX_LOCK_DAYS = 4 * 365 def calc_ve(amount, remaining_days): return amount * remaining_days / MAX_LOCK_DAYS def total_ve(market): return sum(calc_ve(amount, days) for amount, days in market) def simulate_user(amount, lock_days, market, daily_distribution): ve = calc_ve(amount, lock_days) share = ve / total_ve(market) return ve, share, daily_distribution * share # 模拟市场环境:鲸鱼、长期参与者和散户 market = [ (100000, 1460), # 鲸鱼锁 4 年 (50000, 730), # 中子锁 2 年 (20000, 100), # 散户锁 100 天 ] for name, amount, days in [ ("短期党", 10000, 30), ("中间派", 10000, 365), ("长期锁", 10000, 1460), ]: ve, share, income = simulate_user(amount, days, market, 10000) print(f"{name}: 锁{days}天 ve={ve:.2f} 投票权占比={share:.2%} 模拟分成={income:.2f}")

运行结果示例:

短期党: 锁30天 ve=205.48 投票权占比=0.16% 模拟分成=16.26 中间派: 锁365天 ve=2500.00 投票权占比=1.98% 模拟分成=197.76 长期锁: 锁1460天 ve=10000.00 投票权占比=7.91% 模拟分成=791.26

这个模拟只用了简化公式,但能帮你回答一个重要问题:在不同的人群结构下,锁仓者的收益是否足够有吸引力?如果模拟结果显示,大多数普通用户锁仓后只能分到极小比例,那这个模型对散户是无效的,必须调整最长锁定期、手续费分配比例或投票权重曲线。

第四步是测试部署。VE 合约通常需要长期托管用户资产,风险等级较高。建议先在一套测试网跑通最小闭环,至少覆盖以下场景:

  • 用户锁定后,veBalance 是否正确;
  • 延长锁定期后,veBalance 是否同步增长;
  • 提现时剩余时间不为 0 是否被拒绝;
  • 多个用户并发锁仓,ve 总供应是否准确;
  • 手续费分配函数是否能在极端 Gas 环境下稳定执行。

7. 常见误区和排查思路

VE 机制涉及的合约逻辑不算复杂,但经济层面的坑很多。下面是一张更贴近实际开发场景的排查表。

误区 / 现象可能原因排查方式参考做法
锁仓后收到一个可转账代币误把 veToken 当成普通 ERC20 实现查询合约是否定义了 transfer原生 veToken 建议不可转让,可转让的应是包装层
用户剩余 1 个月时投票权骤降时间衰减机制导致 ve 余额缩水调用 veBalanceOf 看剩余时间设计续锁提醒页面,提前通知用户延长
锁仓手续费分配不活跃协议收入没有进入 ve 分配通道检查收入合约的资金流向把手续费分成纳入智能合约,而不是靠人工分配
大户锁仓占比过高,治理被绑架最大锁定期太长,或奖励曲线对长期锁仓过度倾斜用模拟工具扫描不同用户分布调整最大锁定期,或改用分段衰减曲线
合约升级后锁仓头寸消失storage 布局冲突或迁移方案缺失审查代理合约和锁仓数据目录使用不可变合约加时间锁,或做完善的迁移计划

这些坑在真实项目里很容易出现。尤其是最后一个,很多团队在早期部署了 VE 合约,后面发现参数不合理,想升级合约,却没有处理好锁仓头寸的迁移,导致用户锁仓数据丢失或权益受损。任何涉及用户资产的合约升级,都必须先制定迁移方案,并在测试网完整演练,而不是直接在代理合约里改逻辑。

另一个容易被忽视的问题是事件日志。VE 合约至少要记录 Locked、IncreasedAmount、ExtendedDuration、Withdrawn 四类事件,这对后续接区块链浏览器、数据看板和运维告警很有帮助。如果没有完整的事件日志,运营人员很难追踪“谁在锁、锁到什么时候、有没有提前赎回转出”。

8. 最佳实践与工程建议

关于 VE 锁仓,最核心的工程建议可以浓缩成四条。

第一条是“参数模拟早于合约开发”。先写 Python 脚本或 Excel 模型,把不同锁仓时长、不同用户结构、不同手续费收入场景都跑一遍,确认经济模型能自洽后,再进入合约开发。这一步能省下大量后期调整成本。

第二条是“治理权与收益权必须绑定”。没有收益的 veToken 很难长期吸引锁仓者。收益可以是交易手续费、回购分配、稳定币收益,也可以是公开的投票市场激励,但必须存在真实价值回流。否则用户在锁仓期满后会选择离开,协议治理也会慢慢空心化。

第三条是“权限设计要保守”。VE 合约长期托管用户资产,项目方手里权限越大,风险越高。建议将协议的关键参数变更放进时间锁,把管理员角色拆分成多签,或者直接使用不可变合约。密码学上安全的合约,不等于经济模型上安全,但合约安全是底线。

第四条是“用区块链浏览器建立监控”。VE 机制上线后,不要只看线下数据。区块链浏览器里记录了每笔锁仓、续锁、提现和投票事件。通过链上索引工具可以统计 veToken 总供应、锁仓平均到期时间、大户 ve 占比等核心指标。当某个地址的 ve 占比突然超过阈值,或者大量锁仓头寸在同一时间到期,都是值得关注的信号。

9. 结语

回到开头的数字:锁 1 个月的投票权,约为锁 4 年的四十八分之一。真正重要的并不只是这个倍数,而是它背后的设计逻辑:把所有权轻、流动性好、容易套现的基础代币,转换成一种重承诺、衰减型、强治理的权益资产。

如果你正在设计代币经济,最稳妥的做法不是直接抄 Curve 的合约,而是先想明白,你的协议靠什么产生现金流,你希望什么样的用户拥有治理权,以及锁仓之后他们能获得什么回报。接下来,用 Python 把模型跑通,再把最小合约部署到测试网验证,最后才考虑正式上线。

更进一步的学习方向是:去看一个已上线项目的 ve 合约源码,用区块链浏览器找出几个真实锁仓地址,观察他们的剩余时间、续锁记录和投票历史。这种链上观察比任何文章都更能帮助你理解,VE 模型在真实博弈中如何演化。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询