1. 程式人生 > >Fabric鏈碼實戰(二)公民身份資訊

Fabric鏈碼實戰(二)公民身份資訊


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"]}'