跳转至主要内容

使用 Web3 发送交易

交易web3.jsalchemy
初学者
Elan Halpern
Alchemy 文档(opens in a new tab)
2020年11月4日
14 分钟阅读 minute read

本文是面向初学者的指南,介绍如何用 Web3 发送以太坊交易。 向以太坊区块链发送交易主要有三个步骤:创建、签署和广播。 我们将对这三个方面进行讨论,希望能回答您可能遇到的所有问题! 在本教程中,我们将使用 Alchemy(opens in a new tab) 将我们的交易发送到以太坊链。 可以点击此处创建一个免费 Alchemy 帐户(opens in a new tab)

注意:本指南适用于在应用程序后端签署交易。 如果想在前端集成交易签署,请查看将 Web3 与浏览器提供程序集成(opens in a new tab)

基本概念

像大多数区块链开发人员刚开始的时候一样,您可能已经对如何发送交易(应该非常简单)进行了一些研究,然后阅读了大量的指南,发现每个人有不同的解读,让您有点不知所措和困惑。 如果您已上了那条船,就不要担心,我们在某些时候都会这样! 所以,在开始之前,让我们弄清楚一些事情:

1. Alchemy 不会存储您的私钥

  • 这意味着 Alchemy 无法代表您签署和发送交易。 这样做的原因是出于安全考虑。 Alchemy 绝不会要求您分享您的私钥,您也绝不应该与托管节点(或任何人)分享您的私钥。
  • 您可以使用 Alchemy 的核心应用程序接口读取区块链,但要写入它,您需要使用其他方式签署交易然后通过 Alchemy 发送它们(任何其他节点服务也是如此)。

2. 什么是 "签名者"?

  • 签名者将使用您的私钥为您签署交易。 在本教程中,我们将使用 Alchemy Web3(opens in a new tab) 签署我们的交易,但您也可以使用任何其他 Web3 库。
  • 在前端,一个很好的签名者示例是 MetaMask(opens in a new tab),它将代表你签署和发送交易。

3. 为什么我需要在我的交易上签名?

  • 每个想要在以太坊网络上发送交易的用户都必须在交易上签名(使用他们的私钥),以验证交易的来源是其所声称的那个人。
  • 保护这个私钥非常重要,因为拥有这个私钥就可以完全控制您的以太坊帐户,允许您(或任何有权限的人)代表您进行交易。

4. 如何保护我的私钥?

  • 有许多方法来保护您的私钥,并使用它来发送交易。 在本教程中,我们将使用 .env 文件。 然而,你也可以使用一个单独的存储私钥的服务提供器,使用一个密钥库文件,或其他选项。

5. eth_sendTransactioneth_sendRawTransaction之间有什么区别?

eth_sendTransactioneth_sendRawTransaction 都是 Ethereum API 函数,用于将交易广播到 Ethereum 网络,以便将其添加到未来的区块中。 它们在处理交易签名的方式上有所不同。

当使用 web3 时,通过调用函数 web3.eth.sendSignedTransaction(opens in a new tab) 来访问eth_sendRawTransaction

这就是我们将在本教程中使用的函数。

6. Web3 库是什么?

  • Web3.js 是一个围绕标准 JSON-RPC 调用的封装库,在以太坊开发中使用相当普遍。
  • 有许多针对不同语言的 web3 库。 在本教程中,我们将使用 Alchemy Web3(opens in a new tab),它用 JavaScript 编写。 您可以在这里(opens in a new tab)查看其他选项。

好了,现在我们把这些问题都解决了,让我们继续学习教程。 请随时在 Alchemy discord(opens in a new tab) 中提问!

注意:本指南需要使用 Alchemy 帐户、以太坊地址或安装 MetaMask 钱包、NodeJs 和 npm。 如果没有,按以下步骤操作:

  1. 创建一个免费的 Alchemy 帐户(opens in a new tab)
  2. 创建 MetaMask 帐户(opens in a new tab)(或获取以太坊地址)
  3. 按照这些步骤安装 NodeJs 和 NPM(opens in a new tab)

发送交易的步骤

1. 在 Rinkeby 测试网上创建一个 Alchemy 程序

导航到您的 Alchemy 仪表板(opens in a new tab)并创建一个新的应用程序,选择 Rinkeby(或任何其他测试网)作为您的网络。

2. 从 Rinkeby faucet 请求 ETH

按照 Alchemy Rinkeby 水龙头(opens in a new tab)相关说明接收以太币。 确保包含您的 Rinkeby 以太坊地址(来自 MetaMask)而不是其他网络。 按照说明操作后,请仔细检查您是否已在钱包中收到以太币。

3. 创建一个新的项目目录,并使用 cd命令进入该目录。

从命令行(macs 终端)创建一个新的项目目录并导航到这个目录:

1mkdir sendtx-example
2cd sendtx-example

4. 安装 Alchemy Web3(或任何 web3 库)。

在你的项目目录中运行以下命令,以安装 Alchemy Web3(opens in a new tab)

1npm install @alch/alchemy-web3

5. 安装 dotenv

我们将使用 .env 文件安全地存储我们的应用程序接口密钥和私钥。

1npm install dotenv --save

6. 创建 .env文件

在您的项目目录中创建一个 .env 文件并添加以下内容(替换”your-api-url“和”your-private-key“)

  • 要找到您的 Alchemy API URL,请导航到您刚刚在仪表板上创建的应用程序详细信息页面。 点击右上角的“查看密钥”,然后获取 HTTP URL。
  • 要使用 MetaMask 查找您的私钥,请查看此指南(opens in a new tab)
