Go 언어

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


Go 언어
Go 언어

1. chaincode example02

페이지 정보

작성자 관리자 댓글 0건 조회 2,838회 작성일 19-03-11 11:18

본문

1. chaincode example02

$ vi examples/chaincode/go/example02/chaincode.go


/*
Copyright IBM Corp. All Rights Reserved.

SPDX-License-Identifier: Apache-2.0
*/

package example02

import (

 "fmt"
 "strconv"

 "github.com/hyperledger/fabric/core/chaincode/shim"
 pb "github.com/hyperledger/fabric/protos/peer"

)

// SimpleChaincode example simple Chaincode implementation
type SimpleChaincode struct {
}

func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {

 fmt.Println("ex02 Init")
 _, args := stub.GetFunctionAndParameters()
 var A, B string    // Entities
 var Aval, Bval int // Asset holdings
 var err error

 if len(args) != 4 {

  return shim.Error("Incorrect number of arguments. Expecting 4")

 }

 // Initialize the chaincode
 A = args[0]
 Aval, err = strconv.Atoi(args[1])
 if err != nil {

  return shim.Error("Expecting integer value for asset holding")

 }
 B = args[2]
 Bval, err = strconv.Atoi(args[3])
 if err != nil {

  return shim.Error("Expecting integer value for asset holding")

 }
 fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)

 // Write the state to the ledger
 err = stub.PutState(A, []byte(strconv.Itoa(Aval)))
 if err != nil {

  return shim.Error(err.Error())

 }

 err = stub.PutState(B, []byte(strconv.Itoa(Bval)))
 if err != nil {

  return shim.Error(err.Error())

 }

 return shim.Success(nil)

}

func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {

 fmt.Println("ex02 Invoke")
 function, args := stub.GetFunctionAndParameters()
 if function == "invoke" {

  // Make payment of X units from A to B
  return t.invoke(stub, args)

 } else if function == "delete" {

  // Deletes an entity from its state
  return t.delete(stub, args)

 } else if function == "query" {

  // the old "Query" is now implemtned in invoke
  return t.query(stub, args)

 }

 return shim.Error("Invalid invoke function name. Expecting \"invoke\" \"delete\" \"query\"")


}

// Transaction makes payment of X units from A to B
func (t *SimpleChaincode) invoke(stub shim.ChaincodeStubInterface, args []string) pb.Response {


 var A, B string    // Entities
 var Aval, Bval int // Asset holdings
 var X int          // Transaction value
 var err error

 if len(args) != 3 {

  return shim.Error("Incorrect number of arguments. Expecting 3")

 }

 A = args[0]
 B = args[1]

 // Get the state from the ledger
 // TODO: will be nice to have a GetAllState call to ledger
 Avalbytes, err := stub.GetState(A)
 if err != nil {

  return shim.Error("Failed to get state")

 }
 if Avalbytes == nil {

  return shim.Error("Entity not found")

 }
 Aval, _ = strconv.Atoi(string(Avalbytes))

 Bvalbytes, err := stub.GetState(B)
 if err != nil {

  return shim.Error("Failed to get state")

 }
 if Bvalbytes == nil {

  return shim.Error("Entity not found")

 }
 Bval, _ = strconv.Atoi(string(Bvalbytes))

 // Perform the execution
 X, err = strconv.Atoi(args[2])
 if err != nil {

  return shim.Error("Invalid transaction amount, expecting a integer value")

 }
 Aval = Aval - X
 Bval = Bval + X
 fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)

 // Write the state back to the ledger
 err = stub.PutState(A, []byte(strconv.Itoa(Aval)))
 if err != nil {

  return shim.Error(err.Error())

 }

 err = stub.PutState(B, []byte(strconv.Itoa(Bval)))
 if err != nil {

  return shim.Error(err.Error())

 }

 return shim.Success(nil)


}

// Deletes an entity from state
func (t *SimpleChaincode) delete(stub shim.ChaincodeStubInterface, args []string) pb.Response {


 if len(args) != 1 {

  return shim.Error("Incorrect number of arguments. Expecting 1")

 }

 A := args[0]

 // Delete the key from the state in ledger
 err := stub.DelState(A)
 if err != nil {

  return shim.Error("Failed to delete state")

 }

 return shim.Success(nil)


}

