如果你刚接触区块链开发,可能会对节点以及它们如何在区块链技术栈中发挥作用感到陌生。什么是区块链节点?为什么自己运行以太坊节点很困难?节点提供商是什么?为什么需要它?Infura、Alchemy 和 Quicknode 等提供商之间有什么区别?
别担心,我们都经历过这个阶段,确实容易让人困惑。以下是你需要了解的核心内容概要。
区块链节点基础
让我们从基础开始!节点本质上是一个运行在单台计算机上的程序,它允许你连接到区块链网络的其余部分。节点与其他节点连接以相互发送信息,检查人与人之间发送的交易是否有效,并存储有关区块链状态的重要信息。
区块链网络的一个特点是,网络基本上只由节点组成:也就是说,运行以太坊或比特币等区块链的物理硬件只是由世界各地个人运行的所有节点的集合。没有主服务器或单一的真相来源——这就是为什么它是去中心化的!
最后,重要的是要注意,不使用节点就无法访问区块链上的信息。这是无法做到的。可以把它想象成区块链的浏览器。
“区块链”只是由个人运行的计算机(节点)的集合,共同按照特定规则集验证该区块链的状态。
你通过 API 向节点发送请求并接收响应来与之交互。例如,假设你在计算机的 8545 端口上运行一个节点,你可以发送如下请求:
curl localhost:8545 -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":0}'
此请求将调用 blockNumber 方法,要求你的节点返回最新的区块号,即网络上最近产生的区块。以下是响应示例:
{ "jsonrpc": "2.0", "id": 0, "result": "0xa1c054"}
如你所见,这种情况下最新的区块是 0xa1c054,转换为十进制是区块 10600532。
自行运行节点的挑战
有几个因素使得在连接到网络的自家节点上进行开发特别麻烦。让我们探讨一些原因:
节点设置耗时漫长——长达数周!
开发人员最讨厌的事情就是在不直接贡献于所构建内容的工具上花费大量时间设置,而节点是最严重的罪魁祸首之一。
节点通常分为两大类——轻节点和全节点。轻节点仅同步区块头,并向全节点请求许多查询,而全节点则保留区块链的整个状态——每一个曾经创建的交易。大多数查询使用轻节点即可,但全节点是区块链的支柱——它们对于提供大多数信息是必需的。
轻节点在过去变得相对简单,但仍然需要安装节点程序、设置配置变量、下载区块头以及检查端口和健康状况以确保它们正常运行。如果你能在 30 分钟内让第一个轻节点运行起来,请在 Discord 上联系我们,我们会为你的努力颁发一个定制徽章 👏👏。
全节点更糟:最大的问题是全节点需要从头下载从 0 到最新的每个区块,并手动重放任何人曾经提交的每个区块和交易。对于以太坊主网,这意味着超过 1000 万个区块和数十亿笔交易。这实际上可能需要数周的同步时间。
注意:在以太坊中,还有另一种称为归档节点的节点类型,可用于历史查询。此处我们不深入讨论。
节点必须由你管理!
准备好迎接地狱般的运维项目吧。简单概述一下:
- 节点需要每隔几周定期升级,并且在硬分叉和节点客户端升级的情况下偶尔需要从头重新构建。
- 由于大多数节点在设计时未考虑可靠性,某些查询(例如 eth_getLogs)可能涉及运行数百万个区块和交易,并且经常超时或使节点崩溃——我们称它们为“死亡查询”。因此,你必须密切注意节点的健康状况,并经常在凌晨三点起床调试它们。
- 单个节点可能因各种原因落后于网络——对等和连接问题、滞留在过时的分支上、内部状态问题。如果它们落后,你的用户将获得过时数据但却意识不到——这可能带来危险的糟糕体验。
扩展单个节点非常棘手!
当你构建个人项目时,单个节点还好(即使它确实会间歇性地崩溃)。但是,当你无法使节点服务器足够大以跟上发送的请求时,会发生什么?
“我就运行两个节点——并在它们之间设置一个负载均衡器!”,你可能会建议。我们也是这么想的!不幸的是,这种设置实际上非常难以保持一致性,因为不同的节点以略微不同的方式“看到”区块链的最新状态,导致数据不一致和其他面向用户的问题。
想象一下:我们有两个节点在负载均衡器后面分别同步。节点 A 认为最新区块是区块 5,而节点 B 认为它是区块 4。这是一个完全正常的情况——因为最新信息通过网络缓慢传播,一些节点总是比其他节点领先。
你:嘿,负载均衡器先生,你看到的最新区块是什么?
负载均衡器先生:(向节点 A 发送请求并返回响应):网络上的最新区块是区块 5。
你:谢谢!你能告诉我区块 5 中的信息吗?
负载均衡器先生:(这次向节点 B 发送请求):抱歉,我不知道区块 5。请重试。
在现实世界的情况下,想象一个用户在你的应用上购买 NFT。他们可能在向节点 A 发送请求时购买了一个 NFT——但当他们的查询开始发送到节点 B 时,似乎他们的交易从未发生过!像这样的一致性问题普遍存在且非常棘手——尤其是当你扩展到数十个节点时。
节点提供商的作用与优势
节点提供商本质上是团队(比如我们!),提供一种访问区块链信息的方式,而无需运行自己的节点!本质上,你可以将请求通过互联网发送给提供相同 API 的提供商,该提供商运行完全同步、最新的节点,全天候可用。
如果你还记得上面的 blockNumber 请求,这就是发送给提供商时的节点请求样子:
curl https://eth-mainnet.alchemyapi.io/v2/your-api-key -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":0}'
我们只是交换了端点!不需要其他更改。
一个可靠的节点提供商至少提供:
- 访问轻节点和全节点,具有定期更新的节点和警报,因此你不必担心分叉或网络更改。
- 访问归档节点以获取历史交易数据(只有 Alchemy 免费提供此服务!)
- 可扩展性和可靠性:节点应在你需要时随时可用,随心所欲。
- 一致性:提供商应处理类似于上述最新区块问题的棘手边缘情况。在使用 Infura 或其他提供商时,这通常是一个问题。
何时需要节点提供商?
在准备将流量发送到公共测试网或主网之前,你不需要节点提供商!用于测试的区块链本地版本(由 Hardhat 或 Truffle / Ganache 提供)就是你构建和测试项目所需的一切。
一旦你希望将应用程序部署到实时链上,节点提供商就成为你开发工作流程中的关键部分。
首先,你需要一种通过交易将智能合约部署到区块链的方法——你只能通过区块链上的节点来实现。这意味着运行自己的节点,或将交易发送给提供商。
其次,你的应用程序可能需要继续提取有关区块链的信息以更新其内部状态。该信息也通过节点或节点提供商——并且你希望该通道可靠且正确同步,以免向用户提供过时或损坏的数据。
超越基础:附加价值
如果你已经理解了这一点,你就明白了我们存在的要点!我们本质上是一个区块链节点提供商,具有极高的可靠性、出色的客户支持和大量开发者工具,这三个功能对我们的企业客户至关重要,也是区块链中 70% 的顶级应用程序通过我们发送流量的原因。
除了核心服务,还有一些其他因素使我们区别于该领域的其他节点提供商:
开发者工具
你怎么知道用户发送了什么请求?如果他们的请求失败,你如何查看/调试它们?你发送的等待挖掘的交易发生了什么?我们在 Alchemy 仪表板中提供了许多工具,允许你分析 dApp 上的流量,否则这将需要翻阅大量日志页面。
推送通知
如果你希望在任何时候收到关注的以太坊用户(例如,Vitalik Buterin)进行交易时的警报,该怎么办?你可以编写一个脚本来读取每个区块并搜索特定地址并使其 24/7 运行——或者你可以使用像 Alchemy Notify 这样的工具,这是一种专有工具,用于为区块链上的事件发送推送通知(webhooks)。
增强 API
如果你想搜索单个 ETH 用户进行的所有交易怎么办?尽管在 SQL 数据库中这可能很简单,但在区块链上却异常困难——你基本上需要扫描区块链中的每个交易(再次强调,在 ETH 主网上是数十亿!)以查看是否包含某个地址。我们构建了几个增强 API,允许你即时进行此查询和其他类似查询。
如何开始使用节点提供商
使用 Alchemy 作为节点提供商非常简单——实际上,只需一行代码即可开始!如果你一直在使用 web3.js 或 ethers.js,只需创建免费 Alchemy 账户,生成 API 密钥,并将实例化替换为如下内容:
const web3 = createAlchemyWeb3("https://eth-mainnet.alchemyapi.io/");
如果你需要完整教程,请查看我们的Alchemy 入门文档!
最后,我们随时在 Alchemy Discord 上 24/7 提供帮助。过来打个招呼——我们很乐意帮助你成为一名成熟的区块链开发者!
常见问题
什么是区块链节点?
区块链节点是运行在计算机上的程序,负责维护区块链网络的一部分,验证交易,存储数据,并与其他节点通信以确保网络的一致性和去中心化。它是访问区块链数据的必要网关。
为什么运行自己的节点很困难?
运行自己的节点耗时漫长(全节点同步可能需要数周),需要持续的运维管理(升级、调试、监控),并且在扩展时面临数据一致性和可靠性的技术挑战,分散开发核心任务的精力。
节点提供商主要解决哪些问题?
节点提供商解决了节点部署的复杂性、维护的负担、可靠性的挑战以及扩展的需求。它们提供稳定、可扩展、一致的 API 访问,让开发者能专注于应用开发而非底层基础设施管理。
轻节点和全节点有什么区别?
轻节点只同步区块头,依赖全节点提供详细数据,设置相对较快,但功能有限。全节点存储区块链完整历史和数据,是网络支柱,但同步耗时极长,资源需求高。
什么时候应该考虑使用节点提供商?
当你准备将去中心化应用部署到公共区块链网络(测试网或主网)时,需要与区块链进行可靠、高可用的交互(如部署合约、查询链上数据),此时使用节点提供商是高效可靠的选择。
如何选择节点提供商?
评估提供商时应考虑其可靠性(正常运行时间)、一致性解决方案、支持的节点类型(如是否免费提供归档节点)、附加工具(如调试、通知、增强API)、可扩展性以及客户支持质量。