干货!如何用Node.js实现一个精巧的P2P网络

本文深入解析如何使用Node.js实现一个P2P网络,结合Ebookcoin项目的源码,介绍了路由扩展、节点路由和节点保存等关键点。文章通过源码分析,展示了P2P网络的初始化、节点读写和更新过程,揭示了其在网络通信和自我更新方面的设计思想。

加密货币都是去中心化的应用,去中心化的基础就是P2P网络,其作用和地位不言而喻,无可替代。当然,对于一个不开源的所谓私链(私有区块链),是否必要,尚无定论。

事实上,P2P网络不是什么新技术。但是,使用Node.js开发的P2P网络,确实值得围观。这一篇,我们就来看看Ebookcoin的点对点网络是如何实现的。

源码

主要源码地址:

peer.js: https://github.com/Ebookcoin/ebookcoin/blob/v0.1.3/modules/peer.js

transport.js: https://github.com/Ebookcoin/ebookcoin/blob/v0.1.3/modules/transport.js

router.js: https://github.com/Ebookcoin/ebookcoin/blob/v0.1.3/helpers/router.js

类图

peer-class.png

流程图

peer-activity.png

解读

基于http的web应用,抓住路由的定义、设计与实现,是快速弄清业务逻辑的简单方法。目前,分析的是modules文件夹下的各个模块文件,这些模块基本都是独立的Express微应用,在开发和设计上相互独立,各不冲突,逻辑清晰,这为学习分析,提供了便利。

1.路由扩展

任何应用,只要提供Web访问能力或第三方访问的Api,都需要提供从地址到逻辑的请求分发功能,这就是路由。Ebookcoin是基于http协议的Express应用,Express底层基于Node.js的connect模块,因此其路由设计简单而灵活。

前面,在入门部分,已经讲到对路由的分拆调用,这里是其简单实现。先看看helper/router.js吧。

// 27行
var Router = function () {
    var router = require('express').Router();

    router.use(function (req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        next();
    });

    router.map = map;

    return router;
}
...

这段代码定义了一个Express路由器Router,并扩展了两个功能:

  • 允许任何客户端调用。其实,就是设置了跨域请求,选项Access-Control-Allow-Origin设置为*,自然任何IP和端口的节点都可以访问和被访问。
  • 添加了地址映射方法。该方法的主要内容如下:
// 3行
function map(root, config) {
    var router = this;
    Object.keys(config).forEach(function (params) {
        var route = params.split(" ");
        if (route.length != 2 || ["post", "get", "put"].indexOf(route[0]) == -1) {
            throw Error("wrong map config");
        }
        router[route[0]](route[1], function (req, res, next) {
            root[config[params]]({"body": route[0] == "get" ? req.query : req.body}, function (err, response) {
                if (err) {
                    res.json({"success": false, "error": err});
                } else {
                    return res.json(extend({}, {"success": true}, response));
                }
            });
        });
    });
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值