Try   HackMD

VRGDA 算法浅析

本文将Paradigm的blog VRGDA做了简单整理,如需了解更多细节,请阅读原文。

概述

VRGDA全称是Variable Rate Gradual Dutch Auctions(可变速率渐进式荷兰拍卖),是Paradigm提出的一种代币发行机制。其目的是通过可定制的代币发行模型,实现渐进式荷兰拍的效果:当市场热度超出预期时,价格上涨;反之,当市场热度低于预期时,价格下跌;而当市场热度与预期一致时,其价格等于设定的目标价格。

Art Gobblers项目中,有两种NFT通过VRGDA方式进行拍卖:一种是Gobbler,其总量具有固定上限10,000个;另一种是Page,无总量上限。这两种代币发行速率如下图所示:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

定义

函数

为了实现荷兰拍卖的效果,需要寻找一种价格

p 与时间
t
的函数,使得随着时间
t
的增长,价格
p
呈下降趋势。

有很多函数可以满足要求,如paradigm在GDA文章中提到的:

(1)pn(t)=kαneλt

这里我们选择如下函数:

(2)pn(t)=p0ct, 0 < c < 1

其中,

p0 为起始价格,由于
0<c<1
,因此随着时间
t
增加,价格
pn
将小于
p0

假设

c=0.7
t
的时间单位为天,则其表示每天的价格为前一天的70%。

价格(纵轴)与时间(横轴)曲线如下图所示:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

参数

定义如下参数:

  • p0
    - 目标价格,如果NFT按照计划的速度拍卖,即市场热度符合预期,则每个NFT都将以该价格卖出
  • k
    - 在单位时间内,如果没有NFT成交,则NFT价格按照该百分比递减
  • f(t)
    - 代币发行模型,在时间
    t
    内,预计将有多少数量的NFT发行

我们使用

1k 替换公式(1)中的
c
,可得:

(3)pn(t)=p0(1k)t

假设

k=0.30
t
的时间单位为天,起始价格为
p0
,则表示如果没有成交,每天价格下降30%(为前一天的70%)。

代币模型

到目前为止,公式(3)已经实现了价格随时间下降的效果。

为了使价格能够反映市场热度,我们使用

tsn 代替
t
,即用一个由已拍卖代币数量
n
定义的函数
sn
来控制
t

我们希望

sn 能够实现以下效果:

  1. 如果拍卖进度快于预期,则下一个NFT的起拍价格大于
    p0
  2. 如果拍卖进度慢于预期,则下一个NFT的起拍价格小于
    p0
  3. 如果拍卖进度等于预期,则下一个NFT的起拍价格等于
    p0

假设拍卖进度等于预期,我们可以得出:

(4)p0(1k)tnsn=p0

可知此时

tn=sn,因此
sn
可以看作时间与代币数量的函数,即代币数量与时间函数
f(t)
的反函数:

(5)sn=tn=f1(n)

其中,代币数量与时间函数

f(t),即为代币发行模型。

因为

0<(1k)<1,如果拍卖进度快于预期,则
t<sn
,即
tsn<0
,因此
(1k)tsn>1
,可知:
pn>p0
,即起拍价格大于
p0
;同理,如果拍卖进度慢于预期,则
pn<p0
,即起拍价格小于
p0

特别地,当市场过热时,拍卖价格会急速上升,以降低市场热度,可以防止巨鲸批量拍卖。

这就实现了拍卖价格与市场热度相互作用。

VRGDA公式

VRGDA最终公式如下:

(6)vrgdan(t)=p0(1k)tf1(n)

其中,

  • p0
    - 目标价格
  • k
    - 每单位时间价格衰减百分比
  • f1(n)
    - 时间与代币数量的函数,即代币发行模型
    f(t)
    的反函数
  • t
    - 起拍到当前的时间

常见的代币发行模型

接下来我们以几个常见的代币发行模型为例,介绍VRGDA算法。

