用Infura访问Ethereum存档节点

611 阅读14分钟

DZone>安全区>用Infura访问Ethereum存档节点

用Infura访问Ethereum存档节点

了解Ethereum归档节点,然后建立一个简单的React项目,看看如何使用Infura RPC端点URL访问历史区块链数据。

Paul McAviney user avatar 作者

保罗-麦卡文尼

CORE -

22年6月3日 - 安全区 -教程

喜欢 (1)

评论

保存

鸣叫

29次浏览

加入DZone社区,获得完整的会员体验。

免费加入

归档节点是以太坊网络上存储历史区块链数据的特殊节点。因为它们提供这些历史信息,所以当你需要审计过去的交易历史或收集数据时,它们很有帮助。像EtherscanDune Analytics这样的服务使用存档节点,但任何人都可以自己运行一个。

在这篇文章中,我们将回顾不同类型的以太坊节点,深入了解归档节点,并介绍Infura的新归档节点功能。然后,我们将通过一个真实世界的项目,展示如何将Infura API和web3.js连接到一个预建的react前端。一旦完成,用户将能够查询一个存档节点,以获得给定的Ethereum钱包地址的一些统计数据。

目录

  • 什么是以太坊节点?
  • 以太坊节点的类型
  • 归档节点
  • 归档节点供应商
  • 该项目
  • 总结

什么是以太坊节点?

简单来说,一个节点只是网络中的一个连接点。然而,在以太坊的情况下,不同类型的节点对网络承担着不同的责任。

以太坊区块链在所谓的以太坊虚拟机(EVM)上运行,它是一种去中心化的全球计算机。在这种情况下,节点为该计算机提供处理能力。它们为请求的数据提供服务,创建和验证区块,存储交易数据或智能合约代码,以及更多。任何拥有所需硬件的人都可以下载一个以太坊客户端,并启动他们自己的节点来参与网络。这也防止了任何单一实体控制整个网络,有助于以太坊的去中心化。

有四种主要的以太坊节点,每种节点对网络的贡献不同。它们一起向其他节点传递信息,验证交易和EVM状态,并提供保持以太坊网络有效运行所需的基础设施。他们相互沟通,以确保他们都同意网络的状态。因此,拥有更多的节点使网络更强大,对攻击更有弹性。

以太坊节点的类型

完整节点

完整节点验证交易和EVM状态,验证区块,启动和执行智能合约代码,并可以在请求时提供网络数据。它们也存储以太坊区块链的状态,直到最近的128个区块,但可以根据需求建立历史状态的档案。

挖矿节点(又称 "矿工")

矿工是一个运行采矿客户端的完整节点。在其目前的状态下,以太坊通过工作证明算法提供共识。概括地说,这意味着一个采矿节点与其他采矿节点进行计算竞赛,以创建下一个区块。一旦创建,新区块就会被广播到网络上,由其他节点验证,并附加到区块链的末端。

光节点

轻节点是全节点的 "轻 "版本,它只包含区块头数据,如前一个区块的哈希值和时间戳,而不是整个区块数据。它们按需向完整节点提出请求,并只根据用户的要求验证某些部分的状态。例如,用于检查余额,验证交易是否被确认,检查事件日志,以及做其他轻量级的任务。轻型节点可以很容易地由较低容量的设备运行,如手机或RaspberryPi。

归档节点

归档节点是完整节点的一种类型,以 "归档模式 "运行。它们包含与完整节点相同的所有数据,但也包含整个区块链自创世块以来的所有历史状态数据。在本文的剩余部分,我们将重点关注存档节点。

关于存档节点的更多信息

虽然全节点可以重建历史上的区块链状态数据,但这个过程是缓慢和低效的。根据不同的使用情况,这些数据可能需要快速提供。这就是归档节点的作用。因为归档节点包含从第一个区块开始的历史数据,它们可以在任何时候轻松追踪任何任意交易。

为什么要访问一个存档节点?

如果你需要从以太坊区块链上获得最近128个区块之前的信息,最有效的方法是通过存档节点来获得。其中一些信息可能包括账户余额、智能合约代码、交易计数或某一存储位置的价值。它们还可以在不创建区块链上的交易的情况下测试智能合约代码。

运行一个存档节点的规格

运行你自己的节点意味着对你与区块链共享的信息有更多的控制。你可以创建更安全和私有的dApps(去中心化的应用程序),你的地址和余额不会泄露给网络上的随机节点。运行一个存档节点也意味着快速访问历史区块链数据,而无需签署任何第三方服务。

这些是你能够运行自己的以太坊存档节点所需要的规格。

  • 一个至少有四个核心的CPU
  • 16GB或以上的内存
  • 一个至少有6TB空间的SSD驱动器
  • 至少25MBit/s的带宽

正如你所看到的,启动一个归档节点的要求使其可以合理地获得。虽然不是很便宜,但对个人来说还是可以承受的。不过,它确实需要一些技术知识和持续的维护。如果你没有时间、动力或设备来运行你自己的,节点供应商是一个很好的选择。

