主页 > imtoken下载正版 > 使用 ethers.js 发送高 gas 置换交易

使用 ethers.js 发送高 gas 置换交易

imtoken下载正版 2023-07-14 05:20:22

在本文中,我们将使用 ethers.js 在以太坊测试网络上重发交易,并介绍相关术语和知识。

概述

有时,在以太坊上提交的交易没有足够的 gas,因为网络拥塞或有太多待处理的交易提供比您的交易报价更高的 gas 价格。 如果你有一笔高优先级的交易,但由于 gas 不足,你可能最终需要等待数小时甚至数天才能将其打包结算。 在这种情况下,您需要重新发送具有更高 gas 价格和相同 nonce 的交易,以便更早地包含它。

在本文中,我们将使用 ethers.js 在以太坊测试网络上重发交易,并介绍相关术语和知识。

什么是以太坊交易?

当我们想要在以太坊网络上添加、更新或修改某些东西时,我们需要发送一个交易。 基本上,交易是现实世界与以太坊网络交互的方式。 以太坊网络上的每笔交易都需要一笔费用,称为 gas。 gas的单位是wei(ETH的最小单位)或者gwei。

以太坊交易类型

在以太坊网络中,共有三种常见的交易类型:

普通交易:比如将以太币(ETH/ether)从一个账户转移到另一个账户。 创建合约交易:在以太坊区块链网络上部署智能合约的交易。 调用合约交易:此交易用于(发送一些数据)与先前部署的智能合约进行交互。

典型以太坊交易的参数:

以太坊交易流程

签署交易

签署交易意味着使用发送方的私钥在交易对象上生成签名。如果您想了解更多关于以太坊签名和验证的信息,这里有一些不错的读物:Yos 写的以太坊签名和验证签名和 Angelo Pozo 的以太坊签名和验证

现在我们对以太坊交易有了更深入的了解,让我们自己发送一个交易:

依赖项:

安装必要的工具

我们使用 NodeJS 来管理库和处理 javascript 文件。 首先检查是否安装了 NodeJS,打开终端并运行:

$ node -v

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

要发送交易,我们将使用一个简短的 javascript 代码,我们将使用 ethers.js 库,您可以在命令行终端中使用 npm 安装它:

$ npm install --save ethers

这一步最常见的问题是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 行),为钱包创建一个特定的私钥,它可以是任何数字,并确保它包含与上面相同的数字位数(第 1 行) 2)、使用私钥在以太坊中创建钱包实例(第3行),并在控制台打印文本“Address:”和钱包地址(第4行)。

使用以下命令运行文件:

node index.js

如果一切顺利,它应该是这样的:

sitehqz.com 以太坊交易查询_以太坊是24小时交易吗_以太坊交易类型

由于每笔交易都需要gas费,所以我们需要在交易中发送一些gas,我们可以在钱包中获得一些测试用的ETH。 为此,我们将使用一个 Kovan 节点,转到 Kovan 水龙头获取一些测试 ETH,复制粘贴您通过运行上述代码获得的钱包地址,然后点击“发送给我 KETH!”。

注意:这是一个没有市场价值的测试 ETH。

启动以太坊节点

对于本文,我们可以使用任何以太坊客户端,例如 Geth 或 OpenEthereum(以前称为 Parity)。 要自己启动一个以太坊节点,首先需要选择一个客户端并进行配置; 同步和维护以太坊节点是一项具有挑战性的任务; 同步一个以太坊全节点可能需要几天时间。

这样只发送一个交易有点太复杂了,所以我们选择QuikNode提供的免费节点URL。 成功创建免费以太坊节点后,复制提供者地址(HTTP Provider)地址:

本文使用 Kovan 的测试网节点。

以太坊是24小时交易吗_sitehqz.com 以太坊交易查询_以太坊交易类型

以后会用到,请复制保存。

发送和重新发送交易

现在,我们有了一个钱包地址和一些测试用的 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 提供商。

简单解释一下上面的代码:(第1行)导入之前安装的ethers库,(第2行)设置以太坊节点URL,(第3行)实例化一个ethers的JsonRpcProvider实例,(第4行)创建一个具体的私钥钱包,可以是任意数字,确保它包含相同数量的数字。 (第5行)用私钥创建一个以太坊钱包实例,(第6行)在控制台打印钱包地址,(第7-12行)创建一个交易对象并在to字段中添加收件人地址,您也可以使用var wallet = Wallet.createRandom(); 生成一个随机地址,在value字段中设置要发送的ETH的值,在chainId字段中,因为我们使用的是Kovan,所以设置为42,nonce字段设置为3,(第13-15行)估计gasLimit 并根据节点设置 gas 价格,(第 16-18 行)用钱包的私钥签署交易并发送,同时在控制台打印交易。

运行:

node index.js

我们将得到类似这样的输出:

以太坊交易类型_sitehqz.com 以太坊交易查询_以太坊是24小时交易吗

复制哈希字段中的字符串(类似于 0xe49c8122656c612bf5f1e10b251f56671acf01d831b6876c37c5a52053035642)并将其粘贴到 Kovan 浏览器的搜索框中以查看交易状态。 您会看到该交易尚未添加到区块链上的新区块,它处于待处理状态。 这是因为我们将 gas 值设置得非常低。

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

node index.js

复制新输出的ash字段的字符串以太坊交易类型,粘贴到Kovan浏览器的搜索框中,再次查看交易状态。 这一次,我们的交易成功添加到块中,状态为成功,因为我们在发送交易时增加了 gasPrice 值。

注意:两笔交易中的 nonce 值相同。 如前所述,随机数是以太坊地址的交易数量。 为了重新提交具有更多 gas 的交易,您必须使用与原始交易相同的随机数。 如果你使用增加的 nonce,这将是一个新的交易,你将发送比你想象的更多的 ETH(因为发送了两次)。

综上所述

所以以太坊交易类型,正如我们在上面的例子中看到的,交易的 gas price 被用来竞争交易的优先级。 区块链上的矿工通常根据可用的区块空间占用来设置gas。 当交易的gas低于阈值gas值时,将不会被验证。 与其他交易相比,具有更高 gas 值的交易可以快速验证。

本翻译由 CellETF 赞助。

本文参与登联社区写作激励计划,好文章好收益,欢迎正在阅读的你加入。