联盟链Fabric实现牛奶溯源源代码
时间: 2023-08-15 18:19:09 浏览: 50
以下是一个简单的联盟链Fabric实现牛奶溯源的智能合约示例代码:
```
package main
import (
"encoding/json"
"fmt"
"github.com/hyperledger/fabric/core/chaincode/shim"
pb "github.com/hyperledger/fabric/protos/peer"
)
type Milk struct {
Producer string `json:"producer"`
CollectionDate string `json:"collection_date"`
CollectionLocation string `json:"collection_location"`
ProcessingDate string `json:"processing_date"`
ProcessingLocation string `json:"processing_location"`
DistributionDate string `json:"distribution_date"`
DistributionLocation string `json:"distribution_location"`
Retailer string `json:"retailer"`
}
type MilkTraceabilityChaincode struct {
}
func (t *MilkTraceabilityChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {
return shim.Success(nil)
}
func (t *MilkTraceabilityChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
function, args := stub.GetFunctionAndParameters()
if function == "recordMilk" {
return t.recordMilk(stub, args)
} else if function == "getMilk" {
return t.getMilk(stub, args)
}
return shim.Error("Invalid function name.")
}
func (t *MilkTraceabilityChaincode) recordMilk(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) != 8 {
return shim.Error("Incorrect number of arguments. Expecting 8")
}
milk := Milk{
Producer: args[0],
CollectionDate: args[1],
CollectionLocation: args[2],
ProcessingDate: args[3],
ProcessingLocation: args[4],
DistributionDate: args[5],
DistributionLocation: args[6],
Retailer: args[7],
}
milkAsBytes, err := json.Marshal(milk)
if err != nil {
return shim.Error(err.Error())
}
err = stub.PutState(args[0], milkAsBytes)
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(nil)
}
func (t *MilkTraceabilityChaincode) getMilk(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) != 1 {
return shim.Error("Incorrect number of arguments. Expecting 1")
}
milkAsBytes, err := stub.GetState(args[0])
if err != nil {
return shim.Error(err.Error())
}
return shim.Success(milkAsBytes)
}
func main() {
err := shim.Start(new(MilkTraceabilityChaincode))
if err != nil {
fmt.Printf("Error starting MilkTraceabilityChaincode chaincode: %s", err)
}
}
```
该智能合约使用了一个名为`Milk`的结构体来表示牛奶的信息。`recordMilk`函数用于记录牛奶的信息,并将其保存在区块链上,`getMilk`函数用于查询已记录的牛奶信息。
您可以使用Hyperledger Fabric的命令行工具或SDK来部署和调用此智能合约。