一. pkg/client/ledger ledger包在Fabric网络上的指定通道上启用分类帐查询。 需要来自多个渠道的分类帐查询的应用程序应为每个渠道创建分类帐客户端的单独实例。 Ledger客户端支持以下查询:QueryInfo,QueryBlock,QueryBlockByHash,QueryBlockByTxID,QueryTransaction和QueryConfig。
- 基本流程:
1)准备频道上下文
2)创建分类帐客户端
3)查询分类帐1 ctx := mockChannelProvider("mychannel") 2 3 c, err := New(ctx) 4 if err != nil { 5 fmt.Println("failed to create client") 6 } 7 8 block, err := c.QueryBlock(1) 9 if err != nil { 10 fmt.Printf("failed to query block: %s\n", err) 11 } 12 13 if block != nil { 14 fmt.Println("Retrieved block #1") 15 }
输出:Retrieved block #1
- 类型Client
-
type Client struct {// contains filtered or unexported fields}: 客户端在Fabric网络上启用分类帐查询
-
func New(channelProvider context.ChannelProvider, opts ...ClientOption) (*Client, error): New返回分类帐客户端实例。 分类帐客户端实例提供处理程序以查询指定通道上的各种信息。 需要与多个通道交互的应用程序应为每个通道创建一个单独的分类帐客户端实例。 Ledger客户端仅支持特定查询。
- 例:
1 ctx := mockChannelProvider("mychannel") 2 3 c, err := New(ctx) 4 if err != nil { 5 fmt.Println(err) 6 } 7 8 if c != nil { 9 fmt.Println("ledger client created") 10 }
输出:ledger client created
- 例:
-
func (c *Client) QueryBlock(blockNumber uint64, options ...RequestOption) (*common.Block, error): QueryBlock按块编号查询分类帐。
- 参数:
blockNumber是必需的块号(ID)
options包含可选的请求选项返回:
区块信息 - 例:
1 c, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println("failed to create client") 4 } 5 6 block, err := c.QueryBlock(1) 7 if err != nil { 8 fmt.Printf("failed to query block: %s\n", err) 9 } 10 11 if block != nil { 12 fmt.Println("Retrieved block #1") 13 }
输出:Retrieved block #1
- 参数:
-
func (c *Client) QueryBlockByHash(blockHash []byte, options ...RequestOption) (*common.Block, error): QueryBlockByHash能过块hash查询分类帐。
- 参数:
blockHash是必需的块哈希
options包含可选的请求选项返回:
区块信息 - 例:
1 c, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println("failed to create client") 4 } 5 6 block, err := c.QueryBlockByHash([]byte("hash")) 7 if err != nil { 8 fmt.Printf("failed to query block by hash: %s\n", err) 9 } 10 11 if block != nil { 12 fmt.Println("Retrieved block by hash") 13 }
输出:Retrieved block by hash
- 参数:
-
func (c *Client) QueryBlockByTxID(txID fab.TransactionID, options ...RequestOption) (*common.Block, error): QueryBlockByTxID查询包含事务的块。
- 参数:
txID是必需的事务ID
options包含可选的请求选项返回:
区块信息 - 例:
1 c, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println("failed to create client") 4 } 5 6 block, err := c.QueryBlockByTxID("123") 7 if err != nil { 8 fmt.Printf("failed to query block by transaction ID: %s\n", err) 9 } 10 11 if block != nil { 12 fmt.Println("Retrieved block by transaction ID") 13 }
输出:Retrieved block by transaction ID
- 参数:
-
func (c *Client) QueryConfig(options ...RequestOption) (fab.ChannelCfg, error): QueryConfig查询通道配置。
- 参数:
options包含可选的请求选项
返回:
通道配置信息 - 例:
1 c, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println("failed to create client") 4 } 5 6 cfg, err := c.QueryConfig(WithTargets(mockPeerWithConfigBlock())) 7 if err != nil { 8 fmt.Printf("failed to query config: %s\n", err) 9 } 10 11 if cfg != nil { 12 fmt.Println("Retrieved channel configuration") 13 }
输出:Retrieved channel configuration
- 参数:
-
func (c *Client) QueryInfo(options ...RequestOption) (*fab.BlockchainInfoResponse, error): QueryInfo查询此通道上的各种有用区块链信息,例如块高度和当前块哈希。
- 参数:
options是可选的请求选项
返回:
区块链信息 - 例:
1 c, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println("failed to create client") 4 } 5 6 bci, err := c.QueryInfo() 7 if err != nil { 8 fmt.Printf("failed to query for blockchain info: %s\n", err) 9 } 10 11 if bci != nil { 12 fmt.Println("Retrieved ledger info") 13 }
输出:Retrieved ledger info
- 参数:
-
func (c *Client) QueryTransaction(transactionID fab.TransactionID, options ...RequestOption) (*pb.ProcessedTransaction, error): QueryTransaction通过事务ID查询分类帐以处理事务。
- 参数:
txID是必需的事务ID
options包含可选的请求选项返回:
处理的交易信息 - 例:
1 c, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println("failed to create client") 4 } 5 6 t, err := c.QueryTransaction("123") 7 if err != nil { 8 fmt.Printf("failed to query transaction: %s\n", err) 9 } 10 11 if t != nil { 12 fmt.Println("Retrieved transaction") 13 }
输出:Retrieved transaction
- 参数:
-
- 类型ClientOption
-
func WithDefaultTargetFilter(filter fab.TargetFilter) ClientOption: WithDefaultTargetFilter选项用于配置新的
- 例:
1 ctx := mockChannelProvider("mychannel") 2 3 c, err := New(ctx, WithDefaultTargetFilter(&urlTargetFilter{url: "example.com"})) 4 if err != nil { 5 fmt.Println(err) 6 } 7 8 if c != nil { 9 fmt.Println("ledger client created with url target filter") 10 }
输出:ledger client created with url target filter
- 例:
- 类型RequestOption
-
func WithMaxTargets(maxTargets int) RequestOption: WithMaxTargets指定每个请求选择的最大目标数。 最大目标数的默认值为1。
-
func WithMinTargets(minTargets int) RequestOption: WithMinTargets指定必须响应且没有错误(或同意结果)的最小目标数。 最小目标数的默认值为1。
-
func WithParentContext(parentContext reqContext.Context) RequestOption: WithParentContext封装了grpc父上下文
- 例:
1 c, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println(err) 4 } 5 6 channelContext, err := mockChannelProvider("mychannel")() 7 if err != nil { 8 fmt.Println("failed to return channel context") 9 return 10 } 11 12 // get parent context and cancel 13 parentContext, cancel := sdkCtx.NewRequest(channelContext, sdkCtx.WithTimeout(20*time.Second)) 14 defer cancel() 15 16 bci, err := c.QueryInfo(WithParentContext(parentContext)) 17 if err != nil { 18 fmt.Printf("failed to query for blockchain info: %s\n", err) 19 } 20 21 if bci != nil { 22 fmt.Println("Retrieved blockchain info") 23 }
输出:Retrieved blockchain info
- 例:
-
func WithTargetEndpoints(keys ...string) RequestOption: WithTargetEndpoints允许每个请求覆盖目标peer。 目标由名称或URL指定,SDK将创建基础对等对象。
-
func WithTargetFilter(targetFilter fab.TargetFilter) RequestOption: WithTargetFilter指定每个请求的目标对等过滤器。
- 例:
1 c, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println(err) 4 } 5 6 block, err := c.QueryBlock(1, WithTargetFilter(&urlTargetFilter{url: "example.com"})) 7 if err != nil { 8 fmt.Printf("failed to query block: %s\n", err) 9 } 10 11 if block != nil { 12 fmt.Println("Retrieved block #1 from example.com") 13 }
输出:Retrieved block #1 from example.com
- 例:
-
func WithTargets(targets ...fab.Peer) RequestOption: WithTargets允许每个请求覆盖目标对等体。
- 例:
1 c, err := New(mockChannelProvider("mychannel")) 2 if err != nil { 3 fmt.Println("failed to create client") 4 } 5 6 cfg, err := c.QueryConfig(WithTargets(mockPeerWithConfigBlock())) 7 if err != nil { 8 fmt.Printf("failed to query config with target peer: %s\n", err) 9 } 10 11 if cfg != nil { 12 fmt.Println("Retrieved config from target peer") 13 }
输出:Retrieved config from target peer
- 例:
-
func WithTimeout(timeoutType fab.TimeoutType, timeout time.Duration) RequestOption: WithTimeout封装了超时类型的键值对,QueryInfo,QueryBlock,QueryBlockByHash,QueryBlockByTxID,QueryTransaction,QueryConfig函数的Options的超时持续时间