
Gitcoin女巫检测方案Top1解读及思考
GITCOIN在两个月前举办了 OpenData 社区黑客马拉松!其中公布了三个重点领域,分别是: 女巫检测、捐款激励措施优化分析、Dune高效分析,其结果也于近日公布。 相信大家最关心的应该是女巫问题,因为今年在OP和APT的刺激下,出现了人人羡慕撸毛党,人人皆是撸毛党的盛况。 今天对女巫检测的第一名开源方案结合自身理解,进行技术向的解读,并在文末给出自己对于女巫检测的一些个人思考。相信看完这篇文章,无论是项目方还是交互者都能有所收获。 注:本文不代表官方观点,仅为个人兴趣解读。 剧透,本文较长,涉及很多技术分析,没耐心的可以直接跳转文末浏览本文总结与个人思考。由于出题者是gitcoin,其主要交互场景为捐赠。但内在逻辑在其他的场景下同样适用(transfer、mint等动作),以下将与项目方进行交互的操作统称为项目交互。方案一:批量转移和交互女巫攻击本质上是用户将资金分散到多个地址,操纵这些地址与项目方合约进行交互的过程。 那么在这个过程中则可以将整个过程拆分两个部分,分别是 批量资金转移和合约批量交互。1.1 批量转账检测选择数据批量转账最简单的就是通过智能合约的方式进行,...
零知识证明和Layer2简介
1、零知识证明简单介绍零知识证明是一方(证明者)向另一方(检验者)在不透露具体内容的条件下证明某命题的方法。 举例: 两个富翁A和B相遇,两人的资产都在1-10亿之间,要如何在不告诉对方自己具体财富的情况下,得出对方是否比自己有钱?区块链中的零知识证明:其实大家可能会疑惑,为什么会用到零知识证明,那其实。在区块链机制中,想要去证明自己有存储某个东西的时候。他其实是不会把这个东西全部发给你来证明?比如说存储了一部电影我,可能不会把整个电影发给你了他,会有一种证明机制去,证明里面的某一块或者是某个东西他是有的,通过提交某个证明去给到系统,系统知道你有存这个东西这种就是其实就是零知识证明的一种,就是不公布具体内容,但是证明某个事情。例如银行贷款必须提交资产证明,通过零知识,无需提供银行房本,住址这些资料。2、Layer2简单介绍起源Layer2的诞生是为了解决以太坊主网拥堵及昂贵的问题,在Eth2.0完成之前保持住以太坊上生态霸主的地位。 广泛层面上,Layer2包含所有和以太坊主链有桥接的项目,包含像Polygon这类几乎独立的区块链; 狭义层面,指的是指以以太坊主网作为最终状态记录...

一文入门如何研投web3项目
封面图片来源B站up:设计师Omega,本文内容素材来自SeeDAO大学105课,主题为: 介绍区块链基础知识和研究方法论,帮助更多朋友具备自主学习区块链和加密知识、判断项目的认知能力。 https://rowan-mollusk-a75.notion.site/SeeDAO-Web3-39fca3ffbe834c949e26c1fd749ace73 课件资料: https://rowan-mollusk-a75.notion.site/105-4197cda0587f473888e2286bcf82e3291、项目基础渠道NFT 也要看成员简介 玩法内容。2、基本思路一个团队 一般都有开发 设计 产品 运营 四个部分。分析团队主要人员的从业经验。投资方背景 可参考Robin整理的文档:投资机构:https://docs.google.com/spreadsheets/d/1saqKNeo9pSl-m_Xa9jVpFyPfg8faCXn6lZ3TEtTKz5Y/htmlview#gid=0roadmap 愿景和每个阶段落地性组件开发情况等等 网址:https://www.cyph...
<100 subscribers

