主页 > 最新imtoken官网下载地址 > 基于以太坊区块链的物联网设备访问控制机制

基于以太坊区块链的物联网设备访问控制机制

最新imtoken官网下载地址 2023-01-17 01:59:30

最近在做一个新项目时,我偶然发现了一个问题:我必须或多或少地实时将所有交易发送到给定帐户。看了Web3.js API文档和栈溢出后,没有明确的办法做到这一点,所以我尝试自己创建一些程序。,这就是该计划应运而生的原因。

两个脚本

经过大量的尝试和错误,我想出了两个脚本,它们都适合不同的状态,第一个很慢但可扩展性更好,另一个非常轻量级但可定制性较差。让我们一起探索它们。

检查地址的交易可能看起来很简单,但实际上比我最初想象的要困难得多。希望我们可以通过监听某种网络事件来监控以太坊地址的传入交易,但这种功能还不存在。

在开始之前,您需要满足以下要求:

运行中的以太坊节点,例如 Geth 或 Infura

Node.js 和 NPM

使用 npm init 初始化的新目录

我们只需要一个依赖项——web3.js(查看文档)。与以太坊网络交互的 API。所以一定要安装npm。

首先为我们创建一个初始化web3客户端的模块:

注意本文中的每个片段都是一个单独的js文件,我们结合index.js

该模块接收 Web3 数据包并返回一个初始化的客户端。我在 rinkeby 测试网上使用 Infura 以太坊节点,如果您决定这样做(我推荐),请确保将 YOUR_INFURA_API_KEY 替换为正确的密钥。

接下来,我们将创建实际的事务检查器:

我们的第二个模块使用这个 web3 客户端来查询实际的网络。我们有一个私人帐户变量,您应该将其替换为您感兴趣的地址并返回 checkLastBlock 函数。首先,我们检索最新的块并将数字记录到控制台。这样的代码块是这样的(我排除了一些对我们没有用的字段):

您可以看到 number、nonce 和 hash 之类的字段,但我们现在真正感兴趣的是事务字段。这是一个包含此块中包含的所有事务哈希的数组。

在 transacTIonChecker.js 的第 9 行,我们检查 block 和 block.transacTIons 数组是否为空,在第 10 行,我们遍历数组。对于数组中的每个事务哈希,我们请求实际事务。交易看起来像这样:

如果我们现在发现 to 字段(交易的接收端的地址)等于我们的地址(不要忘记 toLowerCase() 函数),那么我们已经找到了我们要查找的内容并且可以记录一些数据到控制台。(如果交易不包含“收件人”字段,则创建合同)

从好的方面来说,我们可以将此脚本扩展为,例如,在一系列区块之间检查该账户的所有交易,如下所示:

也不要忘记返回这个函数。

如果您对我如何编写模块感到完全困惑:我导出了所谓的工厂函数,这是 JavaScript 的一个很好的设计模式。

第二个程序使用以太坊的 pub/sub。pub/sub 是一个系统,发布者通过该系统不断地向网络广播与特定主题相关的事件,客户端(订阅者)可以订阅这些事件。这比像我们在第一个程序中所做的那样不断地轮询网络要好得多,也快得多。但是你必须考虑以下几个方面:

- 实时发送当前事件的通知,而不是过去的事件。之前的程序可以调整为搜索一系列区块之间的交易,但这不适用于这个程序。

- 订阅需要全双工连接。幸运的是,Infura 和 Geth 都以 websocket 的形式提供了这种连接。

由于我们正在实时监控帐户,这些点不会打扰我们,让我们继续。我现在正在一个新的 npm 目录中工作,如果您正在编码,请记住这一点。

首先,我们必须创建我们的客户。对于这个程序,我们需要一个普通的 http 提供者以及一个 websocket 提供者。在我们的代码中,我们将两者都返回到一个对象中——web3http 将是 http 客户端,web3 是 websocket 客户端:

现在对于事务检查器的第二个版本:

让我们分解一下。有几个主题可供订阅,例如 newBlockHeaders 或日志。日志是理想的,但是这个订阅主题还没有工作。所以我们将使用pendingTransactions 订阅。这发生在第 5 行。我们的订阅是一个事件发射器,当有人发送新交易(因此尚未确认)时以太坊和区块链,它会向我们发送该交易的交易哈希。这发生在函数 watchTransactions 中,我们在第 11 行公开了它。

由于这些交易尚未确认,我们将使用 setTimeout 函数阻止每个事件的进一步代码执行,直到一分钟后,希望到那时,交易将被挖掘。因为在那之后,我们实际上只是做了和第一个程序一样的事情:检索交易,并检查我们的地址是否是接收端的地址。

最后是我们的索引文件:

该程序更优雅,不占用大量资源。但是请注意,这两个程序都有一些可靠性问题。我们讨论的第一个块:如果块时间远低于平均块时间,则该块可能会丢失。其次,如果有人支付少量费用,它肯定不会在一分钟后被挖掘出来。在我的项目中,我将 setTimeout 增加到 5 分钟,因为这仍在我考虑的范围内。但如果您想实际使用此功能,请小心。理想情况下,我们会订阅日志以太坊和区块链,但这仍然是一个真正的错误,因此是一个非常糟糕的主意。