为了方便理解,我将这些环节拆分成了几个步骤: 用户交易(transaction):当我们在钱包里进行转账或是在某个去中心化交易所里进行代币的兑换亦或是 Mint 某个 NFT,从链上的数据结构来看都是类似的。
如上图所示就是对一个 NFT 合约进行 Mint 所需要的信息,其中最重要的信息就是 data,在上图 data 里面 0x1249c58b 就是对 mint()这个 function 的调用。而如果我们把 data 里面的数据换成 0x 那么就代表一个普通的转账。通过这些 data 和 value 的数据,我们可以清晰地判断用户这一笔交易的意图和作用。 内存池(mempool):当用户使用公共的节点远程调用服务时(例如 Metamask 默认使用 Infura 的以太坊节点调用服务),交易会跑到内存池子里。内存池是在节点收到交易并且把他包含到区块的一个缓冲区,其作用就是帮助节点对各类交易进行检查,并且判断交易的输出和签名的合法性、有效性。
转移服务:有一些黑客会利用用户被盗钱包中的 NFT 来进行钓鱼,通常这个钱包里面的 ETH 是不够支付转移的 Gas 费用的。当受害者想要转入 Gas 来进行转移时,黑客就会使用脚本把 Gas 费转走。我们可以使用 Flashbots 赶在黑客把你转入的 Gas 费用拿走之前,将私钥被盗钱包中的 NFT 取回来。设立一笔转入被黑钱包的交易,再创建一个从被害钱包转出的交易,将这两笔交易放在捆绑包中并且发送给区块构建者。由于这两笔交易在区块上是连续的,黑客没有办法阻止你转出被盗的 NFT。当一个搜索者完成了捆绑包(bundle)的构建时,他可以将这个捆绑包发送到其指定的区块构建者中。
例子:钱包供应商可以设立一个专属的暗池节点,使得所有使用该钱包的转账和交易都通过这个暗池来执行:a 用户在 Sushiswap 上面将 a 代币换取 b 代币;b 用户则在 Uniswap 上面将 b 代币换取 a 代币。这两笔订单组合的一瞬间会导致 Uni 和 Sushi 两个交易所的 a-b 交易兑换率失衡。套利者可以将这两笔订单拍卖下来并且将自己的套利策略捆绑起来实现闪电贷套利等等。当然,这两笔交易必须要达到一定量级才可以实现不同池子的兑换失衡。也只有当交易规模达到一定量级时才可以实现,例如做市商拍卖下 20 笔用户的订单来完成一笔巨大的套利。当然这一种模式也存在大量的风险,例如用户本身的交易损失和区块构建者的过度中心化。