// query callback representing the query of a chaincode
func (t *SimpleChaincode) query(stub shim.ChaincodeStubInterface, args []string) pb.Response {

 var A string // Entities
 var err error

 if len(args) != 1 {

  return shim.Error("Incorrect number of arguments. Expecting name of the person to query")

 }

 A = args[0]

 // Get the state from the ledger
 Avalbytes, err := stub.GetState(A)
 if err != nil {

  jsonResp := "{\"Error\":\"Failed to get state for " + A + "\"}"
  return shim.Error(jsonResp)

 }


 if Avalbytes == nil {

  jsonResp := "{\"Error\":\"Nil amount for " + A + "\"}"
  return shim.Error(jsonResp)

 }

 jsonResp := "{\"Name\":\"" + A + "\",\"Amount\":\"" + string(Avalbytes) + "\"}"
 fmt.Printf("Query Response:%s\n", jsonResp)
 return shim.Success(Avalbytes)


}
 

$ vi examples/chaincode/go/example02/chaincode_test.go


/*
Copyright IBM Corp. All Rights Reserved.

SPDX-License-Identifier: Apache-2.0
*/

package example02

import (

 "fmt"
 "testing"

 "github.com/hyperledger/fabric/core/chaincode/shim"

)

func checkInit(t *testing.T, stub *shim.MockStub, args [][]byte) {

 res := stub.MockInit("1", args)
 if res.Status != shim.OK {

  fmt.Println("Init failed", string(res.Message))
  t.FailNow()

 }

}

func checkState(t *testing.T, stub *shim.MockStub, name string, value string) {

 bytes := stub.State[name]
 if bytes == nil {

  fmt.Println("State", name, "failed to get value")
  t.FailNow()

 }
 if string(bytes) != value {

  fmt.Println("State value", name, "was not", value, "as expected")
  t.FailNow()

 }

}

func checkQuery(t *testing.T, stub *shim.MockStub, name string, value string) {

 res := stub.MockInvoke("1", [][]byte{[]byte("query"), []byte(name)})
 if res.Status != shim.OK {

  fmt.Println("Query", name, "failed", string(res.Message))
  t.FailNow()

 }
 if res.Payload == nil {

  fmt.Println("Query", name, "failed to get value")
  t.FailNow()

 }
 if string(res.Payload) != value {

  fmt.Println("Query value", name, "was not", value, "as expected")
  t.FailNow()

 }

}

func checkInvoke(t *testing.T, stub *shim.MockStub, args [][]byte) {

 res := stub.MockInvoke("1", args)
 if res.Status != shim.OK {

  fmt.Println("Invoke", args, "failed", string(res.Message))
  t.FailNow()

 }

}

func TestExample02_Init(t *testing.T) {

 scc := new(SimpleChaincode)
 stub := shim.NewMockStub("ex02", scc)

 // Init A=123 B=234
 checkInit(t, stub, [][]byte{[]byte("init"), []byte("A"), []byte("123"), []byte("B"), []byte("234")})

 checkState(t, stub, "A", "123")
 checkState(t, stub, "B", "234")

}

func TestExample02_Query(t *testing.T) {

 scc := new(SimpleChaincode)
 stub := shim.NewMockStub("ex02", scc)

 // Init A=345 B=456
 checkInit(t, stub, [][]byte{[]byte("init"), []byte("A"), []byte("345"), []byte("B"), []byte("456")})

 // Query A
 checkQuery(t, stub, "A", "345")

 // Query B
 checkQuery(t, stub, "B", "456")

}

func TestExample02_Invoke(t *testing.T) {

 scc := new(SimpleChaincode)
 stub := shim.NewMockStub("ex02", scc)

 // Init A=567 B=678
 checkInit(t, stub, [][]byte{[]byte("init"), []byte("A"), []byte("567"), []byte("B"), []byte("678")})

 // Invoke A->B for 123
 checkInvoke(t, stub, [][]byte{[]byte("invoke"), []byte("A"), []byte("B"), []byte("123")})
 checkQuery(t, stub, "A", "444")
 checkQuery(t, stub, "B", "801")

 // Invoke B->A for 234
 checkInvoke(t, stub, [][]byte{[]byte("invoke"), []byte("B"), []byte("A"), []byte("234")})
 checkQuery(t, stub, "A", "678")
 checkQuery(t, stub, "B", "567")
 checkQuery(t, stub, "A", "678")
 checkQuery(t, stub, "B", "567")

}



댓글목록

등록된 댓글이 없습니다.


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

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

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