比特股交易所bitshares-ui简析

比特股交易所,一个开源的去中心化的交易所,听起来就给人感觉很有前景,这几天我查看了bitshares-ui里面的部分代码,有一些收获。在GitHub上面下载下来这个项目,然后安装到自己的本地或者安装到虚拟机上面,安装方法可以参考编译比特股网页钱包这篇文章,安装之后,项目就会自动的把一些依赖和中间件下载下来安装好,这样就方便自己阅读代码。

1、整体概览

bitshares-ui这个项目是用react.js框架完成的前端页面编写,如果你对react一点也不知道也不必慌张,只要去了解下react.js 的基础就可以了,毕竟只是看其中的一些代码。采用了webpack来打包所有的模块,所以你也得知道一些关于webpack的知识。还有一些plugin、loader等等组建。

2、简析项目目录结构

截图

主要的组成部分,在app目录里面我们可以看到,里面基本都是一些jsx、js代码,所以里面都是一些项目的逻辑组成部分,在resources目录里面,主要是生成桌面应用的一些代码。然后server.js是入口文件,在npm start 之后就会启动这个代码。启动之后,访问localhost:8080端口就可以看到网页。

app.use("*", function(req, res, next) {
    var filename = path.join(compiler.outputPath, "index.html");
    compiler.outputFileSystem.readFile(filename, function(err, result) {
        if (err) {
            return next(err);
        }
        res.set("content-type", "text/html");
        res.send(result);
        res.end();
    });
});

在server.js 的代码中,我们可以看出,访问网站的时候,会被网站带到app/assets/index.html的目录下面,但是在这个下面没有这个文件,通过插件从相同目录下index.hbs 模版生成的index.html,然后由react.js 生成的组件去丰富这个网页,以及一些路由去解析一些请求路径。

3、前端页面简析

通过前面的分析,我们可以很快的看出,主要的逻辑以及页面就在app这个目录下面,所以我们就直接指向这个目录,在webpack.config.js中我们发现入口文件是Main.js,跟着Main.js 就找到了AppInit.jsx 这个文件,AppInit.jsx中导入了app.jsx,在app.jsx中会看到很多的路由以及组件,基本都来自于component这个文件夹里面。一开始,我一直不明白Translate是什么,在npm官网上面看到了它的解释,React的一个组件,它利用Counterpart模块Interpolate组件来提供多语言/本地化的文本内容。它允许切换区域设置而无需重新加载页面。说白了就是一个改变语言还不需要从新加载的一个组件。

接下来,在app.jsx中找一个组件,跟着这个组件去了解项目组成,在这个项目中有许多的中间件,第一次接触可能还是有点措手不及,中间件的功能应该去看看。由于页面比较多,我们选择Explorer这个组件来看看,那么就从app.jsx这个文件跳转到了./components/Explorer/Explorer这个文件里面,看起来还是很简洁,这都是得益于react模块化的好处。在这个文件里面,主要就是一些关于localhost:8080/explorer(如果你安装了这个项目)的一些页面


png

./components/Explorer/Explorer这个代码对应着这个页面可以看到在"浏览"这个大的板块下面,还有区块链、资产、账户、见证人等等7个子板块。那么在代码里面也可以看到这7个子模块对应的代码

class Explorer extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            tabs: [
                {
                    name: "blocks",
                    link: "/explorer/blocks",
                    translate: "explorer.blocks.title",
                    content: BlocksContainer
                },
                {
                    name: "assets",
                    link: "/explorer/assets",
                    translate: "explorer.assets.title",
                    content: AssetsContainer
                },
                {
                    name: "accounts",
                    link: "/explorer/accounts",
                    translate: "explorer.accounts.title",
                    content: AccountsContainer
                },
                {
                    name: "witnesses",
                    link: "/explorer/witnesses",
                    translate: "explorer.witnesses.title",
                    content: Witnesses
                },
                {
                    name: "committee_members",
                    link: "/explorer/committee-members",
                    translate: "explorer.committee_members.title",
                    content: CommitteeMembers
                },
                {
                    name: "markets",
                    link: "/explorer/markets",
                    translate: "markets.title",
                    content: MarketsContainer
                },
                {
                    name: "fees",
                    link: "/explorer/fees",
                    translate: "fees.title",
                    content: FeesContainer
                }
            ]
        };
    }

