藏川线前段

--- 摄于 2017 年 9 月 藏川线前段

CITA系列之交易验证 —— Auth

上周,我去泰国浪去了,而且周二也更新了一篇,虽然不是 CITA 系列,但是也不算跳票(emmm,就这样安慰自己)。然后恭喜自己的个人项目 cita-cli 被公司 fork 到了官方库,作为官方对外提供的 cli 工具使用,后面的开发会迁移到公司项目下,自己的库只做同步,issue 和 pr 也在官方仓库接受,地址在这里:https://github.com/cryptape/cita-cli

Auth

Auth 的任务非常单一:

重构 auth 的原因是,之前的版本,存在滥用并发导致的并发问题,会漏掉一些本应该挡住的错误交易。

代码分享

交易池:https://github.com/cryptape/cita-common/tree/develop/tx_pool

让交易保证顺序出入交易池,加上序列化(txwal.rs),确保交易入池后不会出现意外丢失

MQ 消息处理:https://github.com/cryptape/cita/blob/develop/cita-auth/src/handler.rs#L577

rayon 并行验证:

let results: Vec<(
    H256,
    Option<Vec<u8>>,
)> = requests_no_cached
    .into_par_iter()
    .map(|(tx_hash, ref req)| {
        let result = verify_tx_sig(req);
        match result {
            Ok(pubkey) => (tx_hash, Some(pubkey)),
            Err(_) => (tx_hash, None),
        }
    })
    .collect();

重点是交易出入交易池必须是线性处理的,而验证 bft 发来的 blockbody 交易块,可以开启 rayon 的线程池验证。

总结

这系列的模块,基本上是以从难到易,从外到内的方式讲解的,其实易于理解也是相对而言,本身每个模块内部还有很多细节需要研究,但是这个系列嘛,本身并不过多纠结于某处细节,讲的是整体思路,所以显得越后面篇幅越短,其实真的不短,只是确实在之前的基础之上,思路讲清就没啥可以说的了。

下一篇尝试讲解一下同步机制。

评论区

加载更多

登录后评论