Gitcoin女巫检测方案Top1解读及思考
GITCOIN在两个月前举办了 OpenData 社区黑客马拉松!其中公布了三个重点领域,分别是: 女巫检测、捐款激励措施优化分析、Dune高效分析,其结果也于近日公布。 相信大家最关心的应该是女巫问题,因为今年在OP和APT的刺激下,出现了人人羡慕撸毛党,人人皆是撸毛党的盛况。 今天对女巫检测的第一名开源方案结合自身理解,进行技术向的解读,并在文末给出自己对于女巫检测的一些个人思考。相信看完这篇文章,无论是项目方还是交互者都能有所收获。 注:本文不代表官方观点,仅为个人兴趣解读。 剧透,本文较长,涉及很多技术分析,没耐心的可以直接跳转文末浏览本文总结与个人思考。由于出题者是gitcoin,其主要交互场景为捐赠。但内在逻辑在其他的场景下同样适用(transfer、mint等动作),以下将与项目方进行交互的操作统称为项目交互。方案一:批量转移和交互女巫攻击本质上是用户将资金分散到多个地址,操纵这些地址与项目方合约进行交互的过程。 那么在这个过程中则可以将整个过程拆分两个部分,分别是 批量资金转移和合约批量交互。1.1 批量转账检测选择数据批量转账最简单的就是通过智能合约的方式进行,...
零知识证明和Layer2简介
1、零知识证明简单介绍零知识证明是一方(证明者)向另一方(检验者)在不透露具体内容的条件下证明某命题的方法。 举例: 两个富翁A和B相遇,两人的资产都在1-10亿之间,要如何在不告诉对方自己具体财富的情况下,得出对方是否比自己有钱?区块链中的零知识证明:其实大家可能会疑惑,为什么会用到零知识证明,那其实。在区块链机制中,想要去证明自己有存储某个东西的时候。他其实是不会把这个东西全部发给你来证明?比如说存储了一部电影我,可能不会把整个电影发给你了他,会有一种证明机制去,证明里面的某一块或者是某个东西他是有的,通过提交某个证明去给到系统,系统知道你有存这个东西这种就是其实就是零知识证明的一种,就是不公布具体内容,但是证明某个事情。例如银行贷款必须提交资产证明,通过零知识,无需提供银行房本,住址这些资料。2、Layer2简单介绍起源Layer2的诞生是为了解决以太坊主网拥堵及昂贵的问题,在Eth2.0完成之前保持住以太坊上生态霸主的地位。 广泛层面上,Layer2包含所有和以太坊主链有桥接的项目,包含像Polygon这类几乎独立的区块链; 狭义层面,指的是指以以太坊主网作为最终状态记录...

一文入门如何研投web3项目
封面图片来源B站up:设计师Omega,本文内容素材来自SeeDAO大学105课,主题为: 介绍区块链基础知识和研究方法论,帮助更多朋友具备自主学习区块链和加密知识、判断项目的认知能力。 https://rowan-mollusk-a75.notion.site/SeeDAO-Web3-39fca3ffbe834c949e26c1fd749ace73 课件资料: https://rowan-mollusk-a75.notion.site/105-4197cda0587f473888e2286bcf82e3291、项目基础渠道NFT 也要看成员简介 玩法内容。2、基本思路一个团队 一般都有开发 设计 产品 运营 四个部分。分析团队主要人员的从业经验。投资方背景 可参考Robin整理的文档:投资机构:https://docs.google.com/spreadsheets/d/1saqKNeo9pSl-m_Xa9jVpFyPfg8faCXn6lZ3TEtTKz5Y/htmlview#gid=0roadmap 愿景和每个阶段落地性组件开发情况等等 网址:https://www.cyph...
Share Dialog
Share Dialog


