当我想要将一些数据写入fabric分类账时,chaincode调用命令看起来很好,并且没有错误,但我没有发现任何写入couchdb的内容。
func (t * NumberGenerator) GenerateNumber(stub shim.ChaincodeStubInterface,args []string) peer.Response{
num,err := strconv.Atoi(args[0])
if err!= nil{
return shim.Error("internal error")
}
size,err := stub.GetState("size")
sizeNum,_ := strconv.Atoi(string(size))
rand.Seed(time.Now().Unix())
for i:=0;i < num;i++{
id := strconv.Itoa(sizeNum+i)
num := rand.Intn(100)-50
numStr := strconv.Itoa(num)
err := stub.PutState(id, []byte(numStr))
fmt.Println(id,num)
if err != nil{
return shim.Error("fail to save the data")
}
}
sizeNum += num
err3 := stub.PutState("size",[]byte(strconv.Itoa(sizeNum)))
if err3 != nil{
return shim.Error("fail to update the size")
}
return shim.Success([]byte("success to generate number"))我可以在码头上看到日志,
fabric@ubuntu:~/Desktop/fcc/fcc/fabric-samples/fcc$ sudo docker logs -f dev-peer0.org1.example.com-dataGenerator-1.00 -18 1 31 2 -3 3 -25但是我在couchdb中什么也没有找到,PutState函数也没有返回错误,谁能告诉我为什么?
这是我用来调用chanincode函数的命令
#!/bin/sh
CC_RUNTIME_LANGUAGE=golang
CC_SRC_PATH=github.com/chaincode/dataGenerator
CONFIG_ROOT=/opt/gopath/src/github.com/hyperledger/fabric/peer
ORG1_MSPCONFIGPATH=${CONFIG_ROOT}/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
ORG1_TLS_ROOTCERT_FILE=${CONFIG_ROOT}/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
ORG2_MSPCONFIGPATH=${CONFIG_ROOT}/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
ORG2_TLS_ROOTCERT_FILE=${CONFIG_ROOT}/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
ORG3_MSPCONFIGPATH=${CONFIG_ROOT}/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp
ORG3_TLS_ROOTCERT_FILE=${CONFIG_ROOT}/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
ORDERER_TLS_ROOTCERT_FILE=${CONFIG_ROOT}/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
docker exec \
-e CORE_PEER_LOCALMSPID=Org1MSP \
-e CORE_PEER_MSPCONFIGPATH=${ORG1_MSPCONFIGPATH} \
cli \
peer chaincode invoke \
-o orderer.example.com:7050 \
-C mychannel \
-n dataGenerator \
-c '{"Args":["GenerateNumber","2"]}' \
--tls \
--cafile ${ORDERER_TLS_ROOTCERT_FILE} \发布于 2021-11-01 22:22:28
调用PutState()时,数据不会写入账本。链码执行会产生一个同级背书,以便在事务中将一些数据写入分类帐。然后,客户端收集来自对等体的批注结果,并将执行的事务和批注提交到订购服务,一旦块被切割,则每个对等体随后验证块事务,并将任何已验证的事务写入账本。
检查您的对等日志,以验证它们是否已使用事务提交了块,以及是否没有无效警告。例如,如果不同的对等点产生了不同的认可结果,则交易可能会失效。我之所以提到这一点,是因为您的链代码有一个time.Now()调用,如果您的认可策略是多个peer (它应该是这样的),那么它在每个peer执行过程中肯定会略有不同,并且会导致无效。
发布于 2021-11-18 01:33:35
禁止合同包含随机数、时间等不确定值。
删除有关rand.Seed(time.Now().Unix())的代码
https://stackoverflow.com/questions/69770825
复制相似问题