본문 바로가기
BlockChain/Hyperledger Fabric

[Hyperledger Fabric] Go chain code 기본 실행 예제

by 행운의나무 2024. 6. 21.
728x90
반응형

목표

  • fabric-samples 이용
  • go chain code 등록
  • 원장의 값 가져오기

실습

1. fabric-samples 설치

curl -sSL https://bit.ly/2ysbOFE | bash -s

2. 네트워크 실행

샘플코드 설치가 끝나면 fabric-samples/test-network 폴더로 이동합니다. 

cd fabric-samples/test-network

3. 채널 생성

- genesis block이 생성됩니다.

 ./network.sh createChannel

4. 원장 초기화

- 체인코드가 basic.tar.gz로 압축되고, 피어에 설치됩니다. (피어에서 체인코드는 압축파일로 설치진행함)

./network.sh deployCC -cci initLedger

- 체인코드 내용 확인
초기화 함수, 조회 함수

....
// InitLedger adds a base set of assets to the ledger
func (s *SmartContract) InitLedger(ctx contractapi.TransactionContextInterface) error {
	assets := []Asset{
		{ID: "asset1", Color: "blue", Size: 5, Owner: "Tomoko", AppraisedValue: 300},
		{ID: "asset2", Color: "red", Size: 5, Owner: "Brad", AppraisedValue: 400},
		{ID: "asset3", Color: "green", Size: 10, Owner: "Jin Soo", AppraisedValue: 500},
		{ID: "asset4", Color: "yellow", Size: 10, Owner: "Max", AppraisedValue: 600},
		{ID: "asset5", Color: "black", Size: 15, Owner: "Adriana", AppraisedValue: 700},
		{ID: "asset6", Color: "white", Size: 15, Owner: "Michel", AppraisedValue: 800},
	}

	for _, asset := range assets {
		assetJSON, err := json.Marshal(asset)
		if err != nil {
			return err
		}

		err = ctx.GetStub().PutState(asset.ID, assetJSON)
		if err != nil {
			return fmt.Errorf("failed to put to world state. %v", err)
		}
	}

	return nil
}
....
// GetAllAssets returns all assets found in world state
func (s *SmartContract) GetAllAssets(ctx contractapi.TransactionContextInterface) ([]*Asset, error) {
	// range query with empty string for startKey and endKey does an
	// open-ended query of all assets in the chaincode namespace.
	resultsIterator, err := ctx.GetStub().GetStateByRange("", "")
	if err != nil {
		return nil, err
	}
	defer resultsIterator.Close()

	var assets []*Asset
	for resultsIterator.HasNext() {
		queryResponse, err := resultsIterator.Next()
		if err != nil {
			return nil, err
		}

		var asset Asset
		err = json.Unmarshal(queryResponse.Value, &asset)
		if err != nil {
			return nil, err
		}
		assets = append(assets, &asset)
	}

	return assets, nil
}

5. 원장 조회

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

결과 화면

에러 해결

1. 원장 조회

 peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

=> ERRO [main] InitCmd -> Fatal error when initializing core config : error when reading core config file: Config File "core" Not Found in...

해결방법 : 환경설정 추가

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

쿠팡으로 연결 클릭

 

알리사 급속 냉각 에어컨 무선 휴대용선풍기 손선풍기 손풍기

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

반응형