1API_URL = "your-api-url"
2PRIVATE_KEY = "your-private-key"
不要提交 .env! 请确保永远不要与任何人共享或公开您的 .env 文件,因为这样做会泄露您的私钥。 如果您使用版本控制,请将您的 .env 添加到 gitignore(opens in a new tab) 文件中。

7. 创建 sendTx.js文件

太好了,既然我们已经在 .env 文件中保护了敏感数据,我们开始编码吧。 对于我们的发送交易示例,我们将把 ETH 发送回 Rinkeby faucet。

创建一个 sendTx.js 文件,这是我们将配置和发送我们的示例交易的地方,并在文件中添加以下几行代码:

1async function main() {
2 require('dotenv').config();
3 const { API_URL, PRIVATE_KEY } = process.env;
4 const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
5 const web3 = createAlchemyWeb3(API_URL);
6 const myAddress = '0x610Ae88399fc1687FA7530Aac28eC2539c7d6d63' //TODO: replace this address with your own public address
7
8 const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // nonce starts counting from 0
9
10 const transaction = {
11 'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // faucet address to return eth
12 'value': 1000000000000000000, // 1 ETH
13 'gas': 30000,
14 'nonce': nonce,
15 // optional data field to send message or execute smart contract
16 };
17
18 const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);
19
20 web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) {
21 if (!error) {
22 console.log("🎉 The hash of your transaction is: ", hash, "\n Check Alchemy's Mempool to view the status of your transaction!");
23 } else {
24 console.log("❗Something went wrong while submitting your transaction:", error)
25 }
26 });
27}
28
29main();
显示全部

确保将第 6 行中的地址替换为您自己的公共地址。

现在,在我们开始运行这段代码之前,我们先来谈谈其中的一些组件。

  • nonce : nonce 规范用于跟踪从您的地址发送的交易数量。 为了安全起见,我们需要这样做,以防止重放攻击(opens in a new tab)。 要获得从您的地址发送的交易数量,我们使用 getTransactionCount(opens in a new tab)
  • transaction:交易对象有几个方面需要我们指定
    • to:这是我们要发送以太币的地址。 在此用例中,我们将以太币发送回我们最初请求的 Rinkeby 水龙头(opens in a new tab)
    • value:这是我们希望发送的金额,以 Wei 为单位,其中 10^18 Wei = 1 个以太币
    • gas:有多种方法用来确定要包括在您的交易中的正确燃料数量。 Alchemy 甚至提供了一个燃料价格 Web 钩子(opens in a new tab),用于当燃料价落在某个阈值范围内时通知您。 对于主网交易,最好查看以太币燃料站(opens in a new tab)一类的燃料估算器,以确定要包括的正确燃料数量。 21000 是以太坊操作所使用的最小燃料数量,所以为了确保我们的交易得以执行,我们在这里输入 30000。
    • nonce:参见上面的 nonce 定义。 Nonce 从零开始计数。
    • [OPTIONAL] 数据:用于在您的转账中发送附加信息或调用智能合约,余额转账不需要,请查看下面的注释。
  • signedTx:要签署交易对象,我们将使用 signTransaction 方法和我们的 PRIVATE_KEY
  • sendSignedTransaction:在我们有一个已签署交易后,我们可以通过使用 sendSignedTransaction 将其发送出去,以包含在后续区块中

关于数据的注释 有两种主要类型的交易可以在以太坊中发送。

  • 余额转账:将以太币从一个地址发送到另一个地址。 不需要数据字段,但是,如果您想在交易中发送附加信息,可以在此字段中包含 HEX 格式的信息。
    • 例如,假设我们想将星际文件系统文档的哈希写入以太坊链,以便为其提供不可变的时间戳。 我们的数据字段应该看起来像该数据:web3.utils.toHex('IPFS hash')。 现在任何人都可以查询该链并查看该文档的添加时间。
  • 智能合约交易:在链上执行一些智能合约代码。 在这种情况下,数据字段应包含您希望执行的智能函数及任何参数。

8. 使用 节点 sendTx.js运行代码

返回到您的终端或命令行并运行:

1node index.js

9. 在内存池中查看您的交易

在您的 Alchemy 仪表板上打开内存池页面(opens in a new tab),并通过您创建的应用程序筛选,以找到您的交易。 我们可以在这里观看交易从待处理状态转换到已开采状态(如果成功),或者从待处理状态转换到被丢弃状态(如果失败)。 确保页面保持在“全部”视图下,这样您就能捕捉到“已开采”、“待处理”和“被丢弃”的交易。 您还可以通过查找发送到地址 0x31b98d14007bdee637298086988a0bbd31184523 的交易来搜索您的交易。

要在找到交易后查看交易的详细信息,请选择交易哈希值,您将看到这样的视图:

内存池监视器截图

在此处,您可以通过单击红色圆圈中的图标,在 Etherscan 上查看您的交易!

太好了! 您刚刚使用 Alchemy 发送了您的第一笔以太坊交易 🎉

如有关于本指南的反馈和建议,请在 Alchemy 的 Discord(opens in a new tab) 上给 Elan 留言!

最初发表在 https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy(opens in a new tab) 上。

上次修改时间: @tyevlag(opens in a new tab), 2023年8月15日

本教程对你有帮助吗?