Meta Consensus -- CnF.go开发日志

【 2021/8/30】

完成网络发现模块的UDP Resume,组网模块的UDP发现已经完成。

【 2021/9/1】

完成组网模块的TCP Resume,网络已经可以自动组建

【2021/9/3】

处理TCP UDP粘包问题。用\n分割数据包,包头标记长度,内存缓存断包。

【2021/9/5】

完成广播,可缓存可转发。广播缓存有半分钟,如果一个广播半分钟内不能完成全网转达,就会出现风暴问题。生产环境网络需要把这个时间调整到更高。

【2021/9/9】

接入levelDB,实现数据层

【2021/9/10】

创建基础共识层模块,测试了数据包的转发,供上层使用

【2021/9/15】

完成基础共识(PBFT+读写API)

【2021/9/22】

完成新结点入网同步

【2021/9/23】

独立抽取出privateChat协议数据域,新增一条点对点通讯的单通道。

【2021/9/24】

创建业务共识包模块,完成签名与认证


共识起来了

【2021/9/26】

实现CVM的接入,用的otto开源库实现的v8 javascript虚拟机(js大恶人)做底层解析器。但这个版本只能兼容ES5,而且%求模运算都没有实现,所以我在CVM用MC_Mod函数实现了求模。

【2021/9/28】

实现CnF的RPC接口,实现了sdk。sdk主要是矿工功能,用于出块和提供提交交易、查询区块、调用共识脚本的接口

【2021/9/29】

可以在localhost:sdkport/static上提交新交易了,顺便整理了各个协议字段之间的调用关系


协议消息关系

【2021/10/5】

可以在网页上调用共识脚本了

【2021/10/6】

把基础共识提交、基础区块查询、业务区块查询、共识脚本调用几个页面iframe到一个页面里。缝合怪


缝合页面

噢,今天装了些新柜子,秀一下桌面吧


工作桌

【2021/10/9】

修复了个业务区块BUG,到达第10个区块就出现乱序问题。后来查底层发现,原来levelDB的排序并不是简单int顺序排序,而是比较暴力的按位排序,于是我把基础区块的编号做成16位16进制,基础区块的第一块在levelDB里面存储名为:bcag-base-block-0000000000000001。空间这么多,应该够用到地球爆炸了吧(千年虫警告)


这么多个区块

【2021/10/11】

流程跑通!


git commit

【2021/10/27】

调整代码结构。把tcp层面的消息封装成go结构模块,年少无知,老javascripter才学会go不到一年,没想到用起来这么方便。

【2021/11/4】

田老板说我这调整架构太暴力了,那么多人在研究evm,这个系统相当于否定了evm,得得罪多少人。确实,CnF.go本质上和智能合约也不冲突,只是多加了一层,远远没达到推翻规则的程度,咱就是说做人不能太狂。所以我今天把evm也加进来了,Respect。
我把geth的1.9.25版本的evm独立抽取了出来,放了在SteveWooo/LonelyEVM项目上。


evm调用测试器,界面老丑了

浏览器-sdk-cnf core-业务共识调用-cvm-载入solidity编译码-evm调用。

【2021/11/12】

新增了一些evm函数,调试了多次cvm

【2021/11/15】

游戏也可以跑起来了
做了个游戏,攻占区域的游戏。出块结点为上一次参与到游戏中的结点。比较扯,勉强凑个应用出来吧算是


小游戏,区块链SLG

【2021/11/18】

加上打点功能,采集底层数据

【2021/11/24】

对基础区块和基础交易进行分离。在这之前一个交易占用一个区块,估计当时脑子有坑才会这么偷懒。现在一个区块对多个交易,开始压测。

【2021/11/28】

删除配置文件读写的方式,改用命令行启动。把密钥泄露到系统命令行中,高危操作,但为了批量生成结点压力测试,先这么干吧。乖,答应自己,上线后要用文件放密钥

【2021/11/30】

