EOS状态处理程序demux-js

Demux是一种后端基础架构模式,用于处理区块链事件,以便确定性地更新可查询数据存储并触发side effects。Demux.js库用作该模式的参考实现,可以与Node应用程序一起使用。

安装

1
2
3
4
5
# Using yarn
yarn add demux

# Using npm
npm install demux --save

概述

Flux Architecture模式和Redux中汲取灵感,Demux诞生于以下资格:

  • 区块链中状态如何存在与客户端前端如何查询之间关注点的分离。
  • 客户端前端不仅仅负责确定派生,还有减少或累积的状态。
  • 区块链事件能够触发新交易,以及区块链之外的其他副作用。
  • 区块链是所有应用程序状态的唯一真实来源。

分离的持久层

在区块链上以索引状态存储数据可能有用,原因有三:计算结果的分散共识,其他区块链计算中的状态使用,以及客户端前端使用状态的查询。在构建更复杂的前端时,直接从索引的区块链状态查询时会遇到一些问题:

  • 用于查询索引数据的查询接口是有限的。复杂的数据要求可能意味着你必须在客户端上进行大量的查询并处理数据,或者必须在区块链本身上存储其他衍生数据。扩展查询负载意味着创建更多的区块链端点节点,这可能非常昂贵。
  • Demux通过将查询卸载到你想要的任何持久层来解决这些问题。当区块链事件发生时,你选择的持久层将由updater函数更新,这些函数确定性地处理Action对象数组。然后,你的前端可以通过合适的API(例如,REST或GraphQL)查询持久层。

这意味着我们可以将我们的问题分开:对于需要去中心化的计算共识或来自其他区块链事件访问的数据,我们仍然可以将数据存储在索引的区块链状态中,而不必担心定制到前端查询。对于我们前端所需的数据,我们可以在我们选择的可水平扩展的持久层中以一种易于查询数据的方式预处理和索引数据。最终结果是两个系统都能更有效地发挥其作用。

Side Effects

由于我们有一个确定性地处理特定区块链事件的系统,我们也可以利用这个系统来管理非确定性事件。这些效果函数与updater函数几乎完全相同,除非它们异步运行,在延时期间不运行,并且修改确定性数据存储区是禁止的。示例包括:签署和广播交易,发送电子邮件以及启动传统的法定付款。

真正来源

对于上述问题还有其他解决方案涉及legacy持久层,这些legacy层是它们自己的真实来源。然而,通过从区块链中获得所有状态,我们获得了以下好处:

  • 如果累积的数据存储区丢失或删除,则可以通过区块链延时操作来重新生成。
  • 只要应用程序代码是开源的,并且区块链是公共的,就可以审计所有应用程序状态。
  • 无需维护多种更新状态的方式(提交交易是唯一的方式)。

数据流向

  • 1.客户端将交易发送到区块链。
  • 2.Action Watcher调用Action Reader来检查新块。
  • 3.Action Reader在新块中查看交易,解析操作。
  • 4.Action Watcher向Action Handler发送操作。
  • 5.Action Handler通过Updaters和Effects处理操作。
  • 6.Actions会运行相应的Updaters,更新数据存储区的状态。
  • 7.动作运行相应的效果,触发外部事件。
  • 8.客户端查询API以获取更新的数据。

类实现

RepositoryDescription
EOSIO/demux-js-eos Action Reader implementations for EOSIO blockchains
EOSIO/demux-js-postgres Action Handler implementation for Postgres databases
Zapata/demux-js-bitshares Action Reader implementations for BitShares blockchain

Block.one正式支持

要列出你的项目,请在此处添加并提交PR!

用法

该库提供以下类:

为了处理操作,我们需要以下内容:

  • AbstractActionReader的实现。
  • AbstractActionHandler的实现。
  • 至少一个HandlerVersion,包含UpdaterEffect数组。

有了它们之后,我们需要:

  • 使用任何所需的配置实例化实现的AbstractActionReader
  • 实例化实现的AbstractActionHandler,传入HandlerVersion和任何其他所需的配置。
  • 实例化BaseActionWatcher(或子类),传入Action HandlerAction Watcher实例。
  • 通过Action Watcher的watch()方法开始索引(通过直接调用或以其他方式调用)。

例子

1
2
3
4
5
6
7
8
const { BaseActionWatcher, ExpressActionWatcher } = require("demux")
const { MyActionReader } = require("./MyActionReader")
const { MyActionHandler } = require("./MyActionHandler")
const { handlerVersions } = require("./handlerVersions")
const { readerConfig, handlerConfig, pollInterval, portNumber } = require("./config")

const actionReader = new MyActionReader(readerConfig)
const actioHandler = new MyActionHandler(handlerVersions, handlerConfig)

然后,要么这样:

1
2
3
4
5
6
7
const watcher = new BaseActionWatcher(
actionReader,
actionHandler,
pollInterval,
)

watcher.watch()

或者,

1
2
3
4
5
6
7
8
9
10
const expressWatcher = new ExpressActionWatcher(
actionReader,
actionHandler,
pollInterval,
portNumber,
)

expressWatcher.listen()

// You can then make a POST request to `/start` on your configured endpoint

其他

======================================================================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是eos状态处理程序demux-js