执行ChainCode时不会更新值

时间:2018-02-25 05:32:57

标签: hyperledger-fabric

我正在关注hyperledger-fabric的教程,下面是链接。 http://hyperledger-fabric.readthedocs.io/en/latest/build_network.html

当我按照链接的指示执行 byfn.sh 时,在执行调用以从a到b传输10值之后尝试查询该值时失败。尽管成功响应:200并且没有从ChainCode返回错误,查询结果仍然是100而不是90。 我也通过转到CLI容器并逐步执行命令来证明这一点。

我想知道你是否有人遇到这个问题,而且如果有任何指导如何调试这个(例如如何查看区块链中的链,检查值是否无法更新但是响应成功的日志)等)。

提前致谢

[编辑] :根据说明(http://hyperledger-fabric.readthedocs.io/en/latest/build_network.html),提到我们需要运行(也是 byfn.sh 的一部分)

peer chaincode invoke -o orderer.example.com:7050  --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

将值从“a”传输到“b”,然后当我们向对等方调用查询时,a的值应该从最初的100更改为90.

peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

可以在此处找到安装到每个对等方的链代码:https://github.com/hyperledger/fabric-samples/blob/release/chaincode/chaincode_example02/chaincode_example02.go

复制粘贴调用的代码以更新值

func (t *SimpleChaincode) invoke(stub shim.ChaincodeStubInterface, args []string) pb.Response {
var A, B string    // Entities
var Aval, Bval int // Asset holdings
var X int          // Transaction value
var err error

if len(args) != 3 {
    return shim.Error("Incorrect number of arguments. Expecting 3")
}

A = args[0]
B = args[1]

// Get the state from the ledger
// TODO: will be nice to have a GetAllState call to ledger
Avalbytes, err := stub.GetState(A)
if err != nil {
    return shim.Error("Failed to get state")
}
if Avalbytes == nil {
    return shim.Error("Entity not found")
}
Aval, _ = strconv.Atoi(string(Avalbytes))

Bvalbytes, err := stub.GetState(B)
if err != nil {
    return shim.Error("Failed to get state")
}
if Bvalbytes == nil {
    return shim.Error("Entity not found")
}
Bval, _ = strconv.Atoi(string(Bvalbytes))

// Perform the execution
X, err = strconv.Atoi(args[2])
if err != nil {
    return shim.Error("Invalid transaction amount, expecting a integer value")
}
Aval = Aval - X
Bval = Bval + X
fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)

// Write the state back to the ledger
err = stub.PutState(A, []byte(strconv.Itoa(Aval)))
if err != nil {
    return shim.Error(err.Error())
}

err = stub.PutState(B, []byte(strconv.Itoa(Bval)))
if err != nil {
    return shim.Error(err.Error())
}

return shim.Success(nil)
}

我很困惑如何无法更新价值,如果有人可以给我一个如何调试区块链或结构的提示,那就太棒了。

0 个答案:

没有答案