归档的节点供应商

节点提供者通过其易于使用的API,使任何人都可以简单地访问和与以太坊区块链互动。你需要做的就是创建一个新项目,然后用他们提供的URL轻松调用JSON RPC方法。

Infura

Infura可以说是该领域的一个受欢迎的节点提供商。它是由MetaMask和Truffle区块链开发框架背后的团队ConsenSys创建的。他们已经存在了一段时间,他们的服务对于初学者和希望扩大规模的组织来说是很好的。

  • 有免费的存档节点接入
  • 提供对第2层扩展解决方案的访问
  • 还有其他的附加功能来满足你的需求

使用案例

根据你正在建立的项目类型,有几种不同的技术你可以连接到节点提供者。

Truffle/Hardhat

如果你正在编写与历史数据互动的智能合约,那么像Truffle或Hardhat这样的开发套件将符合你的需求。它们都有各种各样的内置工具,使你的dApp的整个开发生命周期变得更加容易。在这种情况下,连接到归档节点,就像把你提供的API URL端点设置为一个变量在你的前端代码中使用一样简单。

Ganache

如果您需要快速访问存档节点进行本地开发或测试,Truffle提供了一个个人区块链,可以很好地完成这个任务。这个区块链被称为Ganache。从Ganache 7.0版本开始,启动一个具有归档权限的以太坊区块链的本地实例就像一个命令一样简单。

ganache --fork

然后你可以像上面一样与它互动,使用URL:http://localhost:8545,或者你设置的任何端口。

直接集成

如果你不需要一套区块链工具,那么你可以在你的前端代码中直接使用你的节点提供者URL,并通过一个JavaScript库(如ethers.js或web3.js)连接到它。这就是我们将在下面的项目中探讨的选项。

该项目

如本文开头所述,我们将制作一个简单的 "年度回顾 "类型的应用程序,以显示2021年的一些钱包统计数据。我们将克隆一个预构建的前端,所以我们所要担心的是查询一个存档节点,然后很好地显示数据。

我们将学到什么?

  • 如何获得一个有存档权限的Infura API URL
  • 如何使用Infura API URL和web3.js收集档案数据
  • 从区块链上收集数据所需的JavaScript
  • 如何把数据放在一起,以便在应用程序中很好地显示它

完成这个项目需要什么?

其他资源。

Infura的API URL

我们项目的第一步是建立我们的Infura账户并获得我们的API端点URL。前往Infuria网站,创建一个新的账户或登录。

创建一个新的项目,以获得我们的项目以后需要的API端点URL。

获取你的Infura RPC端点URL

由于存档访问对所有用户都是免费的,我们不需要用我们的Infura账户完成任何其他步骤。

解决了这个问题,让我们开始在前端工作吧!

前端

在这个项目的其余部分,我们将建立在一个预制的React前端之上。如果你以前从未使用过React,那也没关系。我们将一起完成其余的步骤。

为了正确安装该项目,我们将使用Gitnode包管理器(npm)。要看它们是否已经安装,我们可以在命令行中检查版本号。

npm --version
git --version

如果它们仍然需要在你的机器上安装,你可以在 "项目 "部分提供的链接中获得它们。

一旦安装完毕,我们就可以开始进行项目的其他部分了。

第1步

在命令行中,导航到你想工作的文件夹,克隆我们项目的资源库。

git clone https://github.com/paul-mcaviney/archive-node-project-frontend.git

第2步

改变目录到新的项目文件夹,并安装所需的依赖性。

cd archive-node-project-frontend
npm i

第3步

在依赖关系安装完毕后,让我们运行项目,以确保它到目前为止都在正常工作。

npm start

如果一切安装正确,我们现在将有一个运行在http://localhost:3000的前端,看起来像这样。

我们的React项目前端

有一个文本字段,我们将用来输入一个钱包地址。点击提交按钮,我们将进入我们的结果页面。我们也可以通过按下输入新地址按钮从这里返回到输入页面。

第四步

在我们开始编码之前,我们需要再安装一个依赖项。我们将使用web3.js来访问Infura URL的存档节点。要安装web3.js,请在我们项目的目录中输入以下命令。

npm install web3

第5步

我们将在src文件夹下的App.js文件中进行所有的编码。我们需要写的第一段代码是将web3 ,并将其连接到我们的Infura URL。在import语句下,在App函数前,添加以下代码。

JavaScript

const Web3 = require('web3'); 
const infuraURL = 'YOUR_INFURA_URL_HERE'; 
const web3 = new Web3(new Web3.providers.HttpProvider(infuraURL));

注意:在没有隐藏你的实际Infura URL之前,不要把这个项目上传到公共资源库。你可以使用环境变量来实现这一点。

第六步

我们将使用useState React挂钩来更新我们的用户界面。你会注意到它已经在我们文件的顶部被导入了。接下来,让我们添加一些React状态变量,使其更容易显示我们从存档节点收集的数据。在结果状态变量下,添加以下内容。