线性

假设预期每天卖出

r 个NFT,则代币数量与时间的函数(发行模型)为:

f(t)=rt

对应的曲线为:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

其反函数(时间与代币数量的函数)为:

f1(n)=nr

代入公式(6)可得,线性发行速率的VRGDA公式为:

(7)linear_vrgdan(t)=p0(1k)tnr

平方根

假设预期第1个NFT在第1天卖出,第2个NFT在第4天卖出,第

n 个NFT在
n2
天卖出,即代币数量与时间的函数为:

f(t)=t

对应的曲线为:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

其反函数为:

f1(n)=n2

代入公式(6)可得:

(8)sqrt_vrgdan(t)=p0(1k)tn2

逻辑函数

逻辑斯蒂函数(Logistic Function)是一种S型函数,简化定义为:

l(t)=11+et

其可将任意输入压缩到

(0,1)的范围内,如图所示:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

我们可以使用逻辑函数作为具备总量上限的发行模型函数。

首先将函数沿纵坐标下移0.5(因为

t=0时,
l(t)=0.5
),取
t>0
,则
0<l(t)<0.5
,函数表示为:

l(t)=11+et0.5, t > 0

假设我们希望代币总量为

L1,可将上述公式放大
2L
,并引入一个时间乘数
s
以控制发行速率,即可得到发行函数:

f(t)=2L1+estL, t > 0

t=1s 时,可得:

f(1s)L=21+e110.46

因此可以选择

s 为使得代币发行量达到总量的46%的时间。比如,如果希望100天以后发行量达到总量的46%,则
1s=100
,因此
s=1100=0.01

可计算

f(t) 的反函数为:

f1(n)=ln(2LL+n1)s

代入公式(6),可得到基于逻辑函数的VRGDA公式:

(9)logistic_vrgdan(t)=p0(1k)t+ln(2LL+n1)s

对应的代币发行曲线如下图所示:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Art Gobblers 中的 VRGDA

在 Art Gobblers 项目中,Gobbler和Page两种NFT使用VRGDA方式拍卖,其中:

  • Gobbler使用逻辑函数作为发行模型,其总量上限为10,000个
  • Page使用了逻辑函数和线性发行相结合的方式,在一定时间后切换到线性发行,其总量无上限

以Gobbler为例,我们看看源码中是如何定义VRGDA拍卖相关参数的:

constructor(
    // Mint config:
    bytes32 _merkleRoot,
    uint256 _mintStart,
    // Addresses:
    Goo _goo,
    Pages _pages,
    address _team,
    address _community,
    RandProvider _randProvider,
    // URIs:
    string memory _baseUri,
    string memory _unrevealedUri
)
    GobblersERC721("Art Gobblers", "GOBBLER")
    Owned(msg.sender)
    LogisticVRGDA(
        69.42e18, // Target price.
        0.31e18, // Price decay percent.
        // Max gobblers mintable via VRGDA.
        toWadUnsafe(MAX_MINTABLE),
        0.0023e18 // Time scale.
    )

这里只需关注最后几行:

  • 69.42e18:即目标价格(起始价格)
    p0
  • 0.31e18:表示如果一天内没有拍卖成功,则价格变为前一天价格的
    10.31=69%
  • MAX_MINTABLE:最大可拍卖数,即
    L1
    (注意,不是
    L
  • 0.0023e18:即时间乘数
    s
    10.0023435
    表示预期在435天后拍卖出总量46%的代币,根据gobbler的拍卖计划,大概在第15个月(435天左右)达到拍卖量的46%。

总结

VRGDA提出了一种可定制代币模型的渐进式荷兰拍卖方式,让市场参与拍卖代币的定价。实际上该算法不仅可以应用在NFT拍卖中,也适用于ERC20代币拍卖。VRGDA算法本质上是一种AMM,通过算法动态调整市场价格。

参考文章