对应的“link”链接就对应不同的子模块。具体的代码读者可以自己去项目中查看。查看了前端页面的构成,我们再来分析下后端的代码。

4、API简析

在比特股的项目中,有很多的API,有很大一部分都是基于bitsharesjs这个比特股的node.js 中间件以及它的一些衍生中间件如bitsharesjs-ws。实现创建交易,签名等等这些基本功能。在app目录下面的API目录下,查看applicationapi可以看出,这是一个创建账户、交易、worker的一个集合API,很多js文件都引用了这个js文件。在API目录下面的js文件其实就是对一些特有功能的封装,然后在其他的js文件中被调用。
再看看action目录下面,基本上都是以···action.js结尾的js文件,action顾名思义开始的意思,在accountActions.js中也是集成了一些功能,搜索、添加、移除、更新账户等等功能

accountSearch(start_symbol, limit = 50) {
        let uid = `${start_symbol}_${limit}}`;
        return dispatch => {
            if (!accountSearch[uid]) {
                accountSearch[uid] = true;
                return AccountApi.lookupAccounts(start_symbol, limit).then(
                    result => {
                        accountSearch[uid] = false;
                        dispatch({accounts: result, searchTerm: start_symbol});
                    }
                );
            }
        };
    }
    setCurrentAccount(name) {
        return name;
    }
//部分代码

5、 总结

在比特股开源交易所这个项目,梳理一下大致的结构。打开这个项目,个人习惯首先去看package.json 这个目录,从中可以看到script这个项下面的start,从这里我们可以知道这个项目的开始是从哪里开始的

"start": "cross-env NODE_ENV=development node server.js"

一开始启动server.js,然后这个进程就会去监听8080或者8085(https)端口,在server.js中可以看到不管访问什么地址,都会被导到这里

app.use("*", function(req, res, next) {
    var filename = path.join(compiler.outputPath, "index.html");
    compiler.outputFileSystem.readFile(filename, function(err, result) {
        if (err) {
            return next(err);
        }
        res.set("content-type", "text/html");
        res.send(result);
        res.end();
    });
});

通过这里就可以去找到对应的数据,通过返回的数据构建出页面。整个的目录的结构比较清晰,主要的逻辑以及交互代码都在app这个目录下面,在app 这个目录下面有一个app.jsx 这是整个项目的核心,在这个文件里面导入了许多外部的组件。在app目录下component文件夹也是重点要关注的东西。这个目录包含了许多的.jsx文件,里面都是react的模块用于构建整个前端页面。

在项目中有比较多的中间件,如果都去了解它们的基本功能,那么这会耗费巨大的时间,所以我在看了这个项目之后发现需要去了解bitsharesjs中间件以及它的衍生中间件。
需要熟练的掌握react.js,不然很多的东西都看不明白,就会形成只知其表不知其里的尴尬局面。

个人认为像类似于比特股这样的一个开源的去中心化的交易所才是交易所的未来,区块链给我们带来了去中心化和开源,但是很多的数字货币交易所确是中心化的闭源的,这不符合区块链的精神,很容易成为一些少数人玩的东西。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,732评论 25 707
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,969评论 3 119
  • 雪花独自飞舞了一夜 黑暗中 看不见冰清玉洁 茅屋低矮 鸟儿扑楞楞飞散了 辩论,毫无疑义 霞光点亮双眸 那红红的冰糖...
    曦华阅读 48评论 0 0
  • 敬畏—进入—体验—交给—持续 1,缺啥补啥,怕啥练啥; 2,一切为我所用,所用为团队家; 3,我想变,我要变,我...
    GL_212a阅读 254评论 0 0
  • 后来,我认识无数比你更可爱的女孩 文/迎春花阿班 偶然看到朋友前女友的照片,他前女友曾是我同学。在他们故事里,我们...
    迎春花阿班阅读 935评论 13 12