把开发环境迁移到macbook上,然后放到树莓派上跑了次压力测试。就还行吧,250多的TPS,再高就卡硬盘IO了,树莓派加油啊
听说有人用Fabric改PBFT也在树莓派单点跑250左右,没有去测,实在没劲去跑Fabric了。Fabric背完书就把区块扔进kafak或者拿PBFT或者Raft排序打包,Fabric还有个背书逻辑,用来给业务方写规则去拒绝交易(其实跟扔进evm,跑业务逻辑和算gas差不多)。但CnF.go底层只是给业务方开放更新共识脚本一个功能,其他目前都不太需要开放,没啥需要验证的,跟Fabric还是有很大的区别,但Fabric嘛又不是专门做共识虚拟化这玩意的,要拿他实现个CVM害得从头开始,所以还不如继续做CnF.go,毕竟是从0做起的亲儿子。
CnF.go改进了下PBFT,同时做了PBFT算法进行对标,那必须在多结点场景下稳赢PBFT,就卡网络IO和CPU性能了,咱就是说树莓派加油啊。(咱拜占庭场景每次都要选主,人家raft一个owner当那么久,tps肯定比我好,俺咋跟人家比)

垃圾佬:树莓派4B+ 8G版本, tplink千兆交换机,小米3A路由

【2021/12/9】

开坑,用CnF做个众测平台玩玩

【2021/12/10】

完成前端开发,联调前端对共识脚本的交互(浏览器-业务服务端-cnf sdk-cnf core-业务调用广播-cvm-levelDB-业务矿工-业务打包广播-levelDB。k,好顺利)
打通前端和ipfs的接入,IPFS有很大的监管问题,任意文件都可上传,包括静态页面。以后业务方可不能直接开放ipfs api给公网,不然黑页随便挂,公安找上家。(流转发+过滤即可)

【2021/12/13】

身份申请模块完成咯,咱都是个有身份的人了

【2021/12/15】

众测平台全流程跑通:
身份申请(测试员、企业、专家)、企业发布任务、测试员申请任务、企业授权测试员、测试员提交任务报告、专家评价报告


任务界面

(今天整了缸多肉,给大伙瞧瞧)


肉肉

【2021/12/24】

半夜一点突然有个想法,赶紧起床算算。


半夜算的结论就是不靠谱,没一个对的,广东话说就是大声夹无准

【2021/12/26】

从小到大最爱我的奶奶一路走好。
93岁高寿了,我才26岁,奶奶当年也是新时代女性呢。

【 2021/12/27】

PoBR算法构思

前天晚上1点多想到一个新的共识机制,扛着广州冬天大半夜的魔法攻击也起床验证了一晚上。好笑,根本没算对
算法通过意向参选+业务属性排行的2阶段提交实现唯一选主,意向参选确保参与共识的结点活跃,不准摸鱼;业务属性排行一方面确保业务参数能够融入共识机制之中,另一方面确保分区容错性,同时还能拿有限的业务属性消耗实现拜占庭容错。排行如果出现并列情况,则通过上一区块Hash作为种子,利用伪随机算法挑选唯一Master,天选之子。
算法的时间复杂度为O(n^2),与PBFT一致(如果把preprepare阶段当提交的话)。目前已经实现到Testin项目中,但性能比较糟糕,主要是因为业务区块的读写还没做缓存,每次都要辛苦levelDB遍历一次,硬盘您可太累了。
不过目前对于选主成功后,关闭结点不打包的情况,还没做相应的处理。理应让矿工做一个出块超时限制,对选主成功却不打包的结点进行黑名单处理,这样可以防止恶意结点重复卡块。拜占庭嘛,坏将军啊坏将军。

【2021/12/30】

业务性能太差了,1tps就压满了。为解决这个问题,优化了业务矿工的WorldStatus构建,没啥作用,然后我在业务共识脚本里面优化了状态构建,对世界状态进行了缓存就好一些了,有10tps,砸盘子。

【 2022/1/2】

业务共识缓存优化

自从上次对基础共识机制进行优化,即对GetTopBlock进行缓存后,底层基础共识的性能暴增,所以我这次对业务共识模块的读写也进行了缓存优化,优化后性能果然提高了3倍(虽然只有可怜的30tps),慢死了。
这次测试使用的谁15款macbookpro,8g内存,I5 2.9 GHz,都2022了,我还换不起电脑。5个CnF结点+5个业务矿工结点,暴力测试提交的交易为测试员重复提交报告到一个任务种,当前TPS峰值已经可以扛到30。
下回拿5台树莓派集群测一下。


前面是优化前的TPS,后面是优化后。正好没清数据,刚好可以放到一张图上来了

就这么地吧,得赶紧写篇paper了。博士毕业要紧(害没考核就想这么远?)

你可能感兴趣的:(Meta Consensus -- CnF.go开发日志)