上篇文章我们讲了AMM的原理,并在最后提到了无常损失这个概念。今天这篇文章就来详细介绍无常损失和滑点这两个概念。
当你成为一个做交易流动池添加者(又称做市商、矿工)时,相当于是和所有交易者做一个对手盘,如果所有交易者的盈亏加在一起还是盈利状态,那这部分的利润就来自于每个做市商的无常损失。
同时无常损失不是永久性的,价格经历短暂下跌后又重新恢复,收益也会修正。
那么如何计算无常损失呢?
还是先列出AMM的核心公式:
K = A * B
假设以BNB和BUSD为例:
Cbnb - 池中当前BNB 的数量 为上式中的A
Cbusd - 池中当前BUSD 的数量 为上式中的B
Pbnb - bnb当前价格
Pbusd - busd当前价格 恒定为1u 可省略
当K恒定时,我们可以得到任何时刻池中的BNB和BUSD数量

假如,我们在 1 BNB = 500 BUSD 的时候,组了一组 LP 。我们拿出了 20 个 BNB 和 10000 个 BUSD 进行 LP 流动性提供代币兑换。此时我们得到了这几个变量:

并且,我们保证此时的 K 也是后续所有情况下的常数 K,即组完 LP 代币后即时生效的常数。
过了 10 天,BNB的价格在外部的交易所中开始上涨。中心化交易所的BNB价格从500涨到了550美元。当前价格为 1 BNB = 550 BUSD 。于是其他市场参与者(称为套利者)就开始工作了。套利者注意到CEX和DEX之间的价格差异,并将其视为套利机会,俗称搬砖。
当搬砖结束后,DEX中的BNB与BUSD的价格也到达了:1 BNB = 550 BUSD

我们可以得到此时的LP池中BNB和BUSD数量:

这意味着:在 BNB 涨价到 550 BUSD 时,我们发现等值的 LP Token 兑换只能换回 19.069 个 BNB 和 10488.09 个 BUSD。如果我们来换算成 BUSD 作为单位来对比一下前后收益:
价格变化前我的总投入为:
20BNB*500 + 10000BUSD = 20000U
不进行LP挖矿,当BNB 涨价到 550 BUSD时,同数量BNB、BUSD情况
20BNB*550 + 10000BUSD = 21000U
进行LP挖矿,当BNB 涨价到 550 BUSD时,根据AMM推导,拿回资产的总价值
19.069BNB*550 + 10488.09BUSD = 20976.04U
根据计算,发现在BNB上涨时,组 LP Token 比持有亏损 21000−20976.04=23.96 U。损失比例为 23.96/20000 = 0.11%.
我们看完了BNB上涨时的情况,再来看一下BNB下跌时的情况

LP挖矿价值: 21.082BNB*450 + 9486.83BUSD = 18973.73U
持有价值:20BNB*450 + 10000BUSD = 19000U
根据计算,发现在BNB上涨时,组 LP Token 比持有亏损 19000−18973.73=26.27 U。损失比例为 26.27/20000 = 0.13%.
经过以上分析,无论是BNB上涨还是下跌,组LP都比持有代币出现亏损,这就是所说的无偿损失。其中0.12% 和 0.13%分别为 BNB相对BUSD涨幅10%、BNB相对BUSD跌幅10%后,无偿损失的比率值。
在 Uniswap: A Good Deal for Liquidity Providers?这篇论文中,给出了一张代币增长率和无偿损失的关系图:


项目方已经想到了这个问题,也给出了解决方案,让矿工们获利
用 BNB 和 BUSD 换取 BNB-BUSD LP 代币:相当于你为 BNB 和 BUSD 流动池增加了代币。并且你获得了 BNB ⇄ BUSD 这个交易中的对应代币份额的抽成奖励占比;
这里就体现了 DEX 通过换取流动性证明,从而完成了一种激励模式;
PancakeSwap 在文档中提到,其 0.2% 的交易手续费当中,有 0.17% 的比例是提供给 LP 持有者的抽成奖励的。剩下的 0.03% 是平台的利润。具体规则可以查看官方文档。
BNB-BUSD 代币挖矿:当我们拿到 BNB-BUSD LP Token 之后,我们可以继续放在 PancakeSwap 的 Farms 中进行挖矿(其年化 APR 如以下截图所示)。

