Michael.W谈hyperledger Fabric第13期-Fabric系统结构的详解补充 - Go语言中文社区

Michael.W谈hyperledger Fabric第13期-Fabric系统结构的详解补充


Michael.W谈hyperledger Fabric第13期-Fabric系统结构的详解补充

最近在网上又看了一些资料,对Fabric的系统结构又有了更深一层的了解!在这里我再补充说明一下。
之前我写过一个关于Fabric的系统结构的帖子:
Michael.W谈hyperledger Fabric第2期-关于Fabric你所需要知道的基本知识一
如果没有Fabric相关基础概念的朋友可以去那里看看。

1 系统结构框图

从网上抄一张图,这个图比我上次画的图更详细。上面为应用层,下面为底层。
在这里插入图片描述

2 一些零散的知识点补充

  • 应用层:API,事件,SDK
  • fabric为应用开发者提供了gRPC接口。
  • gRPC:跨语言的RPC框架,相比较于http它简化了许多不必要的步骤。比如:对象的序列化和反序列化。
  • 在API的基础上,Fabric官方给出了针对不同语言的SDK。比如Nodejs、Golang和Java。其中,nodejs是相对最成熟的,java最差。
  • fabric采用异步通信的模式进行开发。我们可在链码中定义事件,然后通过应用程序去监听这些事件。当某个事件被触发的时候,我们就可以执行我们预先定义的回调函数了。
  • 身份,账本,交易和智能合约是连接应用层和底层的桥梁。
  • 成员服务是控制身份验证的准入控制。利用PKI体系CA系统提供注册登录和身份认证的功能。
  • 账本模块可对区块链的查询。有多种查询方式:
    1. 按照区块高度查询。
    2. 按照区块hash(区块头和区块体中交易的信息)查询。可以将区块哈希理解为这个账本中的主键。
    3. 按照交易ID查询对应的区块。由于hash的抗碰撞性,所以所有的交易的hash都是不同的。可以将交易ID作为一个索引与包含这个交易的区块对应起来。
  • 账本查询还可以根据通道的名称获取整个账本的信息。
  • Fabric中账本是根据通道进行隔离(物理隔离和逻辑隔离)的。Fabric中的区块存储是以文件块的形式进行存储的。根据通道名划分不同的文件夹。 在存储状态数据的时候,因为levelDB是没有多个空间进行选择的,所以不同的账本是根据组合KEY的形式进行划分的。
  • 账本是对区块链进行查询的,真正对区块链进行增改的是交易管理模块。上层的应用程序将交易信息提交到交易背书节点,在交易背书后再提交到交易排序节点。然后进行打包分发,这样交易就被扩散到整个网络。
  • 智能合约模块主要是做链码的安装,初始化以及升级等操作。做个类比,智能合约是函数的定义,交易是函数的调用
  • 底层有个共识服务模块:在分布式中有个著名的CAP原理(在一个分布式系统中不能同时满足一致性、可用性和分区容忍性)。
    解释一下分区容忍性:假如说一个分布式网络突然中断了,可能会将整体的网络分割开来,形成一个一个的网络孤岛。当请求发到某个网络孤岛上时,可能因为数据不一致造成请求失败。为了防止这种事情发生,必须尽可能多的将同一份数据发送到尽可能多的节点上(通常意义上讲的备份)。随着备份数据量的增多,数据的写入会消耗更长的时间。这样造成了可用性的下降。
    所以,一致性越高,可用性就越低
    那区块链在这里是如何侧重的?
    由于区块链每个节点都是一个全账本,所以可用性是最高的,是弱化了一致性。这也是区块链技术中总是在谈论共识算法,就是想利用其它算法来保证被削弱的一致性问题。
  • Fabric 的共识与传统区块链还是有很大不同。将共识的达成分成以下步骤:
    1. 客户端向背书节点发起交易提案。
    2. 背书节点经过模拟交易后返回给客户端模拟交易结果和数字签名。
    3. 然后客户端将这些模拟交易发送给排序节点。
    4. 最后又排序节点将数据打包成区块分散到这个网络中。
    5. 记账节点收到网络中的广播后要验证交易的正确性,如果通过验证写入账本。
  • 达成共识中应用到的协议:
    1. order节点与组织的锚节点之间使用的是gRPC进行通讯。
    2. 组织内部中使用的是gossip协议进行区块的扩散。
  • gossip协议是一个追踪一致性的网络协议。简单地说,它能在某一时间点在所有的节点之间达成数据的一致
  • 链码服务模块提供了一个安全且隔离的一个交易执行环境。用于确保用户数据的隔离。
  • Fabric的链码服务模块使用的是docker技术。这样就支持了多种语言对智能合约的编写。但从现阶段的情况看,这种解决方案并不是很好:
    1. docker自身的问题。因为每个链码都是一个独立的容器,这就意味着要为每个链码提供一个完整的系统环境。这样就造成了打包后的镜像文件体积很大的问题。
    2. 现阶段链码文件的编译都是直接与docker进行通信的,在和容器编排工具,比如说k8s,集成的时候就显得格格不入。因为Fabric生成的这些链码容器无法被k8s所管理,在企业内部进行区块链管理时扩展性就不是那么好。我相信官方肯定会注意到这个问题,在今后的版本中有所修改。
  • 在Fabric的代码中专门定义了一个名为bccsp的包,主要定义了一些公私钥签名以及加密和解密的基础功能。它默认实现了一套国际通用的密码服务,如:sha256和椭圆曲线算法。但这一套直接应用到国内是肯定不行的 。国内的商业项目如果要获得国家的认可,就必须使用国密。现在一些公司已经在做这样的扩展。

ps:
本人热爱图灵,热爱中本聪,热爱V神,热爱一切被梨花照过的姑娘。
以下是我个人的公众号,如果有技术问题可以关注我的公众号来跟我交流。
同时我也会在这个公众号上每周更新我的原创文章,喜欢的小伙伴或者老伙计可以支持一下!
如果需要转发,麻烦注明作者。十分感谢!
后现代泼痞浪漫主义奠基人
公众号名称:后现代泼痞浪漫主义奠基人

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/michael_wgy_/article/details/88583417
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