Fabric鏈碼實戰(二)公民身份資訊
阿新 • • 發佈:2018-11-29
title: Fabric鏈碼實戰(二)公民身份資訊
tags: Hyperledger, fabric ,區塊鏈,chaincode
功能簡述
使用鏈碼可以新增和查詢公民資訊
功能實現
1.匯入包
package main
import (
"github.com/hyperledger/fabric/core/chaincode/shim"
pb "github.com/hyperledger/fabric/protos/peer"
"log"
"encoding/json"
)
2.定義結構體
定義公民資訊、國家資訊和智慧合約結構體
//個人基本資訊
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 {
}
3.實現基礎函式
設定Init、Invoke和main方法
//初始化方法
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)
}
func main() {
err := shim.Start(new(CitizensChain))
if err != nil {
log.Println(err)
}
}
4. 功能實現
定義資訊錄入和查詢操作
//錄入公民資訊
//-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)
}
測試鏈碼
鏈碼部署步驟和上一篇一樣這裡我不在敘述。
###鏈碼例項化###
peer chaincode instantiate -n mycc -v 0 -c '{"Args":["init"]}' -C myc
###身份錄入###
peer chaincode invoke -C mychannel -n mycc -c '{"Args":["register","110229","{\"dataType\":\"citizens\",\"id\":\"110229\",\"sex\":\"man\",\"name\":\"zhangsan\"}"]}'
###身份查詢###
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","110229"]}'