其实 LP Token 也是一种代币,它也拥有自己的合约地址。比如 Pancakeswap 上的 BNB-BUSD LP 代币合约地址 0x58F876857a02D6762E0101bb5C46A8c1ED44Dc16 。是代币肯定就有一个方式来计算数量,这里 Pancakeswap 和 Uniswap 的计算方式一样,采用以下公式:

所以,当我们用 20 个 BNB 和 10000 个 BUSD 兑换 LP 代币的时候,我们会获得大约 447.21 个 LP Token。
有些土矿是支持单币挖矿的,这样则可能不会出现无常损失,还可能有得赚。就拿上面的例子BNB/BUSD例子,如果你只存入10000BUSD,匹配到存20个BNB的组成LP,当BNB涨到550时,你将得到10488.09BUSD,是盈利的,亏损的部分被单BNB挖矿的人承担。下图给出了不同情况下的收益率。


基于之前AMM的介绍,我们都知道DEX的交易模式并非订单簿的一次性成交,AMM的核心公式X*Y=K,实际的交易中因扣除手续费,实际的K值并非恒定,但幅度非常小,为了方便计算滑点,我们这里暂且不计手续费的影响。
什么是滑点,滑点一般指预设成交价位与真实成交价位的偏差。恒定乘积AMM中同样存在滑点,一旦发生交易,池中资产的储备发生变化,资产实际的交易执行价就会发生变化,产生滑点。交易额越大,滑点越大,交易者的损失就越大。
滑点有2种定义。本文采用第二种定义方法,反映交易者成交后的损失。
(成交平均价格-初始价格)/ 初始价格 uniswap V3
(成交后价格-初始价格)/ 初始价格 uniswap V1/V2
这里使用第二种。
为了简化推导,依旧使用BNB和BUSD对,利用BUSD购买BNB。y代表BNB在LP池中数量,x代表BUSD数量。


其中 NewPriceBNB = dx/dy ,可以在图中看出真实BNB价格是此时的斜率。

最终带入得到

假设当前BNB/BUSD池中有 20 个 BNB 和 10000 个 BUSD 进行 LP 流动性提供代币兑换。
此时可计算得到此时的比率为 1 BNB = 500 BUSD 。
此时我们想用250BUSD兑换0.5BNB,理论上可行,但是实际上却不行。
根据核心公式
K = X*Y
20*10000 = (10000+250)*(20-dy)
=> dy = 0.487
这就是说 此时只能用 250BUSD 换的 0.487个BNB。此时的BNB价格为
PBNB = 250/0.487 = 513BUSD
根据公式:
slippage = dx/x = 250/10000 = 2.5%
根据推导:
slippage = (513-500)/500 = 0.026 = 2.5%
交易量dx越大,产生的滑点就越大,偏离实际价位就越大,而池中的资金储备越多、交易深度越大,则能尽量减少滑点的溢价,使用户的交易损耗降低。
一般池子内的锁仓量(TVL)也就是池子深度代表了项目的热度及安全性,是非常重要的数字指标,深度越小,项目越危险,实际兑换过程中,根据滑点可以迅速计算出池子TVL,作为我们投资的辅助依据。
在DEX进行交易时,有一个参数为PriceImpact


带入公式:
x = 3/9.32% -3 = 29.21U
poocoin结果验证基本一致:

