存档节点是以太坊网络上存储历史区块链数据的特定节点。因为它们提供了这些历史信息,所以当您需要审计过去的交易历史或收集数据时,它们会很有帮助。在归档模式下运行的完整节点对于了解事务的历史结果是必要的。您可以在任何时间点的任何区块回答与账户余额、智能合约代码、交易计数、代币供应、代币价格等相关的问题。
在最近的 128 个区块之前,需要一个存档节点来访问来自以太坊区块链的数据。以太坊的全节点不会存储每个区块验证生成的世界状态。它们只需要存储诸如标题和块内容之类的信息。
一般需要将这些信息保留足够长的时间,以便能够按需建立区块链历史状态(最近 128 个区块之外的数据)。与整个区块链状态相比,仅存储少量数据可以使全节点能够最小化存储和计算成本以及同步时间。
另一方面,存档节点除了具有完整节点的所有功能外,还存储 TB 的历史数据,从而可以在任何时间点查询任何块。在撰写本文时,以太坊存档节点现在占用了 12 TB 的空间,完全同步和存档可能需要 6 个多月的时间。使用 Infura 访问存档数据有助于节省您运行自己的节点的时间和计算成本。
## **为什么要访问存档数据?**
存档节点是以太坊网络上存储历史区块链数据的特定节点。因为它们提供了这些历史信息,所以当您需要审计过去的交易历史或收集数据时,它们会很有帮助。在归档模式下运行的完整节点对于了解事务的历史结果是必要的。您可以在任何时间点的任何区块回答与账户余额、智能合约代码、交易计数、代币供应、代币价格等相关的问题。
此状态包含每个钱包的余额和所有智能合约内部变量的值。这是向以太坊区块链添加新区块所必需的,因为新交易可能会执行智能合约。这些交易的结果将取决于这些内部变量的内容。
存档节点还可以在无需在区块链上创建交易的情况下测试智能合约。例如,如果您使用 Ganache,它是 Truffle 开发工具套件中的个人区块链模拟器,它使您能够在完全存档模式下在以太坊分叉,以便在部署到实时区块链之前测试智能合约。
## **常见用例**
Etherscan 和 Dune Analytics 等服务使用存档节点为其用户提供对区块链交易的可见性。任何人都可以自己运行或通过他们的 Infura API 端点访问存档数据。以下是我们从 Infura 客户的归档请求中看到的一些常见用例:
获取并检查过去超过 128 个区块的任何地址(无论是外部拥有的账户还是智能合约)的余额信息。这可能是最常见的用例,也是我们的大型以太坊客户(例如去中心化交易所、流动性池和钱包)启用存档的原因。
调用特定的智能合约函数以通过该函数读取数据(如 [ERC-20](https://learnblockchain.cn/article/977)和 [ERC-721](https://learnblockchain.cn/article/2077)令牌标准中的 eth_balanceOf)。出于以下目的,您可能需要阅读有关用户的外部拥有帐户的信息并检查他们是否有某个代币的余额:
* 去中心化交易所和流动资金池
* 钱包
* 使用 ERC-20 代币或 ERC-721 或任何其他具有 eth_balanceOf 功能的代币标准构建在以太坊上的游戏
* 任何 NFT 市场(由于需要调用 eth_balanceOf)
**如果您是以下情况,需要获取“时间点数据”(特别是从特定的块):**
* 索引器
* 任何试图为其用户显示帐户历史记录的公司
* 审计员、测试员或任何对智能合约进行取证分析的人,目的是弄清智能合约为何如此行事
## 教程:存档数据游乐场
我们创建了一个全栈应用程序,它为通过访问以太坊存档数据启用的各种用例提供参考实现和概念验证。
在此处查看存储库:https://github.com/anataliocs/Archive-Data-Playground
使用的技术:
• Java 11
• Spring Boot
• Gradle
• Typescript
• React/Redux
• node/npm
## 设置和配置
该项目使用 Java/Spring Boot 后端和 React 前端构建。您需要在本地安装以下依赖项才能运行此项目:
* An Infura account
* Git
* Node / npm
* Java 11
* An IDE
**获取您的 API 端点 URL 和项目 ID**
前往https://infura.io/并转到您的项目设置页面:

现在让我们设置我们的外部化配置,以便我们可以使用我们的项目 ID 而不会在 Github 上暴露这些细节。Spring Boot 应用程序在本地运行时使用 Spring Dev Tools,因此我们可以使用本地“.spring-boot-devtools.properties”文件来配置属性。
**MacOS 用户的配置:**
创建属性文件:
触摸 ~/.spring-boot-devtools.properties
打开属性文件:
vi ~/.spring-boot-devtools.properties
将以下行添加到属性文件:
infura.projectid=[YOUR_PROJECT_ID]
运行应用程序:
拉取源代码:
git clone git@github.com:anataliocs/Archive-Data-Playground.git
将项目导入您的 IDE,它应该会自动构建。我们的项目使用 gradle 构建后端,使用 npm 构建前端 UI。
将目录更改为项目文件夹:
cd archivedataplayground/
然后要运行完整堆栈,调用 Gradle 包装器:
./gradlew
此命令将在开发模式下启动 Spring Boot 后端,并在一个命令中启动 React 前端!
应用程序启动后,您应该看到以下内容:

在浏览器中通过 http://localhost:8080/ 导航到本地服务器

在右上角单击帐户-> 登录并使用预设的登录名和密码“admin/admin”

然后,您将有权访问该应用程序。登录流程来自用于创建基本项目骨架的基本 Jhipster 项目脚手架工具。
如果导航到 http://localhost:8080/admin/docs 或单击 Administration -> API,则可以直接查询 Infura JSON-RPC 端点
这将带您进入 Swagger UI 界面,您可以在其中调用 JSON-RPC 端点,例如获取超过 128 个块的块,这些块可通过具有水合事务的存档节点获得。然后可以在 Block Explorer 风格的应用程序或其他用例中使用这些调用。

一些有助于启用此功能的特定代码块包括:
https://github.com/anataliocs/Archive-Data-Playground/blob/main/src/main/java/io/infura/archivedataplayground/config/InfuraConfig.java
InfuraConfig.java

这段代码提供了一个“RestTemplate”单例,可以将它注入到需要它的类中,并帮助抽象出对 Infura 进行 JSON-RPC 调用的复杂性。
“dto.infura”包包含 POJO 对象,表示 Infura RPC 调用中使用的请求和响应 JSON。
https://github.com/anataliocs/Archive-Data-Playground/tree/main/src/main/java/io/infura/archivedataplayground/service/dto/infura
例如,以下 3 个 DTO 对象包含来自 eth_getBlockByNumber JSON-RPC 调用的块和水合交易响应,可用于从以太坊历史中获取存档块。
GetBlockByNumberResponse.java

Infura POJO 响应JSON的反序列化
GetBlockByNumberResult.java

Infura POJO 响应JSON的反序列化
Transaction.java

包含的“RestTemplate”将自动将响应编组/解组到这些对象类型中。
您还可以考虑使用 https://github.com/web3j/web3j 来帮助促进使用 Spring Boot 后端进行的 Infura JSON–RPC 调用。
前端
存档数据启用的一项功能是块探索。

此区块浏览器显示有关以太坊历史上著名区块的信息,例如:
前沿 (Frontier)
块高度:0
创世区块
2015 年 7 月 30 日
前沿解冻(Frontier Thawing)
区块高度:200000
以太坊价格:1.24 美元
2015 年 9 月 7 日
—
Homestead
区块高度:1,150,000
以太坊价格:12.50 美元
2016 年 3 月 14 日
前端是使用 React 和 Typescript 实现的。此表单允许您提交区块编号并查找该区块的数据和水合交易。
infura.tsx

提交表单会向 Spring Boot API 发送一个请求,并使用 reducer 解析从后端返回的 JSON。

这只是访问存档数据启用的功能的一个简单示例。使用这个基本框架,您可以创建以太坊区块分析、更详细的区块浏览器、交易算法的回溯测试和区块链取证应用程序!
立即注册免费帐户,开始在 Infura 上使用免费的以太坊存档数据进行构建。
要获取有关如何为您的项目使用存档数据的更多信息,请通过 support@infura.io 与我们联系。
> 本文首发于:https://mp.weixin.qq.com/s/9F4jre9JiysTsAnuVJv25g
什么是归档节点?
在最近的 128 个区块之前,需要一个存档节点来访问来自以太坊区块链的数据。以太坊的全节点不会存储每个区块验证生成的世界状态。它们只需要存储诸如标题和块内容之类的信息。
一般需要将这些信息保留足够长的时间,以便能够按需建立区块链历史状态(最近 128 个区块之外的数据)。与整个区块链状态相比,仅存储少量数据可以使全节点能够最小化存储和计算成本以及同步时间。
另一方面,存档节点除了具有完整节点的所有功能外,还存储 TB 的历史数据,从而可以在任何时间点查询任何块。在撰写本文时,以太坊存档节点现在占用了 12 TB 的空间,完全同步和存档可能需要 6 个多月的时间。使用 Infura 访问存档数据有助于节省您运行自己的节点的时间和计算成本。
为什么要访问存档数据?
存档节点是以太坊网络上存储历史区块链数据的特定节点。因为它们提供了这些历史信息,所以当您需要审计过去的交易历史或收集数据时,它们会很有帮助。在归档模式下运行的完整节点对于了解事务的历史结果是必要的。您可以在任何时间点的任何区块回答与账户余额、智能合约代码、交易计数、代币供应、代币价格等相关的问题。
此状态包含每个钱包的余额和所有智能合约内部变量的值。这是向以太坊区块链添加新区块所必需的,因为新交易可能会执行智能合约。这些交易的结果将取决于这些内部变量的内容。
存档节点还可以在无需在区块链上创建交易的情况下测试智能合约。例如,如果您使用 Ganache,它是 Truffle 开发工具套件中的个人区块链模拟器,它使您能够在完全存档模式下在以太坊分叉,以便在部署到实时区块链之前测试智能合约。
常见用例
Etherscan 和 Dune Analytics 等服务使用存档节点为其用户提供对区块链交易的可见性。任何人都可以自己运行或通过他们的 Infura API 端点访问存档数据。以下是我们从 Infura 客户的归档请求中看到的一些常见用例:
获取并检查过去超过 128 个区块的任何地址(无论是外部拥有的账户还是智能合约)的余额信息。这可能是最常见的用例,也是我们的大型以太坊客户(例如去中心化交易所、流动性池和钱包)启用存档的原因。
调用特定的智能合约函数以通过该函数读取数据(如 ERC-20和 ERC-721令牌标准中的 eth_balanceOf)。出于以下目的,您可能需要阅读有关用户的外部拥有帐户的信息并检查他们是否有某个代币的余额:
- 去中心化交易所和流动资金池
- 钱包
- 使用 ERC-20 代币或 ERC-721 或任何其他具有 eth_balanceOf 功能的代币标准构建在以太坊上的游戏
- 任何 NFT 市场(由于需要调用 eth_balanceOf)
如果您是以下情况,需要获取“时间点数据”(特别是从特定的块):
- 索引器
- 任何试图为其用户显示帐户历史记录的公司
- 审计员、测试员或任何对智能合约进行取证分析的人,目的是弄清智能合约为何如此行事
教程:存档数据游乐场
我们创建了一个全栈应用程序,它为通过访问以太坊存档数据启用的各种用例提供参考实现和概念验证。
在此处查看存储库:https://github.com/anataliocs/Archive-Data-Playground
使用的技术:
• Java 11
• Spring Boot
• Gradle
• Typescript
• React/Redux
• node/npm
设置和配置
该项目使用 Java/Spring Boot 后端和 React 前端构建。您需要在本地安装以下依赖项才能运行此项目:
- An Infura account
- Git
- Node / npm
- Java 11
- An IDE
获取您的 API 端点 URL 和项目 ID
前往https://infura.io/并转到您的项目设置页面:
现在让我们设置我们的外部化配置,以便我们可以使用我们的项目 ID 而不会在 Github 上暴露这些细节。Spring Boot 应用程序在本地运行时使用 Spring Dev Tools,因此我们可以使用本地“.spring-boot-devtools.properties”文件来配置属性。
MacOS 用户的配置:
创建属性文件:
触摸 ~/.spring-boot-devtools.properties
打开属性文件:
vi ~/.spring-boot-devtools.properties
将以下行添加到属性文件:
infura.projectid=[YOUR_PROJECT_ID]
运行应用程序:
拉取源代码:
git clone git@github.com:anataliocs/Archive-Data-Playground.git
将项目导入您的 IDE,它应该会自动构建。我们的项目使用 gradle 构建后端,使用 npm 构建前端 UI。
将目录更改为项目文件夹:
cd archivedataplayground/
然后要运行完整堆栈,调用 Gradle 包装器:
./gradlew
此命令将在开发模式下启动 Spring Boot 后端,并在一个命令中启动 React 前端!
应用程序启动后,您应该看到以下内容:
在浏览器中通过 http://localhost:8080/ 导航到本地服务器
在右上角单击帐户-> 登录并使用预设的登录名和密码“admin/admin”
然后,您将有权访问该应用程序。登录流程来自用于创建基本项目骨架的基本 Jhipster 项目脚手架工具。
如果导航到 http://localhost:8080/admin/docs 或单击 Administration -> API,则可以直接查询 Infura JSON-RPC 端点
这将带您进入 Swagger UI 界面,您可以在其中调用 JSON-RPC 端点,例如获取超过 128 个块的块,这些块可通过具有水合事务的存档节点获得。然后可以在 Block Explorer 风格的应用程序或其他用例中使用这些调用。
一些有助于启用此功能的特定代码块包括:
https://github.com/anataliocs/Archive-Data-Playground/blob/main/src/main/java/io/infura/archivedataplayground/config/InfuraConfig.java
InfuraConfig.java
这段代码提供了一个“RestTemplate”单例,可以将它注入到需要它的类中,并帮助抽象出对 Infura 进行 JSON-RPC 调用的复杂性。
“dto.infura”包包含 POJO 对象,表示 Infura RPC 调用中使用的请求和响应 JSON。
https://github.com/anataliocs/Archive-Data-Playground/tree/main/src/main/java/io/infura/archivedataplayground/service/dto/infura
例如,以下 3 个 DTO 对象包含来自 eth_getBlockByNumber JSON-RPC 调用的块和水合交易响应,可用于从以太坊历史中获取存档块。
GetBlockByNumberResponse.java
Infura POJO 响应JSON的反序列化
GetBlockByNumberResult.java
Infura POJO 响应JSON的反序列化
Transaction.java
包含的“RestTemplate”将自动将响应编组/解组到这些对象类型中。
您还可以考虑使用 https://github.com/web3j/web3j 来帮助促进使用 Spring Boot 后端进行的 Infura JSON–RPC 调用。
前端
存档数据启用的一项功能是块探索。
此区块浏览器显示有关以太坊历史上著名区块的信息,例如:
前沿 (Frontier)
块高度:0
创世区块
2015 年 7 月 30 日
前沿解冻(Frontier Thawing)
区块高度:200000
以太坊价格:1.24 美元
2015 年 9 月 7 日
Homestead
区块高度:1,150,000
以太坊价格:12.50 美元
2016 年 3 月 14 日
前端是使用 React 和 Typescript 实现的。此表单允许您提交区块编号并查找该区块的数据和水合交易。
infura.tsx
提交表单会向 Spring Boot API 发送一个请求,并使用 reducer 解析从后端返回的 JSON。
这只是访问存档数据启用的功能的一个简单示例。使用这个基本框架,您可以创建以太坊区块分析、更详细的区块浏览器、交易算法的回溯测试和区块链取证应用程序!
立即注册免费帐户,开始在 Infura 上使用免费的以太坊存档数据进行构建。
要获取有关如何为您的项目使用存档数据的更多信息,请通过 support@infura.io 与我们联系。
本文首发于:https://mp.weixin.qq.com/s/9F4jre9JiysTsAnuVJv25g
- 发表于 2022-06-14 11:40
- 阅读 ( 422 )
- 学分 ( 1 )
- 分类:以太坊