如何发送EIP-1559交易

  • QuickNode
  • 发布于 2024-09-03 19:17
  • 阅读 30

本文介绍了EIP-1559的背景及其对以太坊Gas费的影响,并通过ethers.js库演示了如何发送EIP-1559交易。文章详细解释了EIP-1559的新机制,如baseFeePerGas、maxPriorityFeePerGas和maxFeePerGas,并提供了完整的代码示例和操作步骤。

概述

尽管以太坊一直在尝试扩展,但它遇到了一些 gas 价格问题。为了解决这个问题,许多Layer2解决方案和侧链应运而生,但以太坊是主链,在某些时候,它必须得到改进。EIP-1559 被引入以减少链上 gas 价格的波动性。在本指南中,我们将学习如何使用 ethers.js 发送 EIP-1559 交易。

先决条件

  • 一个以太坊 Sepolia 端点(你可以在这里创建一个免费账户 here
  • 以太坊钱包(例如,MetaMask
  • 已安装 Node.js
  • 代码编辑器和 CLI。
  • 水,因为水很重要。
依赖项 版本
node.js v18.13.0
ethers.js 5.7

什么是 EIP-1559?

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)。一旦交易确认,maxFeePerGasbaseFeePerGas + maxPriorityFeePerGas 之间的差额将退还给交易的发送者。

现在我们已经了解了 EIP-1559,通过发送一个 EIP-1559 交易来看看它的实际应用会很好。

设置你的 QuickNode 以太坊端点

我们发送交易的第一步是设置一个以太坊测试网端点;我们将使用 Sepolia 测试网进行交易,因为在以太坊主网上发送交易会消耗真实的 ETH。为了方便起见,我们将在这里创建一个免费的 QuickNode 账户 here 并轻松生成一个新的端点。

Quicknode Sepolia 端口的截图

保存 HTTP URL,因为我们稍后会使用它。

在钱包中获取资金

如果你需要 Sepolia 测试网上的 ETH,多链 QuickNode Faucet 可以轻松获取测试 ETH!

导航到多链 QuickNode Faucet 并连接你的钱包或粘贴你的钱包地址以获取测试 ETH。你还可以发布推文来请求以获得奖励!

多链 QuickNode Faucet

接下来,我们来看看所需的库。

安装所需的库

我们将使用 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

现在,我们应该在我们的项目目录中安装了所需的库。

进行 EIP-1559 交易

创建一个名为 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 行:获取费用数据,即 gasPricemaxPriorityFeePerGasmaxFeePerGas 从节点获取并将其保存到 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

成功执行后,输出将如下所示:

运行 node index.js 的终端输出

你也可以导航到区块浏览器,例如 Etherscan 来查看交易。复制交易哈希或搜索你发送/接收的地址。

一旦找到交易,你可以通过点击 更多详情 字段中的 点击显示更多 文本来确认它是使用 EIP-1559 发送的。

Sepolia Etherscan 交易

结论

我希望现在你对 EIP-1559 有了更好的理解,因为在本指南中,我们了解了 EIP-1559,以及如何发送 EIP-1559 交易。

订阅我们的 newsletter 以获取更多关于 Web3 和区块链的文章和指南。如果你有任何问题,请随时使用我们的 Discord 专用频道或使用下面的表格提供反馈。通过关注我们的 Twitter 和我们的 Telegram 公告频道 保持最新动态。

我们 ❤️ 反馈!

让我们知道 如果你有任何反馈或新主题的请求。我们很乐意听取你的意见。

  • 原文链接: quicknode.com/guides/eth...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。