故TVL 锁仓29u 。
希望通过这篇博客,让大家能更深入的弄清楚AMM中最重要的两个概念,希望帮助每个人对DeFi有更加深入了解。
这里是berwin的Mirror,创作不易,希望看完顺手关注我的Twitter,感激不尽。
https://twitter.com/coolberwin_eth
参考资料:
https://www.desgard.com/2021/04/25/defi-lp-math.html
https://zhuanlan.zhihu.com/p/375371767
上篇文章我们讲了AMM的原理,并在最后提到了无常损失这个概念。今天这篇文章就来详细介绍无常损失和滑点这两个概念。
当你成为一个做交易流动池添加者(又称做市商、矿工)时,相当于是和所有交易者做一个对手盘,如果所有交易者的盈亏加在一起还是盈利状态,那这部分的利润就来自于每个做市商的无常损失。
同时无常损失不是永久性的,价格经历短暂下跌后又重新恢复,收益也会修正。
那么如何计算无常损失呢?
还是先列出AMM的核心公式:
K = A * B
假设以BNB和BUSD为例:
Cbnb - 池中当前BNB 的数量 为上式中的A
Cbusd - 池中当前BUSD 的数量 为上式中的B
Pbnb - bnb当前价格
Pbusd - busd当前价格 恒定为1u 可省略
当K恒定时,我们可以得到任何时刻池中的BNB和BUSD数量

假如,我们在 1 BNB = 500 BUSD 的时候,组了一组 LP 。我们拿出了 20 个 BNB 和 10000 个 BUSD 进行 LP 流动性提供代币兑换。此时我们得到了这几个变量:

并且,我们保证此时的 K 也是后续所有情况下的常数 K,即组完 LP 代币后即时生效的常数。
过了 10 天,BNB的价格在外部的交易所中开始上涨。中心化交易所的BNB价格从500涨到了550美元。当前价格为 1 BNB = 550 BUSD 。于是其他市场参与者(称为套利者)就开始工作了。套利者注意到CEX和DEX之间的价格差异,并将其视为套利机会,俗称搬砖。
当搬砖结束后,DEX中的BNB与BUSD的价格也到达了:1 BNB = 550 BUSD

我们可以得到此时的LP池中BNB和BUSD数量:

这意味着:在 BNB 涨价到 550 BUSD 时,我们发现等值的 LP Token 兑换只能换回 19.069 个 BNB 和 10488.09 个 BUSD。如果我们来换算成 BUSD 作为单位来对比一下前后收益:
价格变化前我的总投入为:
20BNB*500 + 10000BUSD = 20000U
不进行LP挖矿,当BNB 涨价到 550 BUSD时,同数量BNB、BUSD情况
20BNB*550 + 10000BUSD = 21000U
进行LP挖矿,当BNB 涨价到 550 BUSD时,根据AMM推导,拿回资产的总价值
19.069BNB*550 + 10488.09BUSD = 20976.04U
根据计算,发现在BNB上涨时,组 LP Token 比持有亏损 21000−20976.04=23.96 U。损失比例为 23.96/20000 = 0.11%.
我们看完了BNB上涨时的情况,再来看一下BNB下跌时的情况

LP挖矿价值: 21.082BNB*450 + 9486.83BUSD = 18973.73U
持有价值:20BNB*450 + 10000BUSD = 19000U
根据计算,发现在BNB上涨时,组 LP Token 比持有亏损 19000−18973.73=26.27 U。损失比例为 26.27/20000 = 0.13%.
经过以上分析,无论是BNB上涨还是下跌,组LP都比持有代币出现亏损,这就是所说的无偿损失。其中0.12% 和 0.13%分别为 BNB相对BUSD涨幅10%、BNB相对BUSD跌幅10%后,无偿损失的比率值。
在 Uniswap: A Good Deal for Liquidity Providers?这篇论文中,给出了一张代币增长率和无偿损失的关系图:


项目方已经想到了这个问题,也给出了解决方案,让矿工们获利
用 BNB 和 BUSD 换取 BNB-BUSD LP 代币:相当于你为 BNB 和 BUSD 流动池增加了代币。并且你获得了 BNB ⇄ BUSD 这个交易中的对应代币份额的抽成奖励占比;
这里就体现了 DEX 通过换取流动性证明,从而完成了一种激励模式;
PancakeSwap 在文档中提到,其 0.2% 的交易手续费当中,有 0.17% 的比例是提供给 LP 持有者的抽成奖励的。剩下的 0.03% 是平台的利润。具体规则可以查看官方文档。
BNB-BUSD 代币挖矿:当我们拿到 BNB-BUSD LP Token 之后,我们可以继续放在 PancakeSwap 的 Farms 中进行挖矿(其年化 APR 如以下截图所示)。

