如何使用 Ethers.js 以更高的 gas 价格重新发送交易

  • QuickNode
  • 发布于 2024-11-23 15:31
  • 阅读 27

本文详细介绍了如何在以太坊网络中通过Ethers.js库重新发送带有更高gas价格的交易,以加速交易的确认。文章涵盖了交易的基本概念、参数设置、以及如何使用Ethers.js库进行交易签名和发送。

重要通知

本指南包含对 Kovan 测试网的引用,该测试网不再积极维护。虽然与此链相关的特定步骤可能不适用,但整体流程可能适用于其他链。我们建议你探索当前的替代方案以实施。如果你希望查看此指南的更新版本,请 告诉我们!

概述

有时,由于网络拥堵或太多待处理交易提供了高于你在交易中提供的gas价格,你在以太坊上提交交易时可能没有足够的 gas。如果你有高优先级的交易但 gas 较低,你可能会不得不等待数小时甚至数天才能完成交易。在这些情况下,你需要重新发送一笔具有更高 gas 的交易,并使用相同的 nonce,以便更快地进行挖矿。

在本指南中,我们将讨论发送以太坊交易及使用 Ethers.js 在以太坊测试网络上重新发送相同交易的所有术语和信息。

什么是以太坊中的交易?

当我们想在以太坊网络上添加、更新或修改某些内容时,就会进行交易。基本上,交易是现实世界与以太坊区块链网络交互的方式。我们在以太坊网络上进行的每一笔交易都需要支付称为 gas 的费用。Gas 可以是 wei(ETH 的最小单位)或 gwei。

以太坊中的交易类型

以太坊网络上有三种常见的交易类型:

  1. 普通交易:当 ETH/ether 从一个账户转移到另一个账户。

  2. 创建合约的交易:此类交易是在以太坊区块链网络上部署智能合约的交易。

  3. 调用合约的交易:此交易带有一些数据,并用于查询/与之前部署的智能合约进行交互。

典型的以太坊交易参数

  • from:发送者地址,一个 20 字节的地址,表示发起交易的账户。

  • to:接收者地址,一个 20 字节的地址,表示接收者的账户或合约账户。

  • value:这是从一个账户到另一个账户发送的 ETH 数量。

  • data:此字段包含合约部署交易的字节码。对于合约函数的执行,它包含函数签名和编码参数。在资金转账交易中,此字段不需要或留空。

  • gasLimit:这是交易可以使用的最大 gas 数量,以 wei 为单位。

  • gasPrice:这是发送者愿意为交易支付的数量,以 wei 为单位。

  • chainId:这是你以太坊节点的网络 ID(主网:1,rinkeby:4,kovan:42 等)。

  • nonce:特定地址发送的交易数量。每当一个地址发送交易时,nonce 就会增加 1。

以太坊中的交易流程

  • 创建一个交易对象,并提供所有必要的参数。

  • 使用发送者的私钥签名交易。

  • 使用以太坊节点将交易发送到以太坊区块链网络。

签署交易

签署交易意味着使用发送者的私钥在交易对象上生成签名。如果你想了解更多关于在以太坊中签署和验证的信息,以下是一些优秀的阅读材料:Yos 的以太坊签名与验证Angello Pozo 的以太坊:签署与验证

现在,既然我们对以太坊中的交易有了更好的理解,让我们自己发送一笔交易。

先决条件

  • 系统上安装了 NodeJS

  • 一个文本编辑器

  • 终端或命令行

安装必要的工具

我们将使用 NodeJS 来管理我们的库包,并处理 JavaScript 文件。要查看你系统上是否安装了 NodeJS,请打开终端并运行:

$ node -v

如果未安装,你可以从 官方网站 下载 NodeJS 的 LTS 版本。

要发送交易,我们将使用一段简短的 JavaScript 代码,并使用 ethers.js 库(确保它是 5.7 版本)。你可以通过命令行/终端使用 npm 安装:

$ npm install --save ethers@5.7

在此步骤中最常见的问题是 node-gyp 的内部故障。你可以在此处遵循 node-gyp 安装说明

另一个常见问题是陈旧的缓存。通过在终端中键入以下内容来清除你的 npm 缓存:

$ npm cache clean

你可以查看我们的 ethers.js 指南 以了解有关 ethers.js 库的更多信息。

创建一个钱包并获取一些测试 ETH

现在,让我们为自己创建一个钱包。为此,首先创建一个名为 index.js 的文件或其他你喜欢名称的 JavaScript 文件。你可以将以下代码复制/粘贴到代码编辑器中:

var ethers = require('ethers');
var privateKey = "0x0111111111111111111122222222222222222223333333333333333333344445";
var wallet = new ethers.Wallet(privateKey);
console.log("Address: " + wallet.address);

让我们看看这里发生了什么:导入我们之前安装的 ethers.js 库(第 1 行),创建特定于我们钱包的私钥,你需要为自己创建一个,任何数字都可以,确保包含与上述相同的数字个数(第 2 行),使用私钥创建一个 ethers 的钱包实例(第 3 行),在控制台打印我们钱包的地址,文本为 "Address"(第 4 行)。

现在,使用以下命令运行文件:

$ node index.js

如果一切顺利,终端窗口中的输出应如下所示:

Address: 0x3f5D3070Fc7924479B5e367a83EC2b284E9c4e04

