译文出自:登链翻译计划[1] 译者:Meta[2] 校对:darren[3]
如果你想直接跳过如何实现 Uniswap Airdrop,请继续阅读以下部分:创建 Merkle Airdrop 的步骤
图片来自 https://ccoingossip.com/what-is-airdrop-in-crypto-world/
Airdrop 是指项目决定向一组用户分发代币的事件。以下是实现 Airdrop 的一些潜在方法:
在这种情况下,一个函数实现如下:
function airdrop(address address, uint256 amount) onlyOwner {
IERC20(token).transfer(account, amount);
}
在这种场景下,所有者必须支付 gas 费才能调用该函数,如果地址列表很大,尤其是在 ETH 上,这将是不可持续的。
您可能会实现一个映射,该映射 mapping(address => some struct)
存储所有列入白名单的地址以及该地址是否已认领 Airdrop。同样,所有者也必须支付 gas 费用来存储合约的白名单地址列表。
对于 Merkle Airdrop,实现了相同的目标并具有以下好处:
如果你参与 Defi 足够早,就会了解 Uniswap 的初始 Airdrop 是通过 Merkle 完成的——参考 https://github.com/Uniswap/merkle-distributor
Merkle-based Airdrop 是基于默克尔树的数据结构。
我强烈鼓励不熟悉 Merkle 树的人观看此视频 https://www.youtube.com/watch?v=qHMLy5JjbjQ
举个例子,如果我们有 8 个值要存储(A 到 H)
橙色的就是我们所说的Merkle root,即树的根。
为什么这有效?
Merkle 树是有效的,因为我们不需要遍历整个树来证明我们的值存在于 Merkle 树中。例如,要证明F属于 Merkle 树,我们只需要提供E、H(GH)和H(ABCD),有 Merkle 根的人就可以验证F是否属于 Merkle 树。
验证证明只需要对数级的时间!
代码参考可以在 https://github.com/steve-ng/merkle-airdrop 找到——使用了 2 个主要库
先决条件
该示例可以在 https://github.com/steve-ng/merkle-airdrop/blob/main/test/MerkleDistributor.ts 中找到
// 生成有资格的白名单和金额列表
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
前端部分
同样,代码可以在 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