HyperLeger Fabric SDK开发(七)——ledger

HyperLeger Fabric SDK开发(七)——ledger

一、ledger简介

1、ledger简介

ledger包支持在Fabric网络上的指定通道上启用账本查询。如果应用程序需要对多个通道进行账本查询,需要为每个通道的账本客户端创建一个单独实例。账本客户端支持以下查询:QueryInfo,QueryBlock,QueryBlockByHash,QueryBlockByTxID,QueryTransaction和QueryConfig。
官方文档:
https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/client/ledger

2、ledger使用流程

ledger使用的基本流程如下:
A、准备通道上下文
B、创建分类帐客户端
C、查询分类帐
使用示例:

ctx := mockChannelProvider("mychannel")

c, err := New(ctx)
if err != nil {
    fmt.Println("failed to create client")
}

block, err := c.QueryBlock(1)
if err != nil {
    fmt.Printf("failed to query block: %s\n", err)
}

if block != nil {
    fmt.Println("Retrieved block #1")
}
// output:
// Retrieved block #1      

二、ledger常用接口

1、获取账本客户端实例

type Client struct {
   ctx       context.Channel
   filter    fab.TargetFilter
   ledger    *channel.Ledger
   verifier  channel.ResponseVerifier
   discovery fab.DiscoveryService
}
func New(channelProvider context.ChannelProvider, opts ...ClientOption) (*Client, error) 

New返回账本客户端实例。账本客户端实例提供处理程序以查询指定通道上的各种信息。如果应用程序需要对多个通道进行账本查询,需要为每个通道的账本客户端创建一个单独实例。账本客户端仅支持指定查询。
使用示例:

ctx := mockChannelProvider("mychannel")

c, err := New(ctx)
if err != nil {
    fmt.Println(err)
}

if c != nil {
    fmt.Println("ledger client created")
}
// output:
// ledger client created        

2、查询账本

func (c *Client) QueryBlock(blockNumber uint64, options ...RequestOption) (*common.Block, error)
QueryBlock根据区块编号查询区块的账本。
参数:
blockNumber是必需的区块号
options包含可选的请求选项
返回区块信息
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println("failed to create client")
}

block, err := c.QueryBlock(1)
if err != nil {
    fmt.Printf("failed to query block: %s\n", err)
}

if block != nil {
    fmt.Println("Retrieved block #1")
}
// output:
// Retrieved block #1  

func (c *Client) QueryBlockByHash(blockHash []byte, options ...RequestOption) (*common.Block, error)
QueryBlockByHash根据区块hash查询区块账本。
参数:
blockHash是区块哈希
options包含可选的请求选项
返回区块信息
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println("failed to create client")
}

block, err := c.QueryBlockByHash([]byte("hash"))
if err != nil {
    fmt.Printf("failed to query block by hash: %s\n", err)
}

if block != nil {
    fmt.Println("Retrieved block by hash")
}
// output:
// Retrieved block by hash   

func (c *Client) QueryBlockByTxID(txID fab.TransactionID, options ...RequestOption) (*common.Block, error)
QueryBlockByTxID查询包含交易的区块
参数:
txID是交易ID
options包含可选的请求选项
返回区块信息
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println("failed to create client")
}

block, err := c.QueryBlockByTxID("123")
if err != nil {
    fmt.Printf("failed to query block by transaction ID: %s\n", err)
}

if block != nil {
    fmt.Println("Retrieved block by transaction ID")
}
// output:
// Retrieved block by transaction ID   

3、查询通道配置

func (c *Client) QueryConfig(options ...RequestOption) (fab.ChannelCfg, error)
QueryConfig查询通道配置。
参数:
options包含可选的请求选项
返回通道配置信息
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println("failed to create client")
}

cfg, err := c.QueryConfig(WithTargets(mockPeerWithConfigBlock()))
if err != nil {
    fmt.Printf("failed to query config: %s\n", err)
}

if cfg != nil {
    fmt.Println("Retrieved channel configuration")
}
// output:
// Retrieved channel configuration   

4、查询通道信息

func (c *Client) QueryInfo(options ...RequestOption) (*fab.BlockchainInfoResponse, error)
QueryInfo查询此通道上的各种区块链信息,例如区块高度和当前区块哈希。
参数:
options是可选的请求选项
返回区块链信息
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println("failed to create client")
}

bci, err := c.QueryInfo()
if err != nil {
    fmt.Printf("failed to query for blockchain info: %s\n", err)
}

if bci != nil {
    fmt.Println("Retrieved ledger info")
}
// output:
// Retrieved ledger info  

5、查询交易信息

func (c *Client) QueryTransaction(transactionID fab.TransactionID, options ...RequestOption) (*pb.ProcessedTransaction, error)
QueryTransaction通过交易ID查询账本上的已处理交易。
参数:
txID是必需的交易ID
options包含可选的请求选项
返回已经处理交易的信息
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println("failed to create client")
}

