区块链教程Fabric1.0源代码分析Orderer Ledger-兄弟连区块链

简介:

Fabric 1.0源代码笔记 之 Orderer #ledger(Orderer Ledger)

1、Orderer Ledger概述

Orderer Ledger代码分布在orderer/ledger目录下,目录结构如下:

  • orderer/ledger目录:
        * ledger.go,Factory、Iterator、Reader、Writer、ReadWriter等接口定义。

    * util.go,Orderer Ledger工具函数,及NotFoundErrorIterator结构体定义。
    * file目录,file类型ledger实现。
    * json目录,json类型ledger实现。
    * ram目录,内存类型ledger实现。
    

2、接口定义

Factory接口定义:

type Factory interface {
    //按chainID获取已存在的ledger,如不存在则创建
    GetOrCreate(chainID string) (ReadWriter, error)
    //获取ChainID列表
    ChainIDs() []string
    //关闭并释放所有资源
    Close()
}
//代码在orderer/ledger/ledger.go

ReadWriter接口定义:

type Reader interface {
    //按起始块号获取迭代器
    Iterator(startType *ab.SeekPosition) (Iterator, uint64)
    //获取ledger高度(即块数)
    Height() uint64
}

type Writer interface {
    //ledger向追加新块
    Append(block *cb.Block) error
}

type ReadWriter interface {
    Reader //嵌入Reader
    Writer //嵌入Writer
}

type Iterator interface {
    //获取下一个可用的块
    Next() (*cb.Block, cb.Status)
    //获取可用的通道
    ReadyChan() <-chan struct{}
}
//代码在orderer/ledger/ledger.go

3、file类型ledger实现

3.1、fileLedgerFactory结构体及方法(实现Factory接口)

type fileLedgerFactory struct {
    blkstorageProvider blkstorage.BlockStoreProvider //blkstorage
    ledgers            map[string]ledger.ReadWriter //多链
    mutex              sync.Mutex
}

//从ledgers中查找,如找到则返回,否则创建Ledger(即blkstorage)并构造fileLedger
func (flf *fileLedgerFactory) GetOrCreate(chainID string) (ledger.ReadWriter, error)
//获取已存在的Ledger列表,调取flf.blkstorageProvider.List()
func (flf *fileLedgerFactory) ChainIDs() []string
//关闭并释放资源flf.blkstorageProvider.Close()
func (flf *fileLedgerFactory) Close()
//构造fileLedgerFactory
func New(directory string) ledger.Factory
//代码在orderer/ledger/file/factory.go

blkstorage更详细内容,可参考:Fabric 1.0源代码笔记 之 Ledger #blkstorage(block文件存储)

3.2、fileLedger结构体及方法(实现ReadWriter接口)

type fileLedger struct {
    blockStore blkstorage.BlockStore //blkstorage
    signal     chan struct{}
}

//按起始块号获取迭代器
func (fl *fileLedger) Iterator(startPosition *ab.SeekPosition) (ledger.Iterator, uint64)
//获取ledger高度(即块数)
func (fl *fileLedger) Height() uint64
//ledger向追加新块
func (fl *fileLedger) Append(block *cb.Block) error
//代码在orderer/ledger/file/impl.go

3.3、fileLedgerIterator结构体及方法(实现Iterator接口)

type fileLedgerIterator struct {
    ledger      *fileLedger
    blockNumber uint64 //当前已迭代的块号
}
//获取下一个可用的块,如果没有可用的块则阻止
func (i *fileLedgerIterator) Next() (*cb.Block, cb.Status)
//获取可用的通道,如果块不可用返回signal,否则返回closedChan
func (i *fileLedgerIterator) ReadyChan() <-chan struct{}
//代码在orderer/ledger/file/impl.go

4、Orderer Ledger工具函数

//创建块
func CreateNextBlock(rl Reader, messages []*cb.Envelope) *cb.Block
func GetBlock(rl Reader, index uint64) *cb.Block
//地址在orderer/ledger/util.go

func CreateNextBlock(rl Reader, messages []cb.Envelope) cb.Block代码如下:

func CreateNextBlock(rl Reader, messages []*cb.Envelope) *cb.Block {
    var nextBlockNumber uint64
    var previousBlockHash []byte

    if rl.Height() > 0 {
        it, _ := rl.Iterator(&ab.SeekPosition{
            Type: &ab.SeekPosition_Newest{
                &ab.SeekNewest{},
            },
        })
        <-it.ReadyChan()
        block, status := it.Next() //获取前一个最新的块
        nextBlockNumber = block.Header.Number + 1
        previousBlockHash = block.Header.Hash() //前一个最新的块的哈希
    }

    data := &cb.BlockData{
        Data: make([][]byte, len(messages)),
    }

    var err error
    for i, msg := range messages {
        data.Data[i], err = proto.Marshal(msg) //逐一填充数据
    }

    block := cb.NewBlock(nextBlockNumber, previousBlockHash)
    block.Header.DataHash = data.Hash()
    block.Data = data

    return block
}
//地址在orderer/ledger/util.go

