使用Hyperledger 1.0 Nodejs SDK查询最新的世界状态

时间:2017-09-18 08:58:01

标签: hyperledger-fabric hyperledger

基于hyperledger SDK doc,我们可以使用nodeJS SDK来查询块和事务信息。是否可以使用此SDK查询最新的世界状态,例如,查询给定密钥的值?

1 个答案:

答案 0 :(得分:3)

为了能够查询最新的世界状态,您的链码必须提供此功能,即您必须实现此逻辑并将其合并到您的链代码中。然后它只需要执行链代码来获取您感兴趣的键的值。

例如,你可以做类似的事情:

package main

import (
    "fmt"

    "github.com/hyperledger/fabric/core/chaincode/shim"
    "github.com/hyperledger/fabric/protos/peer"
)

// Person
type Asset struct {
    ID    string `json:"id"`
    Name  string `json:"name"`
    Price string `json:"price"`
}

// assetManagement the chaincode interface implementation to manage
// the ledger of person records
type assetManagement struct {
}

func (p *assetManagement) Init(stub shim.ChaincodeStubInterface) peer.Response {
    return shim.Success(nil)
}

func (p *assetManagement) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
    actionName, params := stub.GetFunctionAndParameters()

    if actionName == "addAsset" {
        return p.addAsset(stub)
    } else if actionName == "getAsset" {
        return p.getAsset(stub)
    }

    return shim.Error("Unknown function name")
}
func (p *assetManagement) getAsset(stub shim.ChaincodeStubInterface) peer.Response {
    _, params := stub.GetFunctionAndParameters()

    assetID := params[0]
    state, err := stub.GetState(assetID)
    if err != nil {
        return shim.Error(fmt.Sprintf("%s", err))
    }

    return shim.Success(state)
}

func (p *assetManagement) addAsset(stub shim.ChaincodeStubInterface) peer.Response {
    // TODO add loggic adding new asset
}

func main() {
    err := shim.Start(new(assetManagement))
    if err != nil {
        fmt.Printf("Error starting Simple chaincode: %s", err)
    }
}

接下来,您只需要调用带有资产ID的链接代码传递函数名称getAsset,并获取该资产的最新状态。以下是基于Go SDK的代码:

// Skipped initialization.

txRequest := apitxn.ChaincodeInvokeRequest{
    Targets:      []apitxn.ProposalProcessor{p},
    Fcn:          "getAsset",
    Args:         []string{"42"},
    TransientMap: map[string][]byte{},
    ChaincodeID:  "assetChaincode",
}

proposalResponse, _, err := ch.SendTransactionProposal(txRequest)
if err != nil {
    fmt.Println(err)
    return
}

fmt.Printf("%v\n", proposalResponse[0].ProposalResponse)

tx, err := ch.CreateTransaction(proposalResponse)
if err != nil {
    fmt.Println(err)
    return
}

txResponse, err := ch.SendTransaction(tx)
if err != nil {
    fmt.Println(err)
    return
}

fmt.Println(txResponse[0])