Hyperledger

본문 바로가기
사이트 내 전체검색


Hyperledger
Hyperledger

10. 체인코드 만들기 2

페이지 정보

작성자 관리자 댓글 2건 조회 5,566회 작성일 19-11-27 09:33

본문

10. 체인코드 만들기 2

펫시팅 체인코드(PS.go)는 사용자의 정보, 집과 펫에 대한 자산을 등록하여 펫시터와 이용자 사이에 오가는 거래를 하나의 블록체인 내에서 관리하기 위한 코드입니다.

체인 코드는 다음과 같은 기능을 제공합니다.

 

chaincode - invoke


1.user_insert:처음 유저를 등록하는 기능이며 userID, password만을 받아서 블록에 저장합니다.
2.user_change:유저의 password와 펫시팅 여부를 변경하여주는 기능을 합니다.
3.home_insert:집을 등록하는 기능이며 args로 집에 대한 정보를 입력받으며 user의 citycode를 업데이트합니다.

4.home_change:집은 insert와 delete가 있으므로 변경은 필요하지 않다고 생각합니다.
5.home_delete:유저가 소유하고 있는 집에 대한 정보를 지워줍니다.
6.pet_insert:펫을 등록하는 기능이며 펫에 대한 정보를 저장함과 동시에 user의 정보에 펫의 수를 업데이트합니다.

7.pet_change:유저가 소유한 펫에 대한 사이즈, 중성화수술 여부, 백신 여부를 변경하는 기능을 합니다.
8.pet_delete:유저가 소유하고 있는 펫에 대한 정보를 지워줍니다.
9.trade_insert:펫시터와 고객간의 거래 정보를 블록에 저장하는 기능을 합니다.


chaincode - query


1.user_read:유저의 현재 상태를 조회합니다.
2.home_read:유저의 집에 대한 자산정보를 조회합니다.
3.pet_read:유저의 펫에 대한 자산정보를 조회합니다.
4.city_search:입력한 지역에 펫시팅 여부가 1인 유저들의 ID를 조회합니다.
5.trade_search:펫시터와 고객간의 거래 정보를 조회합니다.

 

 

개발자 모드에서 테스트 한다.

체인코드 작성

 

root@client:~# cd gopath/src/
root@client:~/gopath/src# mkdir PS
root@client:~/gopath/src# cd PS/
root@client:~/gopath/src/PS# vi PS.go 

 

 

package main

import (
     "encoding/json"
     "fmt"
     "github.com/hyperledger/fabric/core/chaincode/shim"
     pb "github.com/hyperledger/fabric/protos/peer"
)

type PS struct { // Petsitting chaincode
}

type UserInfo struct { // User information (KEY: User email)
     NM string // User Name
     PW string // User Password
     PN string // Pet number
     CC string // City code
     AP string // Companion animal

}

// Main
func main() {
     err := shim.Start(new(PS))
     if err != nil {
          fmt.Printf("Error starting PS chaincode: %s", err)
     }
}

// Init - reset all the things
func (t *PS) Init(stub shim.ChaincodeStubInterface) pb.Response {
     fmt.Println("PS Init")
     _, args := stub.GetFunctionAndParameters()
     var err error

     if len(args) != 0 {
          return shim.Error("[INIT] Incorrect number of arguments. Expecting 0")
     }

     if err != nil {
          return shim.Error(err.Error())
     }
     return shim.Success(nil)
}

// Invoke - Our entry point for Invocations
func (t *PS) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
   
     function, args := stub.GetFunctionAndParameters()

     fmt.Println("[INVOKE] invoke is running: " + function)

     if function == "user_insert" {
          return t.UInsert(stub, args)
     } else if function == "user_change" {
          return t.UChange(stub, args)
     } else if function == "user_read" { // query
          return t.URead(stub, args)
     }

     return shim.Error("[INVOKE] Received unknown function invocation: " + function)
}

