Hyperledger Fabric Architecture: 5 트랜잭션과 gRPC

chaincode 작성의 최대 챌린지인 gRPC 뽀개기

Jiwon Yeom
Sep 9, 2018 · 7 min read

제일 처음에 Architecture 연재를 시작할 때 정했던 로드맵을 약간 수정하려고 합니다. 공부를 하면 할 수록 하고 싶은 이야기가 더 많아지네요. 수정된 로드맵은 여기에서 확인하실 수 있습니다.

얼마전에 blockchain 프로젝트 수행을 위한 회사 내부 교육을 이수했습니다. go-lang으로 chaincode를 실제로 개발하면서 가장 많이 부딪혔던 문제는, gRPC의 버전 문제와 gRPC 인터페이스 처리였습니다. 사실 gRPC 자체를 아예 잘 몰랐던 터라 어떻게 동작하는지 알기 어려워서 겪었던 문제였죠. 그래서 도대체 왜 Hyperledger Fabric은 HTTP 통신이 아니라 gRPC 통신을 하도록 설계한 걸까 궁금해지기 시작했습니다.

gRPC란 도대체 뭘까

A high performance, open-source universal RPC framework
— grpc.io

위 공식 사이트의 설명처럼, 고성능 RPC 프레임워크입니다. 구글의 마이크로서비스에 대한 노하우와 기술력이 한껏 녹아 있는 오픈소스 프레임워크입니다. 기존에 출시되어 있었던 Protocol Buffer (메시지 serializer)에 HTTP2 통신 방식을 입혀서 빠른 통신을 가능케 합니다.

개념에 대해 조금 더 짚어보죠. RPC란, Remote Procedure Call의 줄임말로 지금의 HTTP 기반 REST 통신과 경쟁(?) 관계에 있는 통신 방식이라고 생각하시면 됩니다. HTTP와는 다르게 RPC는 요청/응답 측의 인터페이스 규약을 정의해서 가지고 있고(skeleton, stub) 이를 기반으로 보다 정적인 통신을 하게 됩니다.

gRPC를 특별하게 하는 구성 기술 요소에 대해 더 자세히 살펴봅시다. Protocol Buffer는 데이터 통신이나 저장을 위해, 데이터를 구조화하고 정렬(serializing)하는 것입니다. 공식 홈페이지에서는 작고 빠르고 간단한 XML이라고 생각하면 된다고 이야기합니다.

HTTP/2는 어떨까요. 기본적으로 HTTP 통신은 커넥션 당 하나의 요청 밖에 처리하지 못합니다. 그래서 사실상 논리적으로 하나의 로직인데 여러번 통신이 비효율적으로 발생하는 문제가 있습니다. 게다가 느립니다. 이런 비효율적인 HTTP 통신 방식을 개선해보고자 나온 것이 HTTP/2 입니다. 여기서는 커넥션이 형성되면 스트리밍 형식으로 여러 데이터가 양방향으로 오가게 됩니다. 지나치게 비대했던 Header도 압축되었고, 클라이언트가 요청한 데이터의 종속성(ex: HTML과 CSS)을 파악하여 서버 측에서 딸린 자료들을 함께 푸시해버릴 수도 있습니다.

요약하자면, gRPC는 요청/응답 측이 강타입 protocol buffer 형식으로 HTTP/2 기반 스트리밍을 하게 하는 통신 프로토콜이라고 할 수 있습니다. 강타입이라는 표현은 그냥 제 마음대로 붙여 보았는데, Java 프로그래밍에서처럼 Interface 를 정의하고 이를 만족해야만 한다는 의미입니다.

Hyperledger Fabric에서 gRPC를 도입할 수 밖에 없었던 이유

위에서 살펴본 gRPC의 개념을 정확히 이해하셨다면, 그리고 비즈니스용 블록체인에 대한 개념이 잡히셨다면 왜 HLF가 gRPC를 채택했는지 느낌이 오실 겁니다. gRPC의 특징과 이게 HLF의 기술적 요건을 어떻게 충족시키는지 자세히 한 번 보시죠.

  1. Simple Service Definition
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
string greeting = 1;
}

message HelloResponse {
string reply = 1;
}
// 출처: https://grpc.io/docs/guides/concepts.html#service-definition

protocol buffer 방식으로 서비스 자체를 정의할 수 있다는 것은, 굉장한 장점입니다. 어떤 메시지를, 어떤 메서드를 통해서 누가 주고 받는지를 결정한다니 어마무시하죠. 특히 많은 노드가 많은 종류의 응답/요청을 주고 받아야 하는 HLF에서는 말할 수 없이 매력적인 지점이죠.

2. Bi-directional Streaming and Integrated Auth

SSL, TLS 기반 인증 당연히 지원합니다. 중요한 점은 양방향 통신이라는 겁니다. 현 시점(2018년 9월) 블록체인 기술에서 가장 중요한 이슈는 성능 문제입니다. 전체 네트워크 내에서 invoke된 트랜잭션을 합의하여, committing peer에 배포하고, 각 채널의 anchor peer에서 받아서 동기화시키고, 채널 안에서의 통신이 일어나고 등등 이 다양하고 양방향으로 일어나는 복잡한 일들을 ‘빨리' 완료시켜야 합니다. 기존의 HTTP 방식의 REST 통신에서는 할 수 없는 일이었죠.

※클라이언트와 블록체인 네트워크는 REST API 방식으로 통신합니다.

실제 코드로 보는 Chaincode 속 gRPC

func (t *StringsChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {  fmt.Printf("Declaring")
key := "Test"
value := "Hello, World!"
fmt.Printf("PutState")
stub.PutState(key, []byte(value))
return shim.Success(nil)}

위 코드는 앞서 살짝 언급드렸던 사내 교육에서 사용했던 예제입니다. 제가 지금 다른 시리즈로 포스팅하고 있는 Zero to Blockchain과는 달리 go-lang 기반입니다. Init 함수는 체인코드를 실행하기 앞서 초기화해줍니다. ChaincodeStubInterface를 가지고 와서, 여기에 Key-Value 값을 해당 stub의 상태값으로 넣어줍니다.

※golang에는 gRPC가 기본 내장되어 있습니다.

  • shim 패키지: 체인코드 내의 상태값, 트랜잭션 컨텍스트 등에 접근할 수 있는 API를 제공해주는 Hyperledger 패키지입니다.
  • pb: 위 예시 블럭에는 나타나지 않았지만, “github.com/hyperledger/fabric/protos/peer” 패키지를 가지고 온 것입니다. Fabric Go SDK에 있는 내용으로, 피어 정보를 담는 프로토콜 버퍼 패키지입니다.
  • fmt: 표준 입출력을 담당하는 패키지입니다. console.log 정도겠네요. 이것도 마찬가지로 별도로 임포트해오는 패키지입니다 — 이쯤되면 go-lang이 기본으로 갖고 있는 함수는 무엇인지 궁금해집니다.
  • stub으로 받는 부분이 gRPC 관련된 부분인데요, 프로토콜 버퍼 메시지 타입 호출시 이용하는 파라미터를 감싸는 객체입니다. 여기서는 ChaincodeStubInterface라는 SDK 내장 타입을 불러와서 가지고 있는 형태입니다.

Reference

http://bcho.tistory.com/1011
https://medium.com/@goinhacker/microservices-with-grpc-d504133d191d
https://www.popit.kr/%EB%82%98%EB%A7%8C-%EB%AA%A8%EB%A5%B4%EA%B3%A0-%EC%9E%88%EB%8D%98-http2/
https://jira.hyperledger.org/browse/FAB-37

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade