EOS 之demux源码解析

EOS 之demux源码解析

Demux从Facebook的Flux Architecture架构模式和Redux(JavaScript程序的状态容器,即应用数据流框架)中汲取灵感,创建了一个后端基础架构模式。Demux赋予区块链事件溯源技术,可以准确地更新EOSIO上应用程序的可查询数据库。
Demux的一大优势是允许区块链事件自动地(并且可验证地)更新到Mongo或Postgres SQL数据库,这意味着存储在其中的数据仍然可以通过区块链进行验证。并且兼具传统数据库的灵活性和速度,及区块链的信任和不可变属性,达到了两全其美的效果。
这里写图片描述

如上图所示:
Action Reader 负责读取bloackchain的数据。
Action watcher 负责调度Action Reader检测新的chain数据。
Action Handler 负责过滤和分发updaters 和effects事件。
目前我们项目是在updaters里面更新数据库数据,effects事件的具体作用还没有研究到。

通过example来解读源码


这里写图片描述

index.js

const {
  readers: { eos: { NodeosActionReader } },
  watchers: { BaseActionWatcher },
} = require("../../dist/")
const ObjectActionHandler = require("./ObjectActionHandler")
const updaters = require("./updaters")
const effects = require("./effects")
// 设置handler分发的updaters和effects
const actionHandler = new ObjectActionHandler(
  updaters,
  effects,
)
// 定义reader获取数据地址,读取位置
const actionReader = new NodeosActionReader(
  "http://mainnet.eoscalgary.io", // Thanks EOS Calgary!
  0, // Start at most recent blocks
  true, // 设置是否获取不可逆的数据
)
// 将reader和handler设置到watcher
const actionWatcher = new BaseActionWatcher(
  actionReader,
  actionHandler,
  500,
)
// 开始轮询监控chain数据
actionWatcher.watch()

example里面的代码就不贴了,有兴趣可以自己看看源码。

BaseActionWatcher

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
   
    return new (P || (P = Promise))(function (resolve, reject) {
   
        function fulfilled(value) {
    try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) {
    try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) {
    result.done ? resolve(result.value) : new P(function (resolve) {
    resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
/**
 * Cooredinates implementations of `AbstractActionReader`s and `AbstractActionHandler`s in
 * a polling loop.
 */
class BaseActionWatcher {
    constructor(actionReader, actionHandler, pollInterval) {
        this.actionReader = actionReader;
        this.actionHandler = actionHandler;
        this.pollInterval = pollInterval;
    }
    /**
     * Starts a polling loop running in replay mode.
     */
    replay() {
        return __awaiter(this, void 0, void 0, function* () {
   
            yield this.actionReader.seekToBlock(this.actionReader.startAtBlock);
            yield this.watch();
        });
    }
    /**
     * Uses the given actionReader and actionHandler to poll and process new blocks.
     */
    watch() {
        return __awaiter(this, void 0, 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值