t, err := c.QueryTransaction("123")
if err != nil {
    fmt.Printf("failed to query transaction: %s\n", err)
}

if t != nil {
    fmt.Println("Retrieved transaction")
}
// output:
// Retrieved transaction  

6、为客户端设置过滤器

type ClientOption func(*Client) error

// WithDefaultTargetFilter option to configure new
func WithDefaultTargetFilter(filter fab.TargetFilter) ClientOption
使用示例:
ctx := mockChannelProvider("mychannel")

c, err := New(ctx, WithDefaultTargetFilter(&urlTargetFilter{url: "example.com"}))
if err != nil {
    fmt.Println(err)
}

if c != nil {
    fmt.Println("ledger client created with url target filter")
}
// output:
// ledger client created with url target filter   

7、RequestOption参数构建

type RequestOption func(ctx context.Client, opts *requestOptions) error

//requestOptions contains options for operations performed by LedgerClient
type requestOptions struct {
   Targets       []fab.Peer                        // target peers
   TargetFilter  fab.TargetFilter                  // target filter
   MaxTargets    int                               // maximum number of targets to select
   MinTargets    int                               // min number of targets that have to respond with no error (or agree on result)
   Timeouts      map[fab.TimeoutType]time.Duration //timeout options for ledger query operations
   ParentContext reqContext.Context                //parent grpc context for ledger operations
}
func WithMaxTargets(maxTargets int) RequestOption

WithMaxTargets指定每个请求选择的最大目标数。最大目标数的默认值为1.
func WithMinTargets(minTargets int) RequestOption
WithMinTargets指定必须响应且没有错误(或同意结果)的最小目标数。 最小目标数的默认值为1。
func WithParentContext(parentContext reqContext.Context) RequestOption
WithParentContext封装了grpc父上下文
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println(err)
}

channelContext, err := mockChannelProvider("mychannel")()
if err != nil {
    fmt.Println("failed to return channel context")
    return
}

// get parent context and cancel
parentContext, cancel := sdkCtx.NewRequest(channelContext, sdkCtx.WithTimeout(20*time.Second))
defer cancel()

bci, err := c.QueryInfo(WithParentContext(parentContext))
if err != nil {
    fmt.Printf("failed to query for blockchain info: %s\n", err)
}

if bci != nil {
    fmt.Println("Retrieved blockchain info")
}
// output:
// Retrieved blockchain info      

func WithTargetEndpoints(keys ...string) RequestOption
withTargetEndpoints允许每个请求覆盖目标Peer节点。目标由名称或URL指定,SDK将创建底层Peer节点对象。
func WithTargetFilter(targetFilter fab.TargetFilter) RequestOption
WithTargetFilter指定每个请求的目标Peer节点过滤器。
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println(err)
}

block, err := c.QueryBlock(1, WithTargetFilter(&urlTargetFilter{url: "example.com"}))
if err != nil {
    fmt.Printf("failed to query block: %s\n", err)
}

if block != nil {
    fmt.Println("Retrieved block #1 from example.com")
}
// output:
// Retrieved block #1 from example.com

func WithTargets(targets ...fab.Peer) RequestOption
WithTargets允许每个请求覆盖目标Peer节点。
使用示例:

c, err := New(mockChannelProvider("mychannel"))
if err != nil {
    fmt.Println("failed to create client")
}

cfg, err := c.QueryConfig(WithTargets(mockPeerWithConfigBlock()))
if err != nil {
    fmt.Printf("failed to query config with target peer: %s\n", err)
}

if cfg != nil {
    fmt.Println("Retrieved config from target peer")
}
// output:
// Retrieved config from target peer 

func WithTimeout(timeoutType fab.TimeoutType, timeout time.Duration) RequestOption
WithTimeout封装了超时类型、超时时间的键值对到Options选项,次选项用于QueryInfo,QueryBlock,QueryBlockByHash,QueryBlockByTxID,QueryTransaction,QueryConfig等函数。

三、ledger示例

var (
   sdk           *fabsdk.FabricSDK
   channelName   = "assetchannel"
   org           = "org1"
   user          = "Admin"
)

// 账本查询
func queryBlockchain() {
   ctx := sdk.ChannelContext(channelName, fabsdk.WithOrg(org), fabsdk.WithUser(user))

   cli, err := ledger.New(ctx)
   if err != nil {
      panic(err)
   }

   resp, err := cli.QueryInfo(ledger.WithTargetEndpoints("peer0.org1.example.com"))
   if err != nil {
      panic(err)
   }

   fmt.Println(resp)

   // 1
   cli.QueryBlockByHash(resp.BCI.CurrentBlockHash)

   // 2
   for i := uint64(0); i <= resp.BCI.Height; i++ {
      cli.QueryBlock(i)
   }
}

原文地址:http://blog.51cto.com/9291927/2324694

