倪钦崟 2020-11-03 14:52 采纳率: 0%
浏览 35

在hyperledger fabric中,用命令行调用链码时,如果函数的参数是键值对形式,该怎么写

正常的调用命令如下

peer chaincode invoke --tls --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["get","a"]}'

但是我写了一个这样一个函数

//接收对象并调用 PutFile 函数实现保存状态的功能
func (t *DataChaincode) addFile(stub shim.ChaincodeStubInterface, args []string) peer.Response {
	//两个参数前一个是file,后一个是事件ID
	if len(args) != 2 {
		return shim.Error("给定的参数个数不符合要求")
	}
	var file DataFile
	err := json.Unmarshal([]byte(args[0]), &file)
	if err != nil {
		return shim.Error("反序列化信息时发生错误")
	}

	// 查重: 文件名必须唯一
	_, exist := GetFileInfo(stub, file.FileName)
	if exist {
		return shim.Error("要添加的文件名已存在")
	}

	_, bl := PutFile(stub, file)
	if !bl {
		return shim.Error("保存信息时发生错误")
	}

	err = stub.SetEvent(args[1], []byte{})
	if err != nil {
		return shim.Error(err.Error())
	}

	return shim.Success([]byte("信息添加成功"))
}

其中两个方法是这样写的

​
//PutFile 写入要上传的文件信息,实现将指定的对象序列化后保存至分类账本中
func PutFile(stub shim.ChaincodeStubInterface, file DataFile) ([]byte, bool) {
	f, err := json.Marshal(file)
	if err != nil {
		return nil, false
	}

	err = stub.PutState(file.FileName, f)
	if err != nil {
		return nil, false
	}

	return f, true
}

// GetFileInfo 根据文件名查询信息状态
// args: Filename
func GetFileInfo(stub shim.ChaincodeStubInterface, filename string) (DataFile, bool) {
	var file DataFile
	// 根据记录序号查询信息状态
	f, err := stub.GetState(filename)
	if err != nil {
		return file, false
	}

	if f == nil {
		return file, false
	}

	// 对查询到的状态进行反序列化
	err = json.Unmarshal(f, &file)
	if err != nil {
		return file, false
	}

​

 

DataFile结构体定义如下

type DataFile struct {
	FileName   string `json:"FileName"`   //数据资源文件名
	ID         string `json:"ID"`         //提供者ID
	IPAdress   string `json:"IPAdress"`   //提供者IP地址
	OrgName    string `json:"OrgName"`    //提供者所属组织名
	ModifyTime string `json:"ModifyTime"` //修改时间
}

我要在命令行中调用addfile这个函数,给它一个如下参数,参数应该怎么写

file1 := DataFile{
		FileName:   "1.txt",
		ID:         "121",
		IPAdress:   "1.1.1.2",
		OrgName:    "org2",
		ModifyTime: "8:27 2019/9/12",
	}

 

  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-07-24 22:16
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    要在命令行中调用addFile函数,需要传入两个参数,第一个参数是DataFile结构体file1的JSON字符串表示,第二个参数是事件ID。根据addFile函数的定义,可以使用以下命令:
    peer chaincode invoke --tls --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["addFile","{\"FileName\":\"1.txt\",\"ID\":\"121\",\"IPAdress\":\"1.1.1.2\",\"OrgName\":\"org2\",\"ModifyTime\":\"8:27 2019/9/12\"}","eventId"]}'
    

    在以上命令中,第一个参数是addFile函数名,第二个参数是DataFile结构体file1的JSON表示,第三个参数是事件ID。根据给定的DataFile结构体file1,JSON表示应该是:

    {
        "FileName": "1.txt",
        "ID": "121",
        "IPAdress": "1.1.1.2",
        "OrgName": "org2",
        "ModifyTime": "8:27 2019/9/12"
    }
    

    这样,可以通过命令行调用addFile函数并传入对应的参数进行保存状态的功能实现。 如果需要一个完整的示例代码,可以参考以下示例:

    package main
    import (
    	"encoding/json"
    	"github.com/hyperledger/fabric/core/chaincode/shim"
    	"github.com/hyperledger/fabric/protos/peer"
    )
    type DataFile struct {
    	FileName   string `json:"FileName"`
    	ID         string `json:"ID"`
    	IPAdress   string `json:"IPAdress"`
    	OrgName    string `json:"OrgName"`
    	ModifyTime string `json:"ModifyTime"`
    }
    type DataChaincode struct{}
    func (t *DataChaincode) addFile(stub shim.ChaincodeStubInterface, args []string) peer.Response {
    	if len(args) != 2 {
    		return shim.Error("给定的参数个数不符合要求")
    	}
    	var file DataFile
    	err := json.Unmarshal([]byte(args[0]), &file)
    	if err != nil {
    		return shim.Error("反序列化信息时发生错误")
    	}
    	_, exist := GetFileInfo(stub, file.FileName)
    	if exist {
    		return shim.Error("要添加的文件名已存在")
    	}
    	_, bl := PutFile(stub, file)
    	if !bl {
    		return shim.Error("保存信息时发生错误")
    	}
    	err = stub.SetEvent(args[1], []byte{})
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	return shim.Success([]byte("信息添加成功"))
    }
    func PutFile(stub shim.ChaincodeStubInterface, file DataFile) ([]byte, bool) {
    	f, err := json.Marshal(file)
    	if err != nil {
    		return nil, false
    	}
    	err = stub.PutState(file.FileName, f)
    	if err != nil {
    		return nil, false
    	}
    	return f, true
    }
    func GetFileInfo(stub shim.ChaincodeStubInterface, filename string) (DataFile, bool) {
    	var file DataFile
    	f, err := stub.GetState(filename)
    	if err != nil {
    		return file, false
    	}
    	if f == nil {
    		return file, false
    	}
    	err = json.Unmarshal(f, &file)
    	if err != nil {
    		return file, false
    	}
    	return file, true
    }
    func (t *DataChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response {
    	return shim.Success(nil)
    }
    func (t *DataChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
    	function, args := stub.GetFunctionAndParameters()
    	switch function {
    	case "addFile":
    		return t.addFile(stub, args)
    	default:
    		return shim.Error("Invalid function name")
    	}
    }
    func main() {
    	err := shim.Start(new(DataChaincode))
    	if err != nil {
    		panic(err)
    	}
    }
    

    在以上示例代码中,定义了一个简单的Fabric智能合约(DataChaincode),包含了addFile方法用于添加文件信息,并实现了PutFile和GetFileInfo方法用于状态的保存和查询。可以根据需要进行调整和扩展。

    评论

报告相同问题?