其实 LP Token 也是一种代币,它也拥有自己的合约地址。比如 Pancakeswap 上的 BNB-BUSD LP 代币合约地址 0x58F876857a02D6762E0101bb5C46A8c1ED44Dc16 。是代币肯定就有一个方式来计算数量,这里 Pancakeswap 和 Uniswap 的计算方式一样,采用以下公式:

所以,当我们用 20 个 BNB 和 10000 个 BUSD 兑换 LP 代币的时候,我们会获得大约 447.21 个 LP Token。
有些土矿是支持单币挖矿的,这样则可能不会出现无常损失,还可能有得赚。就拿上面的例子BNB/BUSD例子,如果你只存入10000BUSD,匹配到存20个BNB的组成LP,当BNB涨到550时,你将得到10488.09BUSD,是盈利的,亏损的部分被单BNB挖矿的人承担。下图给出了不同情况下的收益率。


基于之前AMM的介绍,我们都知道DEX的交易模式并非订单簿的一次性成交,AMM的核心公式X*Y=K,实际的交易中因扣除手续费,实际的K值并非恒定,但幅度非常小,为了方便计算滑点,我们这里暂且不计手续费的影响。
什么是滑点,滑点一般指预设成交价位与真实成交价位的偏差。恒定乘积AMM中同样存在滑点,一旦发生交易,池中资产的储备发生变化,资产实际的交易执行价就会发生变化,产生滑点。交易额越大,滑点越大,交易者的损失就越大。
滑点有2种定义。本文采用第二种定义方法,反映交易者成交后的损失。
(成交平均价格-初始价格)/ 初始价格 uniswap V3
(成交后价格-初始价格)/ 初始价格 uniswap V1/V2
这里使用第二种。
为了简化推导,依旧使用BNB和BUSD对,利用BUSD购买BNB。y代表BNB在LP池中数量,x代表BUSD数量。


其中 NewPriceBNB = dx/dy ,可以在图中看出真实BNB价格是此时的斜率。

最终带入得到

假设当前BNB/BUSD池中有 20 个 BNB 和 10000 个 BUSD 进行 LP 流动性提供代币兑换。
此时可计算得到此时的比率为 1 BNB = 500 BUSD 。
此时我们想用250BUSD兑换0.5BNB,理论上可行,但是实际上却不行。
根据核心公式
K = X*Y
20*10000 = (10000+250)*(20-dy)
=> dy = 0.487
这就是说 此时只能用 250BUSD 换的 0.487个BNB。此时的BNB价格为
PBNB = 250/0.487 = 513BUSD
根据公式:
slippage = dx/x = 250/10000 = 2.5%
根据推导:
slippage = (513-500)/500 = 0.026 = 2.5%
交易量dx越大,产生的滑点就越大,偏离实际价位就越大,而池中的资金储备越多、交易深度越大,则能尽量减少滑点的溢价,使用户的交易损耗降低。
一般池子内的锁仓量(TVL)也就是池子深度代表了项目的热度及安全性,是非常重要的数字指标,深度越小,项目越危险,实际兑换过程中,根据滑点可以迅速计算出池子TVL,作为我们投资的辅助依据。
在DEX进行交易时,有一个参数为PriceImpact


带入公式:
x = 3/9.32% -3 = 29.21U
poocoin结果验证基本一致:

故TVL 锁仓29u 。
希望通过这篇博客,让大家能更深入的弄清楚AMM中最重要的两个概念,希望帮助每个人对DeFi有更加深入了解。
这里是berwin的Mirror,创作不易,希望看完顺手关注我的Twitter,感激不尽。
https://twitter.com/coolberwin_eth
参考资料:
https://www.desgard.com/2021/04/25/defi-lp-math.html
https://zhuanlan.zhihu.com/p/375371767
No comments yet