// UInsert - insert user information
func (t *PS) UInsert(stub shim.ChaincodeStubInterface, args []string) pb.Response {

     var err error
     if len(args) != 3 {
          return shim.Error("[USER INSERT] Incorrect number of arguments. Expecting 3")
     }


     conf, err := stub.GetState(args[0])
     if err != nil {
          return shim.Error("Failed to get state")
     }

     if conf != nil {
          return shim.Error("[USER INSERT] Already exist user")
     }
     userID := args[0]
     userName := args[1]
     pw := args[2]

     userInfo := UserInfo{}
     userInfo.NM = userName
     userInfo.PW = pw
     userInfo.PN = "0"
     userInfo.CC = "0"
     userInfo.AP = "0"

     jsonAsBytes, _ := json.Marshal(userInfo) // struct to bytes
     fmt.Println(jsonAsBytes)

     err = stub.PutState(userID, jsonAsBytes)
     if err != nil {
          return shim.Error(err.Error())
     }

     return shim.Success(nil)
}

// UChange - change user information (NM, PW)
func (t *PS) UChange(stub shim.ChaincodeStubInterface, args []string) pb.Response {

     var err error
     if len(args) != 3 {
          return shim.Error("[USER CHANGE] Incorrect number of arguments. Expecting 3")
     }
     confUser, err := stub.GetState(args[0])
     if err != nil {
          return shim.Error("[USER CHANGE] Failed to get state")
     }

     if confUser == nil {
          return shim.Error("[USER CHANGE] Not exist userID")
     }
     userInfo := UserInfo{}
     json.Unmarshal(confUser, &userInfo)

     var nm, pw string
     userID := args[0]
     nm = args[1]
     pw = args[2]
     userInfo.NM = nm
     userInfo.PW = pw

     jsonAsBytesU, _ := json.Marshal(userInfo)
     stub.PutState(userID, jsonAsBytesU)
     return shim.Success(nil)
}

// URead - read user information
func (t *PS) URead(stub shim.ChaincodeStubInterface, args []string) pb.Response {

     var err error
     if len(args) != 1 {
          return shim.Error("[USER QUERY] Incorrect number of arguments. Expecting 1")
     }


     key := args[0]
     valAsbytes, err := stub.GetState(key) //get the user information from chaincode state
     if err != nil {
          return shim.Error("[USER QUERY] Failed to get state")
     }

     if valAsbytes == nil {
          jsonResp := "{\"Error\":\"Nil user information for " + key + "\"}"
          return shim.Error(jsonResp)
     }
     fmt.Println(valAsbytes)

     userInfo := UserInfo{}
     json.Unmarshal(valAsbytes, &userInfo)     // jsonbytes to struct
     fmt.Printf("Userinfo:%s\n", userInfo)

     return shim.Success(valAsbytes)
} 

 


# cd ~/gopath/src/PS

# vi PS.go


 

터미널 1에서


# cd ~/hyperledger/fabric-samples/chaincode-docker-devmode/

​# vi docker-compose-simple.yaml

아래부분에 Volumes에 추가한다.​

​version: '2'

services:
  orderer:
    container_name: orderer
    image: hyperledger/fabric-orderer:1.4.4
    environment:
      - FABRIC_LOGGING_SPEC=debug
      - ORDERER_GENERAL_LISTENADDRESS=orderer
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=orderer.block
      - ORDERER_GENERAL_LOCALMSPID=DEFAULT
      - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/msp
      - GRPC_TRACE=all=true,
      - GRPC_VERBOSITY=debug
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
      - ./msp:/etc/hyperledger/msp
      - ./orderer.block:/etc/hyperledger/fabric/orderer.block
    ports:
      - 7050:7050
  peer:
    container_name: peer
    image: hyperledger/fabric-peer:1.4.4
    environment:
      - CORE_PEER_ID=peer
      - CORE_PEER_ADDRESS=peer:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer:7051
      - CORE_PEER_LOCALMSPID=DEFAULT
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - FABRIC_LOGGING_SPEC=DEBUG
      - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp
    volumes:
        - /var/run/:/host/var/run/
        - ./msp:/etc/hyperledger/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start --peer-chaincodedev=true
    ports:
      - 7051:7051
      - 7053:7053
    depends_on:
      - orderer

 

  cli:
    container_name: cli
    image: hyperledger/fabric-tools:1.4.4
    tty: true
    environment:
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - FABRIC_LOGGING_SPEC=DEBUG
      - CORE_PEER_ID=cli
      - CORE_PEER_ADDRESS=peer:7051
      - CORE_PEER_LOCALMSPID=DEFAULT
      - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp
    working_dir: /opt/gopath/src/chaincodedev
    command: /bin/bash -c './script.sh'
    volumes:
        - /var/run/:/host/var/run/
        - ./msp:/etc/hyperledger/msp
        - ./../chaincode:/opt/gopath/src/chaincodedev/chaincode
        - /root/gopath/src/PS:/opt/gopath/src/PS
        - ./:/opt/gopath/src/chaincodedev/
    depends_on:
      - orderer
      - peer

  chaincode:
    container_name: chaincode
    image: hyperledger/fabric-ccenv:1.4.4
    tty: true
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - FABRIC_LOGGING_SPEC=DEBUG
      - CORE_PEER_ID=abstore
      - CORE_PEER_ADDRESS=peer:7051
      - CORE_PEER_LOCALMSPID=DEFAULT
      - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp
    working_dir: /opt/gopath/src/chaincode
    command: /bin/sh -c 'sleep 6000000'
    volumes:
        - /var/run/:/host/var/run/
        - ./msp:/etc/hyperledger/msp

        - /root/gopath/src/PS:/opt/gopath/src/PS
        - ./../chaincode:/opt/gopath/src/chaincode
    depends_on:
      - orderer
      - peer

