어플리케이션개발, 비용과 시간을 절약할 수 있는 유일한 해법
페이지 정보
본문
안녕하세요,누구나 어플리케이션개발 쉽게 시작하는 클라우드HyperLedger Fabric 이란?컨소시엄형 블록체인과 퍼블릭형 블록체인의 차이점NAVER Cloud Platform에서 제공 중인 Blockchain Service은 HyperLedger Fabric을 기반으로 하고 있습니다. HyperLedger Fabric은 대표적인 컨소시엄형 블록체인으로 승인된 특정 기업이나 조직만이 블록체인 네트워크에 참여할 수 있습니다.이에 반해 퍼블릭형 블록체인으로 널리알려진 비트코인과 이더리움 블록체인은 불특정 다수가 참여할 수 있어 거래 검증에 막대한 연산이 요구되며, 이에 따라 트랜잭션 처리 속도가 빠르지 못한편이며 거래 검증을 위한 인센티브(코인에서 채굴보상) 등이 필요합니다.공동 사업체에 참가하는 기업이나 조직들이 블록체인 네트워크를 운영한다고 할때, 불특정 다수가 아닌 신뢰할 수 있는 신원이 참여한 네트워크 내의 거래 방식과 빠른 트랜잭션 처리 속도가 요구됩니다. 이를 위해서 컨소시엄형 블록체인을 구성하여 이와 같은 요구사항에 대응할 수 있습니다.구분퍼블릭컨소시엄관리 주체없음복수의 기업이나 조직참여 방식자유허가합의 방식PoW(Proof of Work)등Raft와 같은 분산 합의 알고리즘트랜잭션 속도느림빠름이번 포스팅의 내용은 HyperLedger Fabric을 처음 접하시는 분들을 대상으로 합니다. NAVER Cloud Platform Blockchain Service을 이용하여 구축된 HyperLedger Fabric 네트워크를 이용하는 체인 코드를 개발하여 스마트 컨트랙트를 실행하는 과정을 중점적으로 다루어 보겠습니다.Hyperledger Fabric 어플리케이션 개발체인코드 개발 및 스마트 컨트랙트 실행 과정1. 서비스 시나리오상품 판매 서비스를 운영하는 회사에 재직중인 김블록씨는 사전에 협의된 여러 회사와 함께 상호 공동 장부를 운영하면서 거래 데이터를 공유하는 플랫폼을 기획하게 되었습니다. 이와 같은 요구 사항 충족을 위해 Hyperledger Fabric 네트워크를 구성하고, 이를 위한 어플리케이션을 개발하기로 하였습니다.모델은 사용자를 나타내는 Wallet과 상품을 어플리케이션개발 나타내는 Goods로 구분됩니다. 각 Goods들은 고유한 상품의 key를 가지고 있으며, 가격을 나타내는 price와 소유자를 나타내는 walletId가 있습니다. 상기 그림의 시나리오를 통해 해당 모델과 purchaseGoods의 메서드 동작을 살펴보면 다음과 같습니다. “1Q2W3E4R” 아이디의 사용자가 “GS0”의 상품을 구매한 경우 해당 사용자의 token에서 상품 가격만큼 줄어 들고 소유자가 변경됩니다. 추가적으로 해당 상품의 원 소유주는 상품 가격만큼 wallet내 token이 증가합니다.2. 체인 코드 작성채널 내 invoke 및 query하기 위한 주요 기능을 다음의 세부 절에 정의하였습니다.2.1 작성 환경다음의 환경에서 Hyperledger fabric 어플리케이션이 작성되었습니다.2.2 Modelswallet: 상품 거래의 사용자 정보를 의미합니다.id: 사용자 아이디name: 사용자 이름token: 물건 거래에 사용되는 소지 금액goods: 상품 거래시 사용되는 상품 정보를 의미합니다.category: 상품의 카테고리key: 상품구분에 사용되는 키name: 상품 이름price: 상품 금액walletId: 상품을 소지한 사용자의 아이디2.3 MethodsinitWallet: 테스트에 사용할 사용자 정보를 등록합니다.getAllGoods: 등록된 모든 상품을 조회하기 위해서 사용합니다.purchaseGoods: 상품 구매를 위해 사용됩니다.setGoods: 상품 등록에 사용됩니다.getWallet: 사용자 정보를 획득하는데 사용됩니다.2.4 체인 코드 구현이번 절에서는 앞서 Models과 Methods 절에서 설명했던 내용을 구체적으로 구현해보는 내용을 설명합니다. 예제의 체인 코드는 fabric-contract-api를 기반으로 작성되었습니다.mainmain문의 code snippet에는 참고를 위해 package와 import 부분도 포함하였습니다.체인 코드시 package 이름은 main으로 작성하여야하며, 다른 이름으로 작성 시 체인 코드 설치가 동작하지 않을 수 있습니다.InitWalletinitWallet에서 체인 코드 테스트에 이용할 사용자를 등록합니다.customer와 seller 인스턴스를 json.Marshal 메서드를 이용하여 바이트 슬라이스로 변환하고, 이를 PutState()를 이용하여 어플리케이션개발 상태 DB에 저장합니다. key값은 Wallet의 ID로 지정합니다. 이와 같이 Key-Value형태로 데이터를 상태 DB에 저장할 수 있습니다.GetWalletInitWallet 메서드에서 등록한 사용자 정보를 조회합니다.Wallet내 ID를 입력받아, 이를 키로 이용하여 GetState()를 호출하면 해당 키에 해당하는 Value를 바이트 슬라이스로 반환합니다.이를 json.Unmarshal을 이용하여 언마샬링하여 메서드의 반환값으로 사용합니다.SetGoodssetGoods 메서드로 name, category, price, walletId을 입력받아 새로운 상품을 등록합니다.generateKey()는 등록될 goods에 대한 key값을 생성하는 메서드입니다. key는 고유한 값으로 중복되지 않으며, 상품이 등록될때마다, “lastestKey”에 가장 최근에 등록된 key를 가져와 idx의 숫자를 하나 올려 반환합니다.뒷장에서 기술할 go sdk를 통한 체인 코드 메서드 호출에서 sdk는 argument에 대한 타입으로 string만 지원하기 때문에, price의 경우 string타입으로 입력받고 atoi()함수로 형변환하였음을 확인합니다.goods를 앞서 generateKey()를 통해 획득한 값을 key값으로 하여 PutState()를 호출하여 상태 DB에 저장합니다.이후 추가될 상품의 key가 중복되지 않도록 하기 위해서, “latestkey”에 현재 생성된 키 값을 저장합니다.GetAllGoodsGetAllGoods 메서드를 이용하여 등록된 모든 상품을 조회합니다.GetStateByRange()를 호출하여 입력한 key 범위내의 모든 값들을 가져올 수 있습니다. 앞서 상품의 key값은 중복되지 않으며, 상품이 등록될때마다 “lastestKey”에 등록된 idx를 하나씩 올려서 사용한다고 설명드렸습니다.이 구조를 이용하여 시작값과 마지막값을 도출하여 GetStateByRange()를 호출합니다. Interation 형태의 반환값을 for문을 이용하여 실행해, Goods 인스턴스로 언마샬링합니다.PurchaseGoodsPurchaseGoods 메서드에서 아래의 두 동작이 수행됩니다.구매자 정보인 wallet의 내용을 가져와 상품 가격만큼 token 차감goods의 소유자 정보인 walletId를 구매자 정보로 변경GetState(goodsKey)를 호출하여 상품 정보를 가져와 소유자의 walletId와 price을 획득합니다. 다음 어플리케이션개발 GetState(customerId)를 이용하여 구매자의 walletId와 token을 획득합니다.위 과정을 통해 상품을 구입하려는 customer와 seller의 정보 모두를 파악하였습니다. customer의 token을 price만큼 줄이고 seller의 token정보를 price만큼 늘려 상태 DB를 업데이트합니다.다음 goods의 소유자 정보인 walletId를 customerId로 변경하고 상태 DB를 업데이트하여 트랜잭션을 마무리합니다.3. 체인 코드 설치3.1 체인 코드를 cds파일로 패키징NAVER Cloud Platform Blockchain Service에 체인 코드를 인스톨하기 위해서는, 작성한 코드를 cds파일로 패키징하는 과정이 필요합니다.이번 절에서는 Docker와 fabric-tools 컨테이너를 이용하여 이를 수행하는 내용을 다룹니다.위 작성한 코드가 로컬 내 $GOPATH/src/blockchain-sample 디렉토리로 위치시키고 아래의 명령어를 실행합니다.
- 이전글물의 신비: 바다와 강의 아름다움 24.12.23
- 다음글우리의 가치와 신념: 삶의 지표 24.12.23
댓글목록
등록된 댓글이 없습니다.