主页 > imtoken下载正版 > 使用 ethers.js 发送高 gas 置换交易
使用 ethers.js 发送高 gas 置换交易
在本文中,我们将使用 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
如果一切顺利,它应该是这样的:
由于每笔交易都需要gas费,所以我们需要在交易中发送一些gas,我们可以在钱包中获得一些测试用的ETH。 为此,我们将使用一个 Kovan 节点,转到 Kovan 水龙头获取一些测试 ETH,复制粘贴您通过运行上述代码获得的钱包地址,然后点击“发送给我 KETH!”。
注意:这是一个没有市场价值的测试 ETH。
启动以太坊节点
对于本文,我们可以使用任何以太坊客户端,例如 Geth 或 OpenEthereum(以前称为 Parity)。 要自己启动一个以太坊节点,首先需要选择一个客户端并进行配置; 同步和维护以太坊节点是一项具有挑战性的任务; 同步一个以太坊全节点可能需要几天时间。
这样只发送一个交易有点太复杂了,所以我们选择QuikNode提供的免费节点URL。 成功创建免费以太坊节点后,复制提供者地址(HTTP Provider)地址:
本文使用 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 提供商。
简单解释一下上面的代码:(第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
我们将得到类似这样的输出:
复制哈希字段中的字符串(类似于 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 赞助。
本文参与登联社区写作激励计划,好文章好收益,欢迎正在阅读的你加入。