最近Fcoin停机维护事情闹的沸沸扬扬,本人作为一个老韭菜,想从技术角度谈谈本次事件。
原因相信大家已经已经明白了,销毁团队7亿FT导致的程序员怒删数据/模块。既然如此,分析出该程序员删了什么模块,对系统有什么重大影响。
一、数字货币交易所的基本架构
我不太清楚Fcoin的交易所架构是怎么样,但是根据我目前做的交易所架构来推理,所有交易所的架构应该都大同小异:
主要有撮合引擎和外部模块构成,外部模块包括提现,充值,消息,日志,用户登陆等。
废话少说,上图
用户通过CA入口获取token,带着token在整个交易所进行交易和其他操作。Fmex和Fcoin应该是两套引擎,因为之前Fmex用的是全内存模型,Fcoin不是。Close engine属于平仓引擎,可能是独立模块也可能不是,对此次事件影响不大。
二、到底哪里出了问题?
首先,撮合引擎没有问题,因为在停机一段时间内,API还能正常收到心跳,而且价格还能正确显示
其次,Messaging模块没有问题,因为用户能收到邮件提醒(爆仓提醒/风险提醒),撮合引擎里的数据也是正常的。
根据我本人收到的爆仓提醒来看,爆仓提醒里有我的用户信息,说明交易引擎里有我本人的信息和仓位情况。数据一切正常
接下来就是CA模块,这是最有可能出问题的地方,结合官方的公告,需要提供绑定的邮箱和用户名来看,用户登陆的邮箱和用户名并未丢失,所以官方才可能通过这个来验证。但是问题来了,官方验证后会发送一个验证码来。用户回复这个验证码过后才会收到打币。说明官方这里手动做了一个2-step Auth。那么如果我的分析没有错的话,销毁的模块之一就是谷歌验证模块,而且配置谷歌验证的私钥一定在消失的那个程序员手里!
其次,一开始让我很想不通的是,为什么邮件里要写明自己的资产有多少,难道仅仅是为了确定你就是你吗?
但是看到后来官方说的大量的交叉验证和人工核对,又谈到数据也有丢失,那么我做了一个大胆的推测:
宕机当天的用户余额表(快照)被删除,且不可恢复,备份的可能是n天前的余额表(快照)
理由如下:
1:为什么要人工核对,因为根本不知道宕机当天有哪些用户做了哪些操作;
一次简单的从理财账户转入wallet的操作如下
financial balance = financial balance - amount1
wallet balance = wallet balance + amount1
一次简单的从wallet转入交易账户的操作如下
wallet balance = wallet balance - amount2
engine.update(id, amount2)
由于宕机当天数据表被清除,理论上说,当天谁转了多少钱到引擎进行交易,根本毫不知道,唯一的方法只能从engine反推!
2: 官方居然很神奇的要求了提交提币总量,并没有要求在邮件提币中区分是理财还是钱包还是杠杆
这说明官方只会校验你名下资产的总额,资产总额 = FmexEngine + wallet + financial + TradingEngine - loan
在这个公式中,wallet和financial的数据不是实时的,例如是n天前的,我们就用wallet(-n)表示,因为当天的数据已经销毁了。所以公式变成了
资产总额 = FmexEngine + wallet(-n) + financial(-n) + TrandingEngine -loan + delta(TradingEngine,n) + delta(FmexEngine,n)
换言之,官方要找出从n天前开始到2.10截止,你向交易引擎和Fmex引擎一共转账了多少。
说实话,交易引擎一天的数据是海量的(百万级别),相当费时费力。
补充一点,Fcoin有个交易挖矿机制,这让FcoinEngine的日志和记录几何倍增长。
三、结论
被删除的模块有谷歌验证和当天或者最近几天的资产记录快照。恢复需要一定时间,但是通过人工验证的方式比对完全可以恢复。跑路可能性有,但是极低。模块修复完全可能,而且并不难(当然,有朋友会跟我说界面也被删了,这个我推断不出来,但是这个不涉及核心,就是需要时间而已)。修复完成后用户还是要补一次2step-auth。中间会不会存在风险,不好说。需要团队评估。
希望各位交易所的小伙伴也可以和我交流
交流Wechat: hanjun_nan