Hyperledger Fabric golang 链码无法按预期手动将数据存储在分类账上,但在尝试通过函数调用存储时却无法正常工作
Hyperledger Fabric golang chaincode not working as expected store data on ledger manually but not when try to store via function call
我正在尝试在 hyperledger fabric 上存储资金转账记录。我在 go lang 中编写了链码。当我在 initLedger 函数中添加数据时它工作正常。但是当我从其他函数如 createTransfer 调用它时(我将提供两个代码)它显示成功的交易但是当我检索链数据时它没有出现在其中。
传输结构
type Transfer struct {
TransferID string `json:"transferID"`
FromAccount string `json:"fromAccount"`
ToAccount string `json:"toAcount"`
Amount string `json:"amount"`
}
这个函数将数据写入分类帐:当我在 initLedger 方法中直接调用它时它工作正常
func writeTransferToLedger(APIStub shim.ChaincodeStubInterface, transfers []Transfer) sc.Response {
for i := 0; i < len(transfers); i++ {
key := transfers[i].TransferID
chkBytes, _ := APIStub.GetState(key)
if chkBytes == nil {
asBytes, _ := json.Marshal(transfers[i])
err := APIStub.PutState(transfers[i].TransferID, asBytes)
if err != nil {
return shim.Error(err.Error())
}
} else {
msg := "Transfer already exist" + key + " Failure---------------"
return shim.Error(msg)
}
}
return shim.Success([]byte("Write to Ledger"))
}
在 createTransfer 函数中调用 writeToTransferLedger 方法:
func (s *SmartContract) createTransfer(APIStub shim.ChaincodeStubInterface, args []string) sc.Response {
if len(args) != 4 {
return shim.Error("Incorrect Number of arguments for transfer func, Expecting 4")
}
transfers := []Transfer{Transfer{TransferID: args[0], FromAccount: args[1], ToAccount: args[2], Amount: args[3]}}
writeTransferToLedger(APIStub, transfers)
return shim.Success([]byte("stored:" + args[0] + args[1] + args[2] + args[3]))
}
当我从 nodesdk 代码调用 createTransfer 时它执行成功但是当我从链码中检索数据时不是 return。
我希望它能与 createTransfer 函数一起工作,因为它与 writeTransferToLedger 一起工作。
在 initLedger 方法中,我用给定的数据创建了传输结构并调用了 writeTransferToLedger 函数,代码如下:
transfer := []Transfer{
{TransferID: "1233", FromAccount: "US_John_Doe_123", ToAccount: "UK_Alice_456", Amount: "200"},
{TransferID: "231", FromAccount: "JPY_Alice_456", ToAccount: "UK_John_Doe", Amount: "3000"},
}
writeTransferToLedger(APIstub, transfer)
感谢您的帮助。我已经解决了这个问题。
尝试从客户分类帐中检索数据时,我正在调用调用函数。
我必须查询分类帐并从分类帐中获取传输数据。
我正在尝试在 hyperledger fabric 上存储资金转账记录。我在 go lang 中编写了链码。当我在 initLedger 函数中添加数据时它工作正常。但是当我从其他函数如 createTransfer 调用它时(我将提供两个代码)它显示成功的交易但是当我检索链数据时它没有出现在其中。
传输结构
type Transfer struct {
TransferID string `json:"transferID"`
FromAccount string `json:"fromAccount"`
ToAccount string `json:"toAcount"`
Amount string `json:"amount"`
}
这个函数将数据写入分类帐:当我在 initLedger 方法中直接调用它时它工作正常
func writeTransferToLedger(APIStub shim.ChaincodeStubInterface, transfers []Transfer) sc.Response {
for i := 0; i < len(transfers); i++ {
key := transfers[i].TransferID
chkBytes, _ := APIStub.GetState(key)
if chkBytes == nil {
asBytes, _ := json.Marshal(transfers[i])
err := APIStub.PutState(transfers[i].TransferID, asBytes)
if err != nil {
return shim.Error(err.Error())
}
} else {
msg := "Transfer already exist" + key + " Failure---------------"
return shim.Error(msg)
}
}
return shim.Success([]byte("Write to Ledger"))
}
在 createTransfer 函数中调用 writeToTransferLedger 方法:
func (s *SmartContract) createTransfer(APIStub shim.ChaincodeStubInterface, args []string) sc.Response {
if len(args) != 4 {
return shim.Error("Incorrect Number of arguments for transfer func, Expecting 4")
}
transfers := []Transfer{Transfer{TransferID: args[0], FromAccount: args[1], ToAccount: args[2], Amount: args[3]}}
writeTransferToLedger(APIStub, transfers)
return shim.Success([]byte("stored:" + args[0] + args[1] + args[2] + args[3]))
}
当我从 nodesdk 代码调用 createTransfer 时它执行成功但是当我从链码中检索数据时不是 return。
我希望它能与 createTransfer 函数一起工作,因为它与 writeTransferToLedger 一起工作。
在 initLedger 方法中,我用给定的数据创建了传输结构并调用了 writeTransferToLedger 函数,代码如下:
transfer := []Transfer{
{TransferID: "1233", FromAccount: "US_John_Doe_123", ToAccount: "UK_Alice_456", Amount: "200"},
{TransferID: "231", FromAccount: "JPY_Alice_456", ToAccount: "UK_John_Doe", Amount: "3000"},
}
writeTransferToLedger(APIstub, transfer)
感谢您的帮助。我已经解决了这个问题。 尝试从客户分类帐中检索数据时,我正在调用调用函数。 我必须查询分类帐并从分类帐中获取传输数据。