跳转至主要内容

如何使用 Quicknode 进行非托管交易

更新于
2025年11月26日

阅读时间 7 分钟

概述

在密码学和区块链领域,私钥是最敏感的数据之一。然而,关于在托管钱包(即钱包提供商保管用户的私钥)和非托管钱包(即钱包用户自行保管私钥)之间如何选择,一直存在争议和困惑。 本指南将深入探讨托管钱包与非托管钱包之间的区别,并介绍如何使用Quicknode 进行非托管交易。

先决条件

  • 您的系统上已安装 Node.js。
  • 文本编辑器。
  • 终端,又称命令行。

什么是非托管钱包?

非托管钱包是一种区块链钱包,其所有者完全掌控并保管私钥。 创建和访问非托管钱包有两种方法:使用私钥(一串字母数字组合),或者使用助记词短语——即由12至24个单词组成的短语,由钱包所有者自行保管(通常会将其写下来并存放在安全的地方,远离互联网和计算机)。

以下是非托管钱包的一些优势:

  • 自主性——用户完全掌控自己的资金——因为用户是唯一能够完全掌控自己资金的主体。他们无需依赖任何第三方来管理或保障其钱包的安全。
  • 安全性——由于用户将私钥存储在脱离互联网或任何计算机的环境中,发生安全漏洞的可能性几乎可以忽略不计。
  • 即时提现——使用非托管钱包时,用户无需依赖任何第三方来确认其提现请求。这简化了整个流程,并实现了即时提现。

非托管钱包与托管钱包

订阅我们的YouTube频道,观看更多视频!
  • 私钥保管方——在比较加密货币钱包时,首要考虑的因素是私钥的持有权。对于非托管钱包,用户自行保管私钥;而在托管钱包中,私钥则由第三方(通常是钱包提供商或交易所)控制。
  • 交易类型——非托管钱包发起的交易可立即在链上显示。相比之下,托管钱包发起的交易必须经过第三方的多重审核,因此容易出现延迟。
  • 安全性——在非托管钱包中,用户将私钥本地存储。除非用户泄露私钥或设备被盗,否则该钱包非常安全。而在托管钱包中,所有敏感的用户数据(如私钥)都存储在热存储(实时更新)和冷存储(不定期更新)中,通常容易遭到黑客攻击。
  • 离线可用性——非托管钱包无需保持网络连接。托管钱包则需要网络连接,因为其数据通常存储在中心化服务器上。
  • 备份与恢复——非托管钱包的唯一缺点是,一旦私钥/助记词丢失,就无法恢复该钱包。相比之下,托管钱包的用户可以向第三方申请恢复。

使用非托管节点

Quicknode,我们在全球范围内运行着许多节点。所有这些节点都始终连接到互联网,且处于动态状态。Quicknode API 连接到一个由高性能节点组成的全球网络。这些节点并非始终连接到单一的基础设施组件。该 API 设计为能在单个基础设施组件之间进行动态切换,以提升系统稳定性和正常运行时间。正因如此,由于节点状态始终处于变化之中,将任何敏感数据存储在节点上并非理想之选。 此外,由于这些节点直接面向互联网,还存在安全隐患。为了保障用户数据的安全,我们不允许它们存储私钥。  由于节点具有动态特性,它们会频繁改变状态以提供更佳的性能。这意味着密钥可能会丢失,进而导致用户数据丢失。正是基于这些原因,我们运行非托管节点,并让用户成为其钱包的唯一控制者。在接下来的章节中,我们将了解如何使用库创建钱包、进行非托管交易,以及通过 Quicknode 发送交易。

设置您的 Quicknode 以太坊端点

对于今天的目的,我们几乎可以使用任何以太坊客户端,例如 Geth 或 OpenEthereum(原名 Parity)。由于这对于发送交易来说稍显复杂,我们只需在此处创建一个免费的 Quicknode 账户,即可轻松生成一个以太坊端点。我们将使用 Kovan 测试链进行转账。创建免费的以太坊端点后,请复制您的 HTTP 提供商 URL:

Quicknode 以太坊端点“入门”页面的截图,其中包含一个 HTTP 链接和 WSS

 

稍后你会用到这个,所以请复制并保存下来。

创建钱包并获取一些测试以太币

我们可以使用现有的众多 Web3 库中的任意一个来创建钱包。今天,我们将使用一个名为 ethers.js 的 JavaScript 库,来创建一个能够签署和发送交易的钱包。您也可以参考我们关于使用Go/Python/Ruby/PHP 创建以太坊钱包的指南。

我们将使用 npm(Node 包管理器)来安装 Ethers,该工具随 Node.js 一起提供。打开命令提示符/终端,输入以下命令以检查 Node.js 是否已安装:

node -v 

这应该会显示已安装的 Node.js 版本;如果尚未安装,请从其官方网站下载 Node.js 的 LTS 版本。

