当前位置: 首页 > 科技观察

使用Infura访问以太坊存档节点

时间:2023-03-14 20:58:46 科技观察

译者|布加迪评论|孙淑娟档案节点是以太坊网络上存储历史区块链数据的特定节点。因为它们提供了这些历史信息,所以当您需要审核过去的交易历史或收集数据时,它们非常有用。Etherscan和DuneAnalytics等服务使用存档节点,但任何人都可以自己运行存档节点。在本文中,我们将介绍不同类型的以太坊节点,深入了解存档节点,并介绍Infura的新存档节点功能。然后,我们将使用一个真实的项目作为示例来展示如何将InfuraAPI和web3.js连接到预构建的React前端。完成后,用户可以查询存档节点以获取特定以太坊钱包地址的一些统计信息。1.以太坊节点介绍简单来说,节点就是网络中的一个连接点。就以太坊而言,不同类型的节点对网络有不同的责任。以太坊区块链在所谓的以太坊虚拟机(EVM)上运行,这是一种去中心化的全球计算机。节点为计算机提供处理能力。他们可以提供请求的数据、创建和验证区块、存储交易数据或智能合约代码等等。任何拥有所需硬件的人都可以下载以太坊客户端软件,启动自己的节点并参与网络。这也防止了任何单一实体控制整个网络,促进了以太坊的去中心化。有四种主要类型的以太坊节点,每种类型对网络的贡献不同。它们一起将信息中继到其他节点,验证交易和EVM状态,并提供保持以太坊网络高效运行所需的基础设施。他们相互通信以确保他们都能就网络状态达成一致。因此,拥有更多的节点会使网络更强大,更能抵抗攻击。2.以太坊节点类型全节点全节点验证交易和EVM状态,验证区块,启动和执行智能合约代码,并在请求时提供网络数据。他们还将以太坊区块链的状态存储到最后128个区块,并可以根据需要建立历史状态档案。挖矿节点(也叫Miner)挖矿节点是运行挖矿客户端软件的全节点。在目前的状态下,以太坊通过工作量证明算法提供共识。这意味着挖矿节点与其他挖矿节点竞争计算能力以创建下一个区块。一旦创建,新块将被广播到网络,由其他节点验证,并附加到区块链的末尾。轻节点轻节点是全节点的“轻量级”版本,它只包含区块头数据,例如前一个区块的哈希值和时间戳,而不是整个区块数据。他们向全节点发出按需请求,仅在用户需要时验证部分状态。典型用途是检查余额、验证交易是否已确认、检查事件日志以及执行其他轻任务。轻节点很容易由低容量设备运行,如手机或树莓派。存档节点存档节点是在“存档模式”下运行的完整节点。它们包含与全节点相同的所有数据,但还包含一个创世块(第一个块)来记录整个区块链的所有历史状态数据。下面将重点介绍归档节点。3.存档节点详解全节点虽然可以重构历史区块链状态数据,但这个过程缓慢且低效。根据用例,您可能需要快速提供此数据。这时候,存档节点就派上用场了。由于存档节点包含自第一个区块以来的历史数据,因此它们可以随时轻松跟踪任何交易。为什么要访问存档节点?如果您需要从以太坊区块链中获取最近128个区块之前的信息,最有效的获取方式是通过存档节点。其中一些信息可能包括账户余额、智能合约代码、交易数量或特定存储位置的价值。它们还允许在不在区块链上创建交易的情况下测试智能合约代码。运行存档节点的硬件规格运行您自己的节点意味着更好地控制您与区块链共享的信息。您可以创建更安全和私密的dApp(去中心化应用程序),确保您的地址和余额不会泄露到网络上的随机节点。运行存档节点还意味着无需注册任何第三方服务即可快速访问历史区块链数据。这些是您运行自己的以太坊存档节点所需的硬件规格:至少四核的CPU至少16GB的内存至少6TB空间的SSD驱动器至少25MBit/s的带宽平滑访问。不完全便宜,但个人负担得起。不过,它确实需要一些技术知识和持续维护。如果您没有时间、精力或设备来自己运行节点提供商,那它就很棒。4.存档节点提供商节点提供商允许任何人通过易于使用的API轻松访问以太坊区块链并与之交互。您所要做的就是创建一个新项目,然后使用您的节点提供商提供的URL轻松调用JSONRPC方法。InfuraInfura可以说是该领域颇受欢迎的节点提供商。它是由ConsenSys创建的,ConsenSys是MetaMask和Truffle区块链开发框架背后的团队。它已经存在了一段时间,它的服务非常适合初学者和希望扩大规模的组织。具有免费的存档节点访问权限提供对第2层扩展解决方案的访问权限满足您需求的其他附加用例根据您构建的项目类型,您可以使用多种不同的技术连接到节点提供商。Truffle/Hardhat如果您正在编写与历史数据交互的智能合约,那么Truffle或Hardhat等开发工具包将适合您。它们都有各种各样的内置工具,使dApp的整个开发生命周期变得极其简单。在这种情况下,连接到存档节点就像将提供的APIURL端点设置为要在前端代码中使用的变量一样简单。Ganache如果您需要快速访问存档节点以进行本地开发或测试,Truffle提供的个人区块链可以很好地做到这一点。这个区块链叫做Ganache。从Ganache7.0版开始,启动具有存档访问权限的以太坊区块链本地实例只是一个命令:ganache--fork然后您可以使用URL:http://localhost:8545或您将端口设置为URL的任何内容,以与上述类似的方式进行交互。直接集成如果您不需要一套区块链工具,您可以直接在前端代码中使用节点提供者URL,并使用ethers.js或web3.js等JavaScript库连接到它。这是我们将在下面的项目中探索的选项。五、项目正如本文开头提到的,我们将制作一个简单的“年度回顾”类型的应用程序来显示2021年的一些钱包统计数据。我们将克隆一个预构建的前端,这样我们只关心查询存档节点,并很好地显示数据。我们将学习:如何获取具有存档访问权限的InfuraAPIURL如何使用InfuraAPIURL和web3.js收集存档数据。很高兴展示完成项目所需的内容:Infura帐户GitNode.js/npm代码编辑器其他资源:Infura文档Web3.js文档InfuraAPIURL我们项目的第一步是设置一个Infura帐户,并获取API端点URL。转到Infuria网站,创建一个新帐户或登录。创建一个新项目以获取我们稍后在项目中需要的API端点URL。由于所有用户都可以免费访问存档,因此我们不需要使用Infura帐户完成任何其他步骤。让我们开始在前端工作吧!前端我们将为这个项目的其余部分构建一个预构建的React前端。如果您以前从未使用过React也没关系。我们将一起完成剩余的步骤。为了正确安装项目,我们将使用Git和节点包管理器(npm)。要查看它们是否已经安装,我们可以在命令行检查版本号:npm--versiongit--version如果它们仍然需要安装在您的机器上,您可以通过“项目”中提供的链接获取它们“部分。安装后,我们可以开始处理项目的其余部分:第1步在命令行中,导航到您要处理的文件夹,然后克隆我们项目的存储库:gitclonehttps://github.com/paul-mcaviney/archive-node-project-frontend.git步骤2将目录更改为新项目文件夹,安装所需的依赖项:cdarchive-node-project-frontendnpmi步骤3安装依赖项后,让我们运行项目确保它到目前为止工作正常:npmstart如果一切安装正确,现在有一个前端在http://localhost:3000上运行,如下所示:有一个用于输入钱包地址的文本字段。点击“提交”按钮进入结果页面。从这里我们还可以通过按“输入新地址”按钮返回输入页面。第4步在我们开始编码之前,我们需要安装一个依赖项。我们将使用web3.js通过InfuraURL访问存档节点。要安装web3.js,请在我们的项目目录中键入以下命令:npminstallweb3步骤5我们将在src文件夹下的App.js文件中完成所有编码。需要编写的第一段代码是将web3导入我们的项目并将其连接到InfuraURL。在import语句下,在App函数之前,添加以下代码:JavaScriptconstWeb3=require('web3');constinfuraURL='YOUR_INFURA_URL_HERE';constweb3=newWeb3(newWeb3.providers.HttpProvider(infuraURL));注意:如果没有先隐藏您的实际InfuraURL,请不要将此项目上传到公共存储库。您可以为此使用环境变量。第6步我们将使用useStateReact挂钩来更新UI。您会注意到它已经导入到我们文件的顶部。接下来,让我们添加一些React状态变量,以便更轻松地显示我们从存档节点收集的数据。在结果状态变量下,添加以下内容:JavaScriptconst[address,setAddress]=useState('');const[currentBalance,setCurrentBalance]=useState(0);const[startOfYearBalance,setStartOfYearBalance]=useState(0);const[endOfYearBalance]=useState(0);,setEndOfYearBalance]=useState(0);const[balanceDifference,setBalanceDifference]=useState(0);const[transactionCount,setTransactionCount]=useState(0);第7步现在我们需要更新handleInput函数以将用户输入分配给我们的地址状态变量而不是记录评论:JavaScriptconsthandleInput=event=>{setAddress(event.target.value);};注意:你会注意到我们在这里没有做任何检查来确保用户输入的内容实际上是以太坊钱包地址。这是为了使本教程简单。如果公开部署,则需要以不同方式处理。第8步最后一段JavaScript是一个异步函数,它将从存档节点收集数据,将其转换为更易读的值,并设置我们的状态变量。在表示你的JavaScript代码将放在这里(你的JavaScript代码将在这里)的注释下,键入以下代码:JavaScript//从以太坊访问和处理数据blockchainconstaccessEthereum=async()=>{//2021Start和结束块变量constSTART_2021_BLOCK=11565019;常数END_2021_BLOCK=13916165;//获取地址的当前余额constbalance=awaitweb3.eth.getBalance(address);//将余额从wei转换为ETH并设置状态变量setCurrentBalance(awaitweb3.utils.fromWei(balance.toString(),'ether'));//获取2021年初的钱包余额(区块#11565019)conststartBalance=awaitweb3.eth.getBalance(address,START_2021_BLOCK);//获取2021年底的钱包余额(区块#13916165)constendBalance=awaitweb3.eth.getBalance(address,END_2021_BLOCK);//将startBalance转换为ETH并设置状态变量conststartBalanceAsETH=awaitweb3.utils.fromWei(startBalance.toString(),'ether');设置StartOfYearB余额(startBalanceAsETH);//将endBalance转换为ETH并设置状态变量constendBalanceAsETH=awaitweb3.utils.fromWei(endBalance.toString(),'ether');setEndOfYearBalance(endBalanceAsETH);//设置从2021年开始到结束的balanceDifferencesetBalanceDifference(endBalanceAsETH-startBalanceAsETH);//获取2021年初的交易计数(区块#11565019)letstartTransactions=awaitweb3.eth.getTransactionCount(address,START_2021_BLOCK);//在6结束的153219获取交易锁计数)letendTransactions=awaitweb3.eth.getTransactionCount(address,END_2021_BLOCK);//设置2021年的总交易数setTransactionCount(endTransactions-startTransactions);//收到结果,满足在屏幕上显示它们的条件setResults(true);};第9步转到HTML,我们做的第一件事是用我们刚刚编写的新函数替换按钮函数在changethisbuttonfunctioncomment下,更改按钮的函数调用:Step10最后一块我们需要的代码是HTML,它将显示我们从存档节点收集的数据。在返回语句中,向下滚动到说明您的HTML代码将放在此处(您的HTML代码将放在此处)的注释并添加以下内容:HTML

{address}

当前余额

{currentBalance}ETH

2021年初余额

{startOfYearBalance}ETH

2021年底余额

{endOfYearBalance}ETH

与2021年初的差异

{balanceDifference}ETH

2021年交易笔数

{transactionCount}


查看完整项目代码,查看出这个GitHub存储库。第11步让我们测试我们的应用程序,看看它是否有效!首先启动应用程序:npmstart在文本字段中输入以太坊钱包地址,然后单击“提交”。如果您在2021年没有有效的钱包地址,您可以使用Vitalik的钱包地址。奇妙!我们的结果显示正确,可以看到2021年钱包地址的所有活动!6.结论如果您遵循本教程,您可以使用InfuraAPI端点URL访问存档节点上的数据,然后在一个简单的ETH年度回顾应用程序中很好地显示它。存档节点可以访问以太坊区块链中最近128个区块的数据。它们存储来自第一个块的所有历史状态数据,并且可以比全节点更快、更有效地提供这些数据。鉴于Infura允许所有用户免费访问存档节点,收集历史区块链数据从未如此简单!原标题:AccessingEthereumArchiveNodesWithInfura,作者:PaulMcAviney