This project was generated with Angular CLI version 10.0.5. 用rxjs6实现区块链:
Run npm i
to install dependencies;
Run npm start
for a dev server. Navigate to http://localhost:4200/
. The app will automatically reload if you change any of the source files.
第一题:实现一个多任务调度器 01.1 定义任务的规范 与实现方式
现有两类任务,一种是预热任务,一种是执行任务。执行任务往往依赖于预热任务。 请定义一种规范,可以让其它开发者基于这种规范编写以上两种任务,最终可以在后续开发的“多任务调度器”中执行。 需求
- 任务都有自己的进度
- 任务可以中途结束执行,也可以中途启动参与执行
- 任务可以互相唤醒 1.2 编写可测试用例 以区块链同步为例,现在有四个任务:预下载区块头、验证重放区块头、预下载区块事件、验证重放区块事件。 请基于 1.1 定义的规范,分别实现以上四种任务。 需求
- 区块头与区块链事件都有指定高度
- 区块链事件并不是每一个高度都存在
- 区块链的重放逻辑是:先重放区块链事件,再重放区块头
- 重放区块链事件需要区块头数据
- 一个高度的区块中会有多个区块链事件
- 每一个任务都能以高度为单位进行数据保存 1.3 实现基础版的多任务调度器
- 启动区块链同步,预先准备好四个任务,并行调度执行。最终以验证重放最后一个区块头结束整个任务调度。
- 请基于 1.2 编写的测试用例,在尽可能少地使用内存的情况下,尽可能快地完成“一万高度”区块链同步 需求
- 不用考虑任务互相唤醒的情况
- 需要考虑任务中断的情况
- 有一个任务中断了(抛出异常),就中断整个调度器
- 调度器可以重启,并从各个任务的保存进度上恢复同步任务的调度 1.4 实现标准版的区块链同步 以现实中比较常见的区块链网络为例,完成标准版的测试用例。并基于此改进配套的多任务调度器 需求
- 网络可能中断
- 可能只是基站切换、WiFi 与蜂窝网络切换造成的小波动
- 可能是进入无网络的地区,网络长时间不响应
- 网络请求可能超时
- 在整个同步的过程中,区块链的高度也会持续地增加
- 组网区块可能以不正常的方式提供了来自未来的区块,对于未来的区块,我们不去同步
- 如果你在同步中,那么区块链的状态是“同步中”,否则是“空闲”状态 1.5 实现高级版的同步区块链的实现 考虑更多的异常情况,对它们做出合理的行为 需求
- 考虑区块链可能分叉回滚
- 虽然在区块链网络中,这个不是瞬发的过程,但区块链网络层对此做了封装,在确定> 的情况下,它会突然告知你要进行执行回滚
- 回滚的过程中,还有有可能再度发生回滚……
- 本地数据的存储可能发生异常
- 磁盘空间不足
- 读取权限被限制
- 数据被外部篡改而发生混乱,被区块链数据库自己的修复逻辑给回滚到某一个高度