加密货币都是去中心化的应用,去中心化的基础就是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
类图

流程图

解读
基于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));
}
});
});
});
}

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

446

被折叠的 条评论
为什么被折叠?