让我们为项目创建一个新目录,并在命令提示符/终端中将该目录设为当前工作目录:

mkdir noncusTransaction
cd noncusTransaction

现在请输入以下命令来安装 ethers:

npm i ethers@5.7

请确保您安装的是 Ethers.js 5.7 版本

此步骤中最常见的问题是 `node-gyp` 出现内部故障。您可以按照此处的 node-gyp 安装说明进行操作。

注意:如果您遇到 node-gyp 相关问题,请确保您的 Python 版本与上述说明中列出的兼容版本之一一致。 

另一个常见问题是缓存过期;只需在命令提示符/终端中输入以下内容,即可清除 npm 缓存:

npm cache clean

如果一切顺利,ethers.js 就会安装到您的系统上。

现在,打开一个文本编辑器,创建一个名为 transaction.js 的新 JavaScript 文件。将以下内容复制并粘贴到该文件中。

var ethers = require('ethers');  
var privateKey = "0x0111111111111111111122222222222222222223333333333333333333344445";
var 钱包 = new ethers.钱包(privateKey);
控制台.log("地址:" + 钱包.地址);

上述代码的说明:

第 1 行:导入 ethers 库。

第 2 行:将私钥存储在变量 privateKey 中,请务必使用您自己的私钥。您可以参考这篇关于如何使用 JavaScript 生成私钥的指南,学习如何生成私钥。

注意:如果你要把代码发布到互联网上(例如公开的 GitHub 仓库),那么将私钥存储在.env 文件中,并通过环境变量在主代码中导入,始终是一种良好的实践。 

第 3 行:使用私钥生成一个新的钱包地址,并将其存储在变量 wallet 中。

第 4 行:打印钱包地址及一个字符串。

现在,保存文件并运行该脚本。

节点交易

应该看起来像这样。

现在,让我们获取一些测试用的 ETH,用于交易中的转账和支付 gas 费。从输出中复制地址,访问Kovan 水龙头网站,使用 GitHub 或 GitLab 登录,将钱包地址粘贴到水龙头界面的文本框中,然后点击“Send me KETH!”。

您可以通过将地址粘贴到Kovan Etherscan 中,查看是否已收到测试用的 ETH,届时您将看到 ETH 余额。

发送非托管交易

让我们使用之前创建的钱包生成一笔代币转账交易,并通过 Quicknode 将该交易发送至区块链。

请按以下方式更新您的 transaction.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: 11
}
customHttpProvider.estimateGas(tx).then(function(estimate) {
tx.gasLimit = estimate;
tx.gasPrice = ethers.utils.parseUnits("3.14085197", "gwei");
wallet.signTransaction(tx).then((signedTX)=>{
customHttpProvider.sendTransaction(signedTX).then(console.log);
});
});

那么,请将 `ADD_YOUR_ETHEREUM_NODE_URL` 替换为上文所述的 HTTP 提供商。

上述代码的说明。

第 1 行:导入 ethers 库。

第 2 行:将我们的 Quicknode URL 存储在 url 变量中。

第 3 行:实例化新的 ethers 提供程序,并将其存储在变量 customHttpProvider 中。

第 4 行:将私钥存储在 privateKey 变量中(您必须自行生成私钥)。

第 5 行:根据私钥创建一个新钱包

第 6 行:将钱包地址与一个字符串一起打印出来。

第 7-12 行:初始化交易对象,并提供参数,例如“to”,其中包含收件人的地址(即交易要发送到的任何地址)。其次是“value”,其中包含要转账的 ETH 金额。第三个参数“chainId”是区块链的网络 ID(此处为 42,因为我们使用的是 Kovan 测试网)。 最后是“nonce”,即发送者已发送的交易总数。该值应始终等于之前交易数量 +1。

 我们还可以使用ethers.js 的 getTransactionCount() 方法,获取给定地址的非ce值。

第 13-14 行:使用提供商估算 gas 消耗量,然后将其存储在交易对象的 gasLimit 变量中。

第 15 行:设置 gas 价格,并将其存储在事务的 gasPrice 变量中。

第16行:使用钱包对交易进行签名。

第 17 行:使用提供程序发送已签名的交易,并将交易详细信息输出到控制台。

保存文件,然后使用以下命令运行它:

节点交易

它将输出类似于以下内容:

复制交易哈希,将其粘贴到Kovan Etherscan的搜索栏中,以查看该交易是否已确认。

结论

祝贺您成功完成了一笔非托管交易,并成为您资金的唯一掌控者。切勿将私钥透露给任何人;请始终将其存放在安全的地方,以确保您的钱包和资金安全。

订阅我们的通讯,获取更多关于以太坊的文章和指南。您还可以随时通过TwitterDiscord社区服务器联系我们,那里汇聚了您能遇到的最酷的开发者们 :)

我们 ❤️ 您的反馈!

如果您有任何反馈或对新主题的建议,请告诉我们。我们非常期待您的来信。

分享本指南