本文介绍了EIP-1559的背景及其对以太坊Gas费的影响,并通过ethers.js库演示了如何发送EIP-1559交易。文章详细解释了EIP-1559的新机制,如baseFeePerGas、maxPriorityFeePerGas和maxFeePerGas,并提供了完整的代码示例和操作步骤。
尽管以太坊一直在尝试扩展,但它遇到了一些 gas 价格问题。为了解决这个问题,许多Layer2解决方案和侧链应运而生,但以太坊是主链,在某些时候,它必须得到改进。EIP-1559 被引入以减少链上 gas 价格的波动性。在本指南中,我们将学习如何使用 ethers.js 发送 EIP-1559 交易。
先决条件
依赖项 | 版本 |
---|---|
node.js | v18.13.0 |
ethers.js | 5.7 |
EIP 代表以太坊改进提案,它定义了以太坊协议的标准。由于以太坊是开源的,任何人都可以提出 EIP。之后,这些 EIP 在经过批准过程后可以集成到核心协议中。
在 EIP-1559 之前,以太坊链上 gas 费用较低的交易通常会长时间处于待处理状态,因为区块总是被支付最高 gas 费用的交易填满。为了解决这个问题,EIP-1559 引入了一个更复杂和公平的 gas 费用系统,每个区块都有一个基础费用和给矿工的小费。基础费用确保交易被包含在区块中,而小费则是为了奖励矿工。在 EIP-1559 中,区块的 gas 限制翻了一番。EIP-1559 之前 100% 满的区块在 EIP-1559 之后只有 50% 满,这意味着有更多的空间可以容纳额外的交易。
现在让我们了解 1559 之后 gas 的新变量/机制:
baseFeePerGas:这是协议在每个区块头生成的每单位 gas 的基础费用。baseFeePerGas 要求交易的最小乘数 gasUsed 属性才能被添加到区块中。例如,你的交易的 gas 费用将是 baseFeePerGas*gasUsed。这是每个区块中交易费用被销毁的部分。每个区块的 baseFeePerGas 可以增加或减少 12.5%,具体取决于区块与前一个区块相比的填充程度。例如,如果 100% 满,则 baseFeePerGas 增加 12.5%;如果 50% 满,则保持不变;如果 0% 满,则减少 12.5%。
maxPriorityFeePerGas:由用户设置。这是给矿工的 gas 部分。用户可以使用此变量为高优先级交易支付溢价。每当一个区块 100% 满时,这就是交易优先级的决定因素,就像 1559 之前一样。
maxFeePerGas:由用户设置。这表示用户愿意为交易支付的最高 gas 费用(包括 baseFeePerGas + maxPriorityFeePerGas)。一旦交易确认,maxFeePerGas 与 baseFeePerGas + maxPriorityFeePerGas 之间的差额将退还给交易的发送者。
现在我们已经了解了 EIP-1559,通过发送一个 EIP-1559 交易来看看它的实际应用会很好。
我们发送交易的第一步是设置一个以太坊测试网端点;我们将使用 Sepolia 测试网进行交易,因为在以太坊主网上发送交易会消耗真实的 ETH。为了方便起见,我们将在这里创建一个免费的 QuickNode 账户 here 并轻松生成一个新的端点。
保存 HTTP URL,因为我们稍后会使用它。
如果你需要 Sepolia 测试网上的 ETH,多链 QuickNode Faucet 可以轻松获取测试 ETH!
导航到多链 QuickNode Faucet 并连接你的钱包或粘贴你的钱包地址以获取测试 ETH。你还可以发布推文来请求以获得奖励!
接下来,我们来看看所需的库。
我们将使用 ethers.js 库来发送我们的交易,并使用 log-timestamp 库来记录脚本执行的每个步骤的时间。
创建一个项目目录并进入该目录:
mkdir eipDemo
cd eipDemo
然后,使用默认选项初始化一个 npm 项目:
npm init --y
为了安装这些库,我们将使用 node.js 包管理器 npm。
npm install log-timestamp ethers@5.7
确保你的 ethers.js 安装版本是 5.7
现在,我们应该在我们的项目目录中安装了所需的库。
创建一个名为 index.js 的 JavaScript 文件,并将以下代码粘贴到其中:
require("log-timestamp");
const ethers = require("ethers");
const privateKey = ("ADD_YOUR_PRIVATE_KEY_HERE").toString('hex');
const wallet = new ethers.Wallet(privateKey);
const address = wallet.address;
console.log("Public Address:", address);
const httpsUrl = "ADD_YOUR_HTTP_URL_HERE";
console.log("HTTPS Target", httpsUrl);
const init = async function () {
const httpsProvider = new ethers.providers.JsonRpcProvider(httpsUrl);
let nonce = await httpsProvider.getTransactionCount(address);
console.log("Nonce:", nonce);
let feeData = await httpsProvider.getFeeData();
console.log("Fee Data:", feeData);
const tx = {
type: 2,
nonce: nonce,
to: "0x8D97689C9818892B700e27F316cc3E41e17fBeb9", // 你想要发送到的地址
maxPriorityFeePerGas: feeData["maxPriorityFeePerGas"], // 推荐的 maxPriorityFeePerGas
maxFeePerGas: feeData["maxFeePerGas"], // 推荐的 maxFeePerGas
value: ethers.utils.parseEther("0.01"), // .01 ETH
gasLimit: "21000", // 基本交易正好消耗 21000 gas
chainId: 11155111, // Sepolia 链 ID;如果使用其他网络,请更改
};
console.log("Transaction Data:", tx);
const signedTx = await wallet.signTransaction(tx);
console.log("Signed Transaction:", signedTx);
const txHash = ethers.utils.keccak256(signedTx);
console.log("Precomputed txHash:", txHash);
console.log(`https://sepolia.etherscan.io/tx/${txHash}`);
httpsProvider.sendTransaction(signedTx).then(console.log);
};
init();
将第 4 行的 ADD_YOUR_PRIVATE_KEY_HERE 替换为你的钱包私钥,并将第 10 行的 ADD_YOUR_HTTP_URL_HERE 替换为我们之前检索到的端点的 HTTP URL。
上面的代码解释:
第 1-2 行:导入 log-timestamp 和 ethers 库。
第 4-5 行:将我们的私钥保存在 privateKey 变量中,并使用 privateKey 初始化钱包。
第 7-8 行:获取我们的钱包地址并将其打印到控制台。
第 10-11 行:将我们的端点的 HTTP URL 保存在 httpUrl 变量中并将其打印到控制台。
第 13 行:启动一个异步的 init 函数。
第 14 行:初始化我们的提供者并将其保存到 httpsProvider 变量中。
第 16-17 行:从提供者获取 nonce 并将其打印到控制台。
第 19-20 行:获取费用数据,即 gasPrice、maxPriorityFeePerGas、maxFeePerGas 从节点获取并将其保存到 feeData 变量中,然后将其打印到控制台。
第 22-30 行:交易对象 tx:将交易类型指定为 2,即 EIP-1559 交易,指定 nonce 参数,指定接收者的地址,maxPriorityFeePerGas 参数并从 feeData 变量中获取信息,maxFeePerGas 参数并从 feeData 变量中获取数据,value 参数包含要发送的 ETH 数量,gasLimit 和 chainId 在这里是 11155111,因为链是 Sepolia。
第 32 行:打印交易对象。
第 34-35 行:使用我们的钱包签署交易并将签名的交易原始数据打印到控制台。
第 37 行:对原始交易应用 keccak256 以获取交易哈希并将其保存到 txHash 变量中。
第 38-39 行:将交易哈希打印到控制台,并附上 Sepolia Etherscan 的链接。
第 41 行:使用我们的节点发送我们的交易。
保存文件并使用以下命令运行脚本:
node index.js
成功执行后,输出将如下所示:
你也可以导航到区块浏览器,例如 Etherscan 来查看交易。复制交易哈希或搜索你发送/接收的地址。
一旦找到交易,你可以通过点击 更多详情 字段中的 点击显示更多 文本来确认它是使用 EIP-1559 发送的。
我希望现在你对 EIP-1559 有了更好的理解,因为在本指南中,我们了解了 EIP-1559,以及如何发送 EIP-1559 交易。
订阅我们的 newsletter 以获取更多关于 Web3 和区块链的文章和指南。如果你有任何问题,请随时使用我们的 Discord 专用频道或使用下面的表格提供反馈。通过关注我们的 Twitter 和我们的 Telegram 公告频道 保持最新动态。
让我们知道 如果你有任何反馈或新主题的请求。我们很乐意听取你的意见。
- 原文链接: quicknode.com/guides/eth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!