fabric 提交交易如何使用go sdk获取该交易的区块高度
时间: 2023-05-08 18:57:01 浏览: 143
在使用fabric提交交易时,可以通过go sdk获取该交易的区块高度。
首先,需要使用fabric的go sdk构建一条通道。在该通道中,有一个EventHub可以监听区块高度变化的事件。
当区块链网络中出现新的区块时,EventHub会接收到通知,并返回区块高度。通过将这个高度与已提交的交易进行匹配,就可以获取该交易的区块高度。
具体的实现过程如下:
1. 构建通道:
```go
import (
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
"github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/events"
)
sdk, err := fabsdk.New(config.FromFile("config.yaml"))
if err != nil {
fmt.Println("Failed to create SDK", err)
return
}
clientChannelProvider := sdk.ChannelContext("mychannel", fabsdk.WithUser("User1"))
clientChannel, err := channel.New(clientChannelProvider)
if err != nil {
fmt.Println("Failed to create channel client", err)
return
}
```
2. 监听区块高度变化的事件:
```go
event, err := events.New(clientChannelProvider, events.WithBlockEvents())
if err != nil {
fmt.Println("Failed to create BlockEventHub", err)
return
}
blockEventChan, err := event.RegisterBlockEvent()
if err != nil {
fmt.Println("Failed to register block event", err)
return
}
```
3. 提交交易并获取交易ID:
```go
request := channel.Request{ChaincodeID: "mycc", Fcn: "myfunction", Args: [][]byte{[]byte("arg1"), []byte("arg2")}}
response, err := clientChannel.Execute(request)
if err != nil {
fmt.Println("Failed to execute transaction", err)
return
}
txid := response.TransactionID
```
4. 匹配交易ID和区块高度:
```go
for {
select {
case event := <-blockEventChan:
for _, tx := range event.Block.Data.Data {
if tx.GetHeader().GetTxId() == txid {
fmt.Println("Transaction found in block with block number", event.Block.Header.Number)
return
}
}
case <-time.After(time.Second * 10):
fmt.Println("Timeout")
return
}
}
```
以上代码中,event.RegisterBlockEvent()会返回一个chan *fab.BlockEvent对象的数据流,通过不断循环读取该数据流,可以实时监听区块高度变化,当区块高度发生变化时,就可以将新区块中的交易提取出来并匹配交易ID,最终得到该交易的区块高度。
需要注意的是,如果网络中有多个peer节点,可能存在交易在某些节点提交成功,但还未被共识验证进入区块的情况,这时就需要等待一段时间后再进行查询和匹配。此外,还应该考虑重复提交交易的情况,避免将另外一笔相同交易的区块高度误认为是当前交易的区块高度。
阅读全文