感谢关注兄弟连区块链教程分享!

相关文章
|
7月前
|
存储 供应链 监控
区块链技术在供应链管理中的应用与前景分析
随着信息化时代的到来,供应链管理面临着越来越多的挑战和机遇。本文主要探讨了区块链技术在供应链管理中的应用,以及未来的发展前景。通过对区块链技术的特点和优势进行分析,结合实际案例和趋势展望,展示了区块链技术在提升供应链透明度、效率和安全性方面的潜力,以及未来发展的可能方向。
|
7月前
|
安全 区块链
区块链积分商城系统开发详细指南//需求功能/指南教程/源码流程
Developing a blockchain points mall system involves multiple aspects such as blockchain technology, smart contracts, front-end development, and business logic design. The following is the general process for developing a blockchain points mall system
|
7月前
|
存储 算法 API
面向企业的区块链教程(一)(2)
面向企业的区块链教程(一)
116 6
|
4月前
|
安全 区块链
Massa Layer 1区块链 POS 安全性分析
Massa Labs 回应 Certik 的挑战,通过严格的数学分析证明了其权益证明系统的安全性,抵抗了潜在攻击者试图操纵随机抽签的企图。
64 0
Massa Layer 1区块链 POS 安全性分析
|
7月前
|
存储 供应链 安全
基于区块链技术的智能合约安全性分析
【5月更文挑战第31天】本文深入探讨了区块链技术中智能合约的安全性问题,通过分析现有智能合约的安全漏洞和攻击手段,提出了一系列增强智能合约安全性的策略。文章首先介绍了区块链和智能合约的基本概念,随后详细讨论了智能合约面临的安全挑战,包括代码漏洞、重入攻击等问题,并对比分析了不同平台下智能合约的安全性差异。最后,文章提出了一系列提高智能合约安全性的建议,旨在为区块链应用的健康发展提供参考。
|
6月前
|
存储 安全 区块链
元宇宙与区块链技术的关系可以从多个角度进行阐述。以下是对这两者之间关系的详细分析
**元宇宙:虚拟世界融合现实元素,强调交互与沉浸;区块链:去中心化、安全的分布式账本。两者结合,区块链确保元宇宙中虚拟资产安全、支付高效、身份验证私密、治理透明,支撑其经济体系与用户信任,驱动未来发展。**
|
7月前
|
存储 算法 安全
区块链系统开发技术规则分析
区块链核心技术包括:1) 哈希算法,利用单向函数将任意数据转化为固定长度代码,确保安全验证;2) 非对称加密,使用公钥和私钥一对进行加密解密,保证信息安全;3) 共识机制,如PoW、PoS、DPoS等,实现快速交易验证和确认;4) 智能合约,自动执行的可信代码,一旦编写即不可更改,用于自动化交易;5) 分布式存储,将数据分散存储在网络各处,涵盖结构化、非结构化和半结构化数据。
|
6月前
|
区块链
近期区块链市场趋势分析
**区块链市场趋势摘要:** - 跨链技术成熟,提升互操作性,助力区块链网络融合。 - DeFi持续繁荣,智能合约与AMM创新活跃,市场竞争驱动市场壮大。 - NFT市场多样化,拓展至游戏、音乐等领域,实用性增强。 - 区块链寻求绿色转型,通过PoS共识与绿色能源减少能耗。 - 技术模块化、可组合性提升,降低成本,增强系统灵活性。 这些趋势展现区块链潜力,带来机遇与挑战,促进行业创新。
|
7月前
|
供应链 区块链 数据安全/隐私保护
探索区块链技术在金融领域的应用与前景分析
本文将深入探讨区块链技术在金融领域的具体应用场景,分析其优势与挑战,并展望未来发展趋势。通过案例分析和技术解析,揭示区块链技术在金融行业中的革新意义及前景。
1514 15
|
7月前
|
安全 区块链
区块链游戏系统开发步骤需求丨功能逻辑丨规则玩法丨指南教程丨源码详细
Developing blockchain game systems has been a highly anticipated field in recent years. By combining blockchain technology and game mechanics, players can enjoy a brand new gaming experience and higher game credibility.