超級賬本hyperledger fabric第十一集:公民身份資訊相關鏈碼
阿新 • • 發佈:2018-12-20
- 編寫citizens下的程式碼,編寫好後,拖到對應linux目錄
package main import ( "github.com/hyperledger/fabric/core/chaincode/shim" pb "github.com/hyperledger/fabric/protos/peer" "log" "encoding/json" ) //個人基本資訊 type People struct { //區分資料型別 DataType string `json:"dataType"` //身份證號碼 Id string `json:"id"` //性別 Sex string `json:"sex"` //姓名 Name string `json:"name"` //出生地 BrithLocation Location `json:"birthLocation"` //現居住地 LiveLocation Location `json:"liveLocation"` //母親身份證號 MotherId string `json:"montherID"` //父親身份證號 FatherId string `json:"fatherID"` } //位置 type Location struct { //國家 Country string `json:"country"` //省 Province string `json:"province"` //城市 City string `json:"city"` //鎮 Town string `json:"town"` //詳細地址 Detail string `json:"detail"` } //公民鏈 type CitizensChain struct { } //初始化方法 func (c *CitizensChain) Init(stub shim.ChaincodeStubInterface) pb.Response { function, _ := stub.GetFunctionAndParameters() if function != "init" { return shim.Error("方法名錯誤") } log.Println("初始化成功") return shim.Success(nil) } //鏈碼互動入口 func (c *CitizensChain) Invoke(stub shim.ChaincodeStubInterface) pb.Response { //接收引數判斷 function, args := stub.GetFunctionAndParameters() //判斷 if function == "register" { //錄入公民資訊 return c.register(stub, args) } else if function == "query" { //查詢公民資訊 return c.query(stub, args) } else { return shim.Error("無效的方法名") } return shim.Success(nil) } //錄入公民資訊 //-c Args[register,身份證號,json] //引數1:身份證號,是儲存的key //引數2:個人資訊,當成value取儲存 func (c *CitizensChain) register(stub shim.ChaincodeStubInterface, args []string) pb.Response { //判斷引數個數 if len(args) != 2 { return shim.Error("引數錯誤") } //接收身份證號 key := args[0] //接收公民資訊(json) value := args[1] perple := People{} //轉換 err := json.Unmarshal([]byte(value), &perple) if err != nil { return shim.Error("註冊失敗,引數無法解析") } //更新世界狀態 stub.PutState(key, []byte(value)) return shim.Success(nil) } //查詢公民資訊 func (c *CitizensChain) query(stub shim.ChaincodeStubInterface, args []string) pb.Response { if len(args) < 1 { return shim.Error("引數錯誤") } //接收查詢的key key := args[0] //去世界狀態中查資料 result, err := stub.GetState(key) if err != nil { return shim.Error("查詢失敗") } return shim.Success(result) } func main() { err := shim.Start(new(CitizensChain)) if err != nil { log.Println(err) } }
- 安裝鏈碼
peer chaincode install -n citizens -v 1.0.0 -l golang -p github.com/chaincode/citizens
- 鏈碼例項化
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n citizens -l golang -v 1.0.0 -c '{"Args":["init"]}'
- 身份錄入
peer chaincode invoke -C mychannel -n citizens -c '{"Args":["register","110229","{\"dataType\":\"citizens\",\"id\":\"110229\",\"sex\":\"man\",\"name\":\"zhangsan\"}"]}'
- 身份查詢
peer chaincode query -C mychannel -n citizens -c '{"Args":["query","110229"]}'