我正在关注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)
}
我很困惑如何无法更新价值,如果有人可以给我一个如何调试区块链或结构的提示,那就太棒了。