时间: 2024-08-12 00:09:26

HyperLeger Fabric SDK开发(七)——ledger的相关文章

HyperLeger Fabric SDK开发(一)——Fabric SDK开发简介

HyperLeger Fabric SDK开发(一)--Fabric SDK开发简介 一.Fabric SDK简介 1.Fabric SDK简介 Farbric的Peer节点和Orderer节点都提供了基于gRPC协议的接口,用于和Peer节点与Orderer节点进行命令/数据交互.为了简化开发,为开发人员开发应用程序提供操作Fabric区块链网络的API,Fabric官方提供了多种语言版本的SDK.Fabric提供了三种语言版本的SDK,分别如下:A.Fabric Nodejs SDKB.Fa

HyperLeger Fabric SDK开发(二)——Fabric SDK配置

HyperLeger Fabric SDK开发(二)--Fabric SDK配置 一.Fabric SDK配置 Fabric区块链网络应用程序需要大量的参数,用于连接Fabric区块链网络.通常将Fabric区块链网络应用程序所需的参数放到一个配置文件进行管理,配置文件定义Fabric SDK Go的配置和用户自定义参数,指定了连接Fabric区块链网络所需的全部信息,例如Fabric区块链网络组件的主机名和端口等.Fabric SDK GO为应用程序提供的配置文件通常使用yaml文件格式编写,

HyperLeger Fabric SDK开发(三)——fabsdk

HyperLeger Fabric SDK开发(三)--fabsdk 一.fabsdk简介 1.fabsdk简介 fabsdk是Fabric SDK的主要包,fabsdk支持客户端使用Hyperledger Fabric区块链网络.fabsdk基于配置创建上下文环境,上下文环境会在client包使用.官方文档:https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/fabsdk 2.fabsdk使用基本流程 Fabsdk使用基本流程如

HyperLeger Fabric SDK开发(四)——channel

HyperLeger Fabric SDK开发(四)--channel 一.channel简介 1.channel?简介 pkg/client/channel支持访问Fabric网络上的通道.channel客户端实例提供与指定通道上的Peer节点进行交互的处理函数.channel客户端可以在指定通道上查询链码,执行链码以及注册或注销链码事件.如果应用程序需要与Fabric网络的多条通道进行交互,需要为每条通道创建一个单独的通道客户端实例.官方文档:https://godoc.org/github

HyperLeger Fabric SDK开发(六)——resmgmt

HyperLeger Fabric SDK开发(六)--resmgmt 一.resmgmt简介 1.resmgmt简介 resmgmt支持在Fabric网络上创建和更新资源.resmgmt允许管理员创建.更新通道,并允许Peer节点加入通道.管理员还可以在Peer节点上执行与链码相关的操作,例如安装,实例化和升级链码.官方文档:https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/client/resmgmt 2.resmgmt使用

HyperLeger Fabric SDK开发(八)——msp

HyperLeger Fabric SDK开发(八)--msp 一.msp简介 1.msp简介 msp支持在Fabric网络上创建和更新用户.MSP客户端支持以下操作:Enroll,Reenroll,Register,Revoke和GetSigningIdentity.官方文档:https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/client/msp 2.msp使用流程 msp使用的基本流程如下:A.准备客户端上下文B.创建msp

HyperLeger Fabric开发(七)——HyperLeger Fabric链码开发

HyperLeger Fabric开发(七)--HyperLeger Fabric链码开发 一.链码开发模式 1.链码开发模式简介 Fabric的链码开发调试比较繁琐.在不使用链码开发模式的情况下,链码不能在本地测试,必须部署到docker,install和instantiate后,Peer节点会在新的容器中启动链码.但只能通过docker logs查看链码日志,通过打印日志的方式进行链码调试.如果对链码进行了修改,需要重新开始上述流程.为了简化Fabric链码开发的调试过程,Fabric引入了

HyperLeger Fabric开发(八)——HyperLeger Fabric链码开发测试

HyperLeger Fabric开发(八)--HyperLeger Fabric链码开发测试 一.链码实例 SACC项目链码实例如下: package main import ( "fmt" "github.com/hyperledger/fabric/core/chaincode/shim" "github.com/hyperledger/fabric/protos/peer" ) // SimpleAsset implements a si

HyperLeger Fabric开发(三)——HyperLeger Fabric架构

HyperLeger Fabric开发(三)--HyperLeger Fabric架构 一.HyperLeger Fabric架构简介 1.通道简介 商业应用的一个重要的需求是私密×××易,为此Fabric设计了通道(Channel)来提供成员之间的隐私保护.通道是部分网络成员之间拥有独立的通信渠道,在通道中发送的交易只有属于通道的成员才可见,因此通道可以看作是Fabric的网络中部分成员的私有通信子网.通道由排序服务管理.在创建通道的时候,需要定义通道的成员和组织.锚节点(anchor pee