前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >像Uniswap一样使用Merkle执行Airdrop

像Uniswap一样使用Merkle执行Airdrop

作者头像
Tiny熊
发布2022-11-07 10:57:26
7180
发布2022-11-07 10:57:26
举报
文章被收录于专栏:深入浅出区块链技术

译文出自:登链翻译计划[1] 译者:Meta[2] 校对:darren[3]

如果你想直接跳过如何实现 Uniswap Airdrop,请继续阅读以下部分:创建 Merkle Airdrop 的步骤

图片来自 https://ccoingossip.com/what-is-airdrop-in-crypto-world/

Airdrop

Airdrop 是指项目决定向一组用户分发代币的事件。以下是实现 Airdrop 的一些潜在方法:

1. 管理员调用函数发送代币

在这种情况下,一个函数实现如下:

代码语言:javascript
复制
function airdrop(address address, uint256 amount) onlyOwner {
  IERC20(token).transfer(account, amount);
}

在这种场景下,所有者必须支付 gas 费才能调用该函数,如果地址列表很大,尤其是在 ETH 上,这将是不可持续的。

2. 在合约上存储白名单地址列表

您可能会实现一个映射,该映射 mapping(address => some struct)存储所有列入白名单的地址以及该地址是否已认领 Airdrop。同样,所有者也必须支付 gas 费用来存储合约的白名单地址列表。

Merkle Airdrop

对于 Merkle Airdrop,实现了相同的目标并具有以下好处:

  • 所有者只需支付 gas 费来创建合约并将 Merkle 根存储在合约上。
  • 列入白名单的地址可以自行调用合约来申领 Airdrop——这也开启了在截止日期前申领 Airdrop 的可能性。

如果你参与 Defi 足够早,就会了解 Uniswap 的初始 Airdrop 是通过 Merkle 完成的——参考 https://github.com/Uniswap/merkle-distributor

什么是 Merkle Airdrop?

Merkle-based Airdrop 是基于默克尔树的数据结构。

我强烈鼓励不熟悉 Merkle 树的人观看此视频 https://www.youtube.com/watch?v=qHMLy5JjbjQ

举个例子,如果我们有 8 个值要存储(A 到 H

  • 形成第二层:Hash(A+B), Hash(C+D), Hash(E+F), Hash(G+H)
  • 形成第三层:Hash(Hash(A+B), Hash(C+D)), Hash(Hash(E+F), Hash(G+H))
  • 最后,第四级显示为橙色。

橙色的就是我们所说的Merkle root,即树的根。

为什么这有效?

Merkle 树是有效的,因为我们不需要遍历整个树来证明我们的值存在于 Merkle 树中。例如,要证明F属于 Merkle 树,我们只需要提供E、H(GH)和H(ABCD),有 Merkle 根的人就可以验证F是否属于 Merkle 树。

验证证明只需要对数级的时间!

创建 Merkle Airdrop 的步骤

代码参考可以在 https://github.com/steve-ng/merkle-airdrop 找到——使用了 2 个主要库

  • 前端:https://github.com/miguelmota/merkletreejs
  • Solidity:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.3/contracts/utils/cryptography/MerkleProof.sol

先决条件

  • 生成他们有资格获得的白名单和金额列表
  • 根据列表生成 Merkle 根

该示例可以在 https://github.com/steve-ng/merkle-airdrop/blob/main/test/MerkleDistributor.ts 中找到

代码语言:javascript
复制
// 生成有资格的白名单和金额列表
const users = [
  { address: "0x..", amount: 10 },
  { address: "0x..", amount: 15 },
  { address: "0x...", amount: 20 },
  { address: "0x..", amount: 30 },
];
// 编码数据结构
const elements = users.map((x) =>
  utils.solidityKeccak256(
    ["address", "uint256"], [x.address, x.amount]));
const merkleTree =
  new MerkleTree(elements, keccak256, { sort: true });
// 生成Merkle根
const root = merkleTree.getHexRoot();

智能合约部分

生成的 Merkle 根存储在你的智能合约中——你可以参考 https://github.com/steve-ng/merkle-airdrop/blob/main/contracts/MerkleDistributor.sol

前端部分

  • 存储所有符合 Airdrop 条件的地址,这样当用户访问你的站点时,他们可以立即查看他们是否符合条件
  • 如果他们符合条件,请使用证明调用智能合约。

同样,代码可以在 https://github.com/steve-ng/merkle-airdrop/blob/main/test/MerkleDistributor.ts#L46 的测试用例中找到

总结

一旦您了解了 Merkle Airdrop 的工作原理,实现就非常简单。该用例不仅适用于 Airdrop,您还可以为具有白名单要求的应用程序实现此功能,如 IDO 或早期访问某些功能。

原文链接:https://steveng.medium.com/performing-merkle-airdrop-like-uniswap-85e43543a592

参考资料

[1]

登链翻译计划: https://github.com/lbc-team/Pioneer

[2]

Meta: https://learnblockchain.cn/people/5578

[3]

darren: https://learnblockchain.cn/people/4859

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Airdrop
    • 1. 管理员调用函数发送代币
      • 2. 在合约上存储白名单地址列表
      • Merkle Airdrop
      • 什么是 Merkle Airdrop?
      • 创建 Merkle Airdrop 的步骤
      • 总结
        • 参考资料
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档