JavaScript

const [address, setAddress] = useState(''); 
const [currentBalance, setCurrentBalance] = useState(0); 
const [startOfYearBalance, setStartOfYearBalance] = useState(0); 
const [endOfYearBalance, setEndOfYearBalance] = useState(0); 
const [balanceDifference, setBalanceDifference] = useState(0); 
const [transactionCount, setTransactionCount] = useState(0);

第七步

现在我们需要更新handleInput 函数,将用户的输入分配给我们的地址状态变量,而不是记录评论。

JavaScript

const handleInput = event => { 	
    setAddress(event.target.value); 
};

注意:你会注意到我们没有在这里放任何检查,以确保用户输入的实际上是一个Ethereum钱包地址。这是为了保持本教程的简单性。如果公开部署,你会希望以不同的方式处理这个问题。

第八步

最后一点JavaScript是一个异步函数,将从存档节点收集数据,将其转换为更可读的值,并设置我们的状态变量。在注释中说你的JavaScript代码将放在这里,键入以下代码。

JavaScript

// Access and process data from Ethereum blockchain
const accessEthereum = async () => {

    // 2021 Start and End Block variables 
    const START_2021_BLOCK = 11565019;
    const END_2021_BLOCK = 13916165;
 
    // Get current balance of address 
    const balance = await web3.eth.getBalance(address);

    // Convert balance from wei to ETH and set state variable
    setCurrentBalance(await web3.utils.fromWei(balance.toString(), 'ether'));
        
    // Get wallet balance at the start of 2021 (Block #11565019)
    const startBalance = await web3.eth.getBalance(address, START_2021_BLOCK);

    // Get wallet balance at the end of 2021 (Block #13916165)
    const endBalance = await web3.eth.getBalance(address, END_2021_BLOCK);
         
    // Convert startBalance to ETH and set state variable
    const startBalanceAsETH = await web3.utils.fromWei(startBalance.toString(), 'ether');
    setStartOfYearBalance(startBalanceAsETH);

    // Convert endBalance to ETH and set state variable
    const endBalanceAsETH = await web3.utils.fromWei(endBalance.toString(), 'ether');
    setEndOfYearBalance(endBalanceAsETH);

    // Set balanceDifference from start to end of 2021
    setBalanceDifference(endBalanceAsETH - startBalanceAsETH);

    // Get transaction count at start of 2021 (Block #11565019)
    let startTransactions = await web3.eth.getTransactionCount(address, START_2021_BLOCK);

    // Get transaction count at end of 2021 (Block #13916165)
    let endTransactions = await web3.eth.getTransactionCount(address, END_2021_BLOCK);

    // Set total transaction count in 2021
    setTransactionCount(endTransactions - startTransactions);

    // Received results, condition met to show them on screen
    setResults(true);    

};

第九步

接着是HTML,我们需要做的第一件事是用我们刚刚写的新函数替换按钮函数。在改变这个按钮函数的注释下,改变按钮的函数调用。

<button onClick={accessEthereum} className='form-button' type='submit' name='submit' id='submit'>

第10步

我们需要的最后一点代码是HTML,它将显示我们从存档节点收集的数据。在返回语句中,向下滚动到注释,说你的HTML代码将放在这里,并添加以下内容。

HTML

<h3>{address}</h3>

<p className='result-heading'>Current Balance</p>
<p>{currentBalance} ETH</p>

<p className='result-heading'>Start of 2021 Balance</p>
<p>{startOfYearBalance} ETH</p>

<p className='result-heading'>End of 2021 Balance</p>
<p>{endOfYearBalance} ETH</p>

<p className='result-heading'>Difference from Start of 2021</p>
<p>{balanceDifference} ETH</p>

<p className='result-heading'>Number of transactions in 2021</p>
<p>{transactionCount}</p>
<br />

要查看完整的项目代码,请查看这个GitHub仓库

第11步

现在,让我们测试一下我们的应用程序,看看它是否有效首先,启动该应用程序。

npm start

在文本字段中输入一个Ethereum钱包地址,然后点击提交。如果你没有一个在2021年活跃的钱包地址,你可以使用Vitalik的。

2021年的钱包统计数据

棒极了!我们的结果显示正确,我们可以看到钱包地址在2021年的所有活动!

我们学到了什么

通过本教程,你使用你的Infura API端点URL访问了存档节点上的数据,然后在一个简单的ETH年度回顾应用程序中很好地显示了它。

要访问以太坊区块链上最近128个区块之前的数据,需要一个归档节点。他们存储了从第一个区块开始的所有历史状态数据,并比完整的节点更快速有效地提供这些数据。现在,Infura向所有用户提供免费的存档节点访问,收集历史区块链数据从未如此简单

归档 以太坊 数据

DZone贡献者所表达的观点是他们自己的。

DZone上的热门文章


评论

安全 合作伙伴资源