​# docker-compose -f docker-compose-simple.yaml up


 

터미널 2에서

# cd ~/hyperledger/fabric-samples/chaincode-docker-devmode/


# docker exec -it chaincode bash 


# cd ../PS

# go build

# CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./PS
 


터미널3에서


 

# cd ~/hyperledger/fabric-samples/chaincode-docker-devmode/

# docker exec -it cli bash

# peer chaincode install -p PS -n mycc -v 0 


# peer chaincode instantiate -n mycc -v 0 -c '{"Args":["init"]}' -C myc

# peer chaincode invoke -n mycc -c '{"Args":["user_insert","userID","userName","password"]}' -C myc 

# peer chaincode query -n mycc -c '{"Args":["user_read","userID"]}' -C myc
{"NM":"userName", "PW":"password","PN":"0","CC":"0","AP":"0"} 

 


root@87f714f9e259:/opt/gopath/src/chaincodedev# peer chaincode install -p PS -n  mycc -v 0 

root@87f714f9e259:/opt/gopath/src/chaincodedev# peer chaincode instantiate -n mycc -v 0 -c '{"Args":["init"]}' -C myc

root@87f714f9e259:/opt/gopath/src/chaincodedev# peer chaincode invoke -n mycc -c  '{"Args":["user_insert","admin","LeeJinKwan","1234"]}' -C myc

root@87f714f9e259:/opt/gopath/src/chaincodedev# peer chaincode query -n mycc -c  '{"Args":["user_read","admin"]}' -C myc 

{"NM":"LeeJinKwan","PW":"1234","PN":"0","CC":"0","AP":"0"} 

 

터미널 2에서 로그를 확인하면

PS Init
[INVOKE] invoke is running: user_insert
[123 34 78 77 34 58 34 76 101 101 74 105 110 75 119 97 110 34 44 34 80 87 34 58 34 49 50 51 52 34 44 34 80 78 34 58 34 48 34 44 34 67 67 34 58 34 48 34 44 34 65 80 34 58 34 48 34 125]
[INVOKE] invoke is running: user_read
[123 34 78 77 34 58 34 76 101 101 74 105 110 75 119 97 110 34 44 34 80 87 34 58 34 49 50 51 52 34 44 34 80 78 34 58 34 48 34 44 34 67 67 34 58 34 48 34 44 34 65 80 34 58 34 48 34 125]
Userinfo:{LeeJinKwan 1234 0 0 0}

 

 

첨부파일

  • PS.go (3.7K) 32회 다운로드 | DATE : 2019-11-27 10:46:59

댓글목록

관리자님의 댓글

관리자 작성일

root@client:~/gopath/src# cd PS/
root@client:~/gopath/src/PS# ls

root@client:~/gopath/src/PS# cp /home/leejinkwan/PS.go ./
root@client:~/gopath/src/PS# ls
PS.go
root@client:~/gopath/src/PS#

관리자님의 댓글

관리자 작성일

터미널 1에서
root@client:~/hyperledger/fabric-samples/chaincode-docker-devmode# docker-compose -f docker-compose-simple.yaml down
Removing chaincode ... done
Removing cli      ... done
Removing peer      ... done
Removing orderer  ... done
Removing network chaincode-docker-devmode_default
root@client:~/hyperledger/fabric-samples/chaincode-docker-devmode#


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.