由于每个交易都需要 gas 作为费用,而我们需要在交易中发送一些 gas,因此让我们获取一些我们钱包中的测试 ETH。为此,我们将使用 Kovan 节点,因此请前往这个 Kovan 水龙头 获取一些测试 ETH,粘贴你运行上述代码获得的钱包地址,然后单击“send me KETH!”。

注意:这将是测试 ETH,没有市场价值。

设置你的 QuickNode 以太坊端点

就我们今天的目的而言,我们可以使用几乎任何以太坊客户端,例如 Geth 或 OpenEthereum(前身为 Parity)。要完全独立启动以太坊节点,我们首先需要选择一个客户端并配置它;同步以太坊节点并维护它是一项挑战;同步以太坊完整节点可能需要几天时间。

由于对于仅发送一笔交易而言,这有些复杂,我们将从 QuickNode 获取一个免费的端点 以简化这一过程。在你创建了免费的以太坊端点后,复制你的 HTTP 提供程序端点:

我们在本指南中使用 Kovan 测试网节点。

Quicknode Kovan 端点截图

你稍后需要此信息,因此请记下来并保存。

发送和重新发送交易

现在,我们有一个钱包并且其中有一些测试 ETH。让我们发送一笔交易,将一些 ETH 转入不同的帐户/钱包。为此,让我们在 index.js 文件中添加更多有用的内容。你可以将以下代码复制/粘贴到代码编辑器中:

var ethers = require('ethers');
var url = 'ADD_YOUR_ETHEREUM_NODE_URL';
var customHttpProvider = new ethers.providers.JsonRpcProvider(url);
var privateKey = "0x0111111111111111111122222222222222222223333333333333333333344445";
var wallet = new ethers.Wallet(privateKey);
console.log("Address: " + wallet.address);
tx = {
  to: "0x6E0d01A76C3Cf4288372a29124A26D4353EE51BE",
  value: ethers.utils.parseEther("0.05"),
  chainId: 42,
  nonce: 3
}
customHttpProvider.estimateGas(tx).then(function(estimate) {
    tx.gasLimit = estimate;
    tx.gasPrice = ethers.utils.parseUnits("0.14085197", "gwei");
    wallet.signTransaction(tx).then((signedTX)=>{
    customHttpProvider.sendTransaction(signedTX).then(console.log);
    });
});

请继续将 **ADD_YOUR_ETHEREUM_NODE_URL** 替换为上述部分中的 HTTP 提供程序。

对上述代码的简要解释 - 我们导入之前安装的 ethers 库(第 1 行),设置我们的以太坊节点 URL(第 2 行),实例化 ethers JsonRpcProvider 实例(第 3 行),创建特定于我们钱包的私钥,你需要为自己创建一个,任何数字都可以,确保与上述数字个数相同(第 4 行),使用私钥创建 ethers 的钱包实例(第 5 行),在控制台打印我们钱包的地址,文本为 "Address"(第 6 行),创建交易对象并添加“to”字段,包含接收者的地址,你可以使用 var wallet = Wallet.createRandom(); 生成一个随机地址,添加一个“value”字段,指定要发送的 ETH 价值,设置“chainId”字段,因为我们在使用 Kovan,这里指定为 42,以及设置第三中的 nonce 字段(第 7-12 行),通过我们的节点估算 gasLimit并设置 gas 价格(第 13-15 行),使用我们钱包的私钥签署交易对象并发送,同时在控制台中打印交易(第 16-18 行)。

让我们运行这个:

$ node index.js

我们将得到类似于以下内容的输出:

Node index.js 输出

抓取哈希字段的字符串(类似于 '0xe49c8122656c612bf5f1e10b251f56671acf01d831b6876c37c5a52053035642')并将其粘贴到 Kovan etherscan 的搜索框中以检查交易状态。你将看到交易尚未被添加到区块链上的新块中,且状态为待处理。这是因为我们输入的 gas 值显著过低。

现在,让我们尝试使用相同的 nonce 重新发送相同的交易,但这一次增大 gas 值;将代码第 15 行中的 gasPrice 值从 '0.14085197' 更改为 '2.14085197' 并重新运行代码:

$ node index.js

从新的输出中复制哈希字符串,并将其粘贴到 Kovan etherscan 的搜索框中以检查交易状态。这一次,我们的交易将被添加到区块中并具有成功状态,因为我们以增大的适当 gasPrice 值发送它。

注意: 重要的是要注意,“nonce”值在两个交易之间是相同的。如前所述,nonce 是指以太坊地址已发送的交易数量。为了重新提交具有更高 gas 的交易,你必须使用与原始交易相同的 nonce。如果你使用了增大的 nonce,这将是一笔新交易,从而支出超过你预期的 ETH。

结论

因此,正如我们在上述示例中看到的,交易的 gas 价格应具有竞争力,以便交易获得批准。区块链的矿工根据可用区块空间和所有交易愿意支付的费用来设置 gas,当存在一笔其 gas 低于阈值 gas 值的交易时,它将不会获得批准。与其他交易相比,具有更高 gas 值的交易会更快地获得批准。

请订阅我们的 新闻通讯,获取更多关于以太坊的文章和指南。如果你有任何反馈,请随时通过 Twitter 联系我们,如果你有问题,可以通过我们在 Discord 的社区服务器与我们聊天。那里有一些最酷的开发者,感谢 :)

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

0 条评论

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