EIP-712 使用详解
之前的文章我们介绍过如何对数据进行签名,利用签名技术我们可以实现一些功能例如白名单校验等。但是这种签名技术的应用场景比较简单,一般就是给一串字符串,或者一串哈希签名,如果我们想为更复杂的数据签名就无法实现了。 EIP-712 的出现就是为了解决这个问题,利用 EIP-712,我们可以对更大的数据集,例如对结构体进行签名。那么这种签名格式有什么实际的应用场景呢。使用过 Uniswap,PancakeSwap 等 DEX 的朋友应该有印象,在移除 LP 流动性的时候,我们需要先签名,然后再发送一笔交易移除流动性。正常情况下,其实应该我们先调用 LP 代币的授权方法,授权 DEX 合约可以转移我们的 LP,然后再去移除流动性。而这种二合一的实现正是应用了 EIP-712。它帮助我们仅仅签名一次,就可以将两步交易合并为一步交易,从而节省 Gas 费用。这篇文章我们就来看看 EIP-712 到底是怎么使用的。基本结构EIP712Domain顾名思义,是一个与域相关的结构体,总共包含五个字段:name,合约或者协议的名称version,合约的版本chainId,合约部署的链 Id,一般使用 ...
流动性挖矿-合约原理详解
流动性挖矿应该是上个牛市最火热的内容,基本上整个 DeFi 都是在围绕着流动性挖矿展开的,今天我们就来看看它到底是什么以及合约代码层面是怎么实现的。流动性挖矿简介首先我们先从用户的角度来理解一下流动性挖矿是什么,实际上就是用户通过在合约中质押一个 token 从而赚取另一个 token 的过程。例如,SushiSwap 最初推出的 DEX 流动性挖矿,用户可以通过将 SushiSwap 的 LP token 质押到合约中赚取 Sushi token。那么这个奖励具体是怎么发放以及如何实现的呢?我们今天就来研究一下这部分内容。 先来看几个例子: 一:假设有一个流动性挖矿的合约,可以质押 A token 赚取 B token。它在 0 秒时开始活动,每秒奖励 R 个 B token。此时有用户 Alice 在第 3 秒时质押了 2 个 A token,并且之后没有其他人参与,在第 8 秒时取出 token,图示:那么他在此时获得的收益就是:5R = (2 / 2) * (8 - 3) * R 其中,第一个 2 是用户 A 质押的数量,第二个 2 是合约中质押的总量,(8-3)是用户 ...
CREATE2 操作码使用方法详解
CREATE2 是一个可以在合约中创建合约的操作码。我们先来举个例子看看它能干什么:这段代码是 Uniswap v2-core 里面的工厂合约代码,使用 create2 操作码创建了 pair 合约,返回值是 pair 的地址,这样就可以逻辑中直接使用其地址进行接下来的操作。 那么 create2 到底是怎么使用呢,根据官方 EIP 文档,create2 一共接收四个参数,分别是:endowment(创建合约时往合约中打的 ETH 数量)memory_start(代码在内存中的起始位置,一般固定为 add(bytecode, 0x20) )memory_length(代码长度,一般固定为 mload(bytecode) )salt(随机数盐)这里要注意的是第一个参数如果大于 0 的话,需要待部署合约的构造方法带有 payable。随机数盐是由用户自定,须为 bytes32 格式,例如在上面 Uniswap 的例子中,salt 为:bytes32 salt = keccak256(abi.encodePacked(token0, token1)); create2 还有一个优点,相...
Smart Contract Developer
EIP-712 使用详解
之前的文章我们介绍过如何对数据进行签名,利用签名技术我们可以实现一些功能例如白名单校验等。但是这种签名技术的应用场景比较简单,一般就是给一串字符串,或者一串哈希签名,如果我们想为更复杂的数据签名就无法实现了。 EIP-712 的出现就是为了解决这个问题,利用 EIP-712,我们可以对更大的数据集,例如对结构体进行签名。那么这种签名格式有什么实际的应用场景呢。使用过 Uniswap,PancakeSwap 等 DEX 的朋友应该有印象,在移除 LP 流动性的时候,我们需要先签名,然后再发送一笔交易移除流动性。正常情况下,其实应该我们先调用 LP 代币的授权方法,授权 DEX 合约可以转移我们的 LP,然后再去移除流动性。而这种二合一的实现正是应用了 EIP-712。它帮助我们仅仅签名一次,就可以将两步交易合并为一步交易,从而节省 Gas 费用。这篇文章我们就来看看 EIP-712 到底是怎么使用的。基本结构EIP712Domain顾名思义,是一个与域相关的结构体,总共包含五个字段:name,合约或者协议的名称version,合约的版本chainId,合约部署的链 Id,一般使用 ...
流动性挖矿-合约原理详解
流动性挖矿应该是上个牛市最火热的内容,基本上整个 DeFi 都是在围绕着流动性挖矿展开的,今天我们就来看看它到底是什么以及合约代码层面是怎么实现的。流动性挖矿简介首先我们先从用户的角度来理解一下流动性挖矿是什么,实际上就是用户通过在合约中质押一个 token 从而赚取另一个 token 的过程。例如,SushiSwap 最初推出的 DEX 流动性挖矿,用户可以通过将 SushiSwap 的 LP token 质押到合约中赚取 Sushi token。那么这个奖励具体是怎么发放以及如何实现的呢?我们今天就来研究一下这部分内容。 先来看几个例子: 一:假设有一个流动性挖矿的合约,可以质押 A token 赚取 B token。它在 0 秒时开始活动,每秒奖励 R 个 B token。此时有用户 Alice 在第 3 秒时质押了 2 个 A token,并且之后没有其他人参与,在第 8 秒时取出 token,图示:那么他在此时获得的收益就是:5R = (2 / 2) * (8 - 3) * R 其中,第一个 2 是用户 A 质押的数量,第二个 2 是合约中质押的总量,(8-3)是用户 ...
CREATE2 操作码使用方法详解
CREATE2 是一个可以在合约中创建合约的操作码。我们先来举个例子看看它能干什么:这段代码是 Uniswap v2-core 里面的工厂合约代码,使用 create2 操作码创建了 pair 合约,返回值是 pair 的地址,这样就可以逻辑中直接使用其地址进行接下来的操作。 那么 create2 到底是怎么使用呢,根据官方 EIP 文档,create2 一共接收四个参数,分别是:endowment(创建合约时往合约中打的 ETH 数量)memory_start(代码在内存中的起始位置,一般固定为 add(bytecode, 0x20) )memory_length(代码长度,一般固定为 mload(bytecode) )salt(随机数盐)这里要注意的是第一个参数如果大于 0 的话,需要待部署合约的构造方法带有 payable。随机数盐是由用户自定,须为 bytes32 格式,例如在上面 Uniswap 的例子中,salt 为:bytes32 salt = keccak256(abi.encodePacked(token0, token1)); create2 还有一个优点,相...
Smart Contract Developer

Subscribe to xyyme.eth

Subscribe to xyyme.eth
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
在这次 APE 空投活动中,有科学家通过闪电贷套利获得巨额收益,这篇文章就来详细分析一下这笔套利交易的过程。
这次套利能够成功的前提在于 APE 的空投合约是根据用户的实时持仓来发放空投,而不是快照。可以看看我之前的这篇文章,详细分析了 APE 的空投合约。
先来看看这次套利的主要步骤:
先从 OpenSea 购买了 ID 为 1060 的 BAYC NFT(这是前一笔交易)
创建合约,并将 1060 的 BAYC 转入合约
通过 NFTX 平台的闪电贷功能 FlashMint 出 5.2 个 BAYC token(这个是 NFTX 平台发行的碎片化代币,下面用 BAYC(x) 表示,以区分正常的 BAYC NFT)
用这 5.2 个 BAYC(x) 在 NFTX 平台 redeem 5 个 BAYC NFT,剩余 0.2 个 BAYC(x) 用作平台手续费
此时套利合约拥有 6 个 BAYC,根据这 6 个 NFT 领取相应数量的 APE
将这 6 个 BAYC 再从 NFTX 平台 mint 成 6 个 BAYC(x)
其中 5.2 个 BAYC(x) 用作闪电贷还款(此时平台没有手续费),0.6 个作为 mint 手续费,剩余 0.2 个则在 SushiSwap 中出售
转出领取的所有 APE 到套利者地址中
上述步骤可以对应到 EtherScan 的 Token 流转图中:

注意这里只显示了 ERC20 的流转过程。
同时,我们也可以查看整个交易的堆栈信息,确认交易过程:



整个套利交易我们就介绍到这里,可以看到套利者非常熟练地调用了 NFTX 平台的各个接口。接下来我们就来看看 NFTX 到底是个什么平台,方便我们也能够在未来的某一天利用上这个平台为自己创造巨额收益~
先看看文档:

从文档中我们可以看出,NFTX 是一个为 NFT 创造流动性的平台,用户可以将 NFT 存到平台中,获取到平台发行的 ERC20 代币 vToken,比例是 1:1。也就是说用户可以将 NFT 换成 vToken,也可以将 vToken 换成 NFT。我们前面的合约分析也说明了这一点。
我们接下来再看看它的代码,看看到底是怎么实现的。
闪电贷代码:

redeem 代码:

mint 的代码:

这三个方法是此次套利过程中主要调用的方法,可以看到整体的逻辑还是比较清晰的。这里有一个小细节需要注意一下:redeem 和 mint 方法都有防重入锁,而 flashLoan 是没有的。这一点很关键,因为 redeem 和 mint 是顺序执行,且这两个方法是被包在 flashLoan 中执行的,redeem 和 mint 之间的重入锁并不冲突,但是如果 flashLoan 也加上了重入锁,那么就与前两个方法冲突,交易是无法执行的。
这次套利过程非常精巧,完美利用了 NFTX 这个平台的功能。可以看出套利者非常熟悉这个平台,主要也是 APE 的实时持仓空投规则帮了大忙,确实是可遇不可求了。
在这次 APE 空投活动中,有科学家通过闪电贷套利获得巨额收益,这篇文章就来详细分析一下这笔套利交易的过程。
这次套利能够成功的前提在于 APE 的空投合约是根据用户的实时持仓来发放空投,而不是快照。可以看看我之前的这篇文章,详细分析了 APE 的空投合约。
先来看看这次套利的主要步骤:
先从 OpenSea 购买了 ID 为 1060 的 BAYC NFT(这是前一笔交易)
创建合约,并将 1060 的 BAYC 转入合约
通过 NFTX 平台的闪电贷功能 FlashMint 出 5.2 个 BAYC token(这个是 NFTX 平台发行的碎片化代币,下面用 BAYC(x) 表示,以区分正常的 BAYC NFT)
用这 5.2 个 BAYC(x) 在 NFTX 平台 redeem 5 个 BAYC NFT,剩余 0.2 个 BAYC(x) 用作平台手续费
此时套利合约拥有 6 个 BAYC,根据这 6 个 NFT 领取相应数量的 APE
将这 6 个 BAYC 再从 NFTX 平台 mint 成 6 个 BAYC(x)
其中 5.2 个 BAYC(x) 用作闪电贷还款(此时平台没有手续费),0.6 个作为 mint 手续费,剩余 0.2 个则在 SushiSwap 中出售
转出领取的所有 APE 到套利者地址中
上述步骤可以对应到 EtherScan 的 Token 流转图中:

注意这里只显示了 ERC20 的流转过程。
同时,我们也可以查看整个交易的堆栈信息,确认交易过程:



整个套利交易我们就介绍到这里,可以看到套利者非常熟练地调用了 NFTX 平台的各个接口。接下来我们就来看看 NFTX 到底是个什么平台,方便我们也能够在未来的某一天利用上这个平台为自己创造巨额收益~
先看看文档:

从文档中我们可以看出,NFTX 是一个为 NFT 创造流动性的平台,用户可以将 NFT 存到平台中,获取到平台发行的 ERC20 代币 vToken,比例是 1:1。也就是说用户可以将 NFT 换成 vToken,也可以将 vToken 换成 NFT。我们前面的合约分析也说明了这一点。
我们接下来再看看它的代码,看看到底是怎么实现的。
闪电贷代码:

redeem 代码:

mint 的代码:

这三个方法是此次套利过程中主要调用的方法,可以看到整体的逻辑还是比较清晰的。这里有一个小细节需要注意一下:redeem 和 mint 方法都有防重入锁,而 flashLoan 是没有的。这一点很关键,因为 redeem 和 mint 是顺序执行,且这两个方法是被包在 flashLoan 中执行的,redeem 和 mint 之间的重入锁并不冲突,但是如果 flashLoan 也加上了重入锁,那么就与前两个方法冲突,交易是无法执行的。
这次套利过程非常精巧,完美利用了 NFTX 这个平台的功能。可以看出套利者非常熟悉这个平台,主要也是 APE 的实时持仓空投规则帮了大忙,确实是可遇不可求了。
No activity yet