这篇文章详细介绍了区块链 mempool 的概念、工作原理以及如何在以太坊和比特币等不同链上表现不同。文章探讨了如何将交易放入 mempool,交易的传播方式,以及使用私有 mempool 来减少 MEV 攻击的风险。内容结构清晰,适合对区块链相关知识有一定了解的读者。
了解什么是以太坊和比特币上的区块链 mempool,它是如何工作的,以及什么是私有 mempools。
当你将交易发送到区块链时,它实际上要去哪里?交易在“进行中”时,通常被称为“在 mempool 中”,你在 Metamask 中会看到熟悉的“待处理”文本。
mempool 作为区块链交易的入口。在交易可以记录到区块之前,它必须先通过 mempool。
在本指南中,你将学习 什么是区块链 mempool,它是如何工作的,以及在诸如 以太坊 与 比特币 等链中的不同之处。
让我们开始吧。
mempool 是“内存池”的简写,指的是一个交易在区块链节点的内存中存在但尚未被写入区块链的状态。
你可以把 mempool 想象成一个等待的地方或队列,在每笔交易被包含到区块链之前。处于 mempool 中的交易正在等待一个节点抓取该交易并将其包含在一个区块中。
这个术语最初来源于比特币生态系统,不同的区块链节点对此有不同的称谓。
在比特币世界中,mempool 中的交易等待节点挖掘一个包含该交易的区块。在以太坊中,mempool 中的交易等待节点验证并将其包含在一个区块中。
以下是交易如何进入区块链 mempool、被同步、验证、验证并在区块链节点之间传播的过程:
我们称之为“内存池”,因为交易存在于节点的内存中。从技术上讲,区块链中的每个节点都有自己的内存池。一个单一节点的 mempool 本质上只是一个待处理交易的列表。
通常,当人们提到 mempool 时,他们 指的是所有节点的所有 mempool;我们将进一步解释原因。
在实践中,当提到区块链 mempool 时,我们指的是区块链生态系统中任何节点的所有待处理交易。这是因为,大多数时候,拥有 mempool 中交易的节点会将这些排队交易发送到其他节点,希望其中一个节点被选为构建区块并能包含该交易。
当你通过 Metamask、Trezor 或任何钱包向一个节点发送交易时,你是将那笔交易发送给一个单一节点。如果打开你的 Metamask 或浏览器钱包,你会看到一个指向单一节点的 API(URL)。这个节点就是你发送交易的唯一节点,它将在其 mempool 中存储该交易。
一个节点不必将其待处理交易列表散发到其他节点,但为了增加交易被包含的机会,他们通常会这样做。挖掘或验证区块可能需要耗时,涉及计算能力或需要一个节点被选为区块构建者。因此,如果一个节点从未将其待处理交易列表发送到其他节点,那么该交易可能需要很长时间才能被包含!
如果ETH节点A拥有交易T,而他们不将T发送到其他节点,那么ETH节点A将不得不等待他们成为区块构建者时才能包含该交易!如果你查看任何 信标链 上的节点,你会注意到可能要等待几个月才会选中一个节点作为区块构建者!想象一下,等待几个月你的交易被处理。这就是大多数节点将他们的 mempool(队列交易列表)共享给其他节点的原因 → 以增加将交易放入区块的可能性。
基于上述声明,你可能认为 大多数区块链节点应始终共享他们的交易列表,在大多数情况下,你说得对。然而,如果你的交易携带 敏感信息,你可能不想这样做!
如果你共享mempool中的数据,你就是在 告诉其他节点你想发送的交易!这可能给其他节点或恶意用户提供可以用来对付你的信息,并窃取资金、访问权限或其他恶意行为!一个“构建” 区块的节点可以查看传入的交易 并利用这些信息来获取利益。
利用信息和交易排序以获得货币利益的过程被称为 MEV 或“最大可提取价值”,以前称为“矿工可提取价值”。好消息是有解决方案:用户可以使用称为私有区块链 mempools 的东西发送“秘密”交易到区块链。
在深入了解私有 mempools 以及如何帮助保护我们的资产之前,让我们快速看看一种流行的 MEV 方法,称为“前置跑”。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
contract FrontRan {
error BadWithdraw();
bytes32 public s_secretHash;
event success();
event fail();
constructor(bytes32 secretHash) payable {
s_secretHash = secretHash;
}
function withdraw(string memory password) external payable {
if (keccak256(abi.encodePacked(password)) == s_secretHash) {
(bool sent,) = msg.sender.call{value: address(this).balance}("");
if (!sent) {
revert BadWithdraw();
}
emit success();
} else {
emit fail();
}
}
function balance() external view returns (uint256) {
return address(this).balance;
}
}
这个智能合约有一个叫作 withdraw
的函数,如果用户传入正确的密码,智能合约将解码密码并将合约余额发送给输入密码的人。密码以哈希形式存储在链上,存储变量为 s_secretHash
,如果没有密码,破解是非常困难的。
这个合约的理念是,谁被告知密码,谁将获得资金。然而,MEV 使得恶意节点或区块构建者可以成为获取资金的人!
一个恶意节点或 “MEV Bot” 可以在 mempool 中看到某人使用正确密码调用 withdraw
,复制出确切的交易,并使其交易优先通过!他们利用从 mempool 中获取的信息 窃取 FrontRan
合约的资金。
在 Solodit 的“MEV”或“ 前置跑”中,我们经常看到这种攻击向量,这是每个协议构建者在建立协议时必须考虑的事情。
你可以查看 sc-exploits-minimized 存储库中的 MEV 最小化示例,该存储库来自 Cyfrin Updraft 安全和审计课程。
私有区块链 mempools 将我们的 交易发送给一小群承诺不查看交易细节并影响交易排序的节点。
使用这种服务的好处是你不必处理 MEV 的问题。缺点是你必须信任这些节点不会进行 MEV,并且由于参与包含交易的节点较少,可能需要更长的时间才能将你的交易包含在内。
有几种方法可以发送交易而不让其进入 mempool,使用的服务包括:
mempool 是待纳入区块链区块的交易的待处理队列。它很重要,因为每个节点通常会将其待处理交易的列表与其他节点共享,这可能导致 MEV(最大可提取价值)攻击。
- 原文链接: cyfrin.io/blog/what-is-a...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!