chaincode ์ž‘์„ฑ์˜ ์ตœ๋Œ€ ์ฑŒ๋ฆฐ์ง€์ธ gRPC ๋ฝ€๊ฐœ๊ธฐ

์–ผ๋งˆ์ „์— 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


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

์œ„ ์ฝ”๋“œ๋Š” ์•ž์„œ ์‚ด์ง ์–ธ๊ธ‰๋“œ๋ ธ๋˜ ์‚ฌ๋‚ด ๊ต์œก์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ง€๊ธˆ ๋‹ค๋ฅธ ์‹œ๋ฆฌ์ฆˆ๋กœ ํฌ์ŠคํŒ…ํ•˜๊ณ  ์žˆ๋Š” 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 ๋‚ด์žฅ ํƒ€์ž…์„ ๋ถˆ๋Ÿฌ์™€์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.



gRPC๋Š” Hyperledger์˜ ์•„ํ‚คํ…์ฒ˜์  ์ฒ ํ•™์„ ๋ณด์—ฌ์ฃผ๋Š”, ํ•˜๋‚˜์˜ ๋„์ „์ด๋ผ๊ณ  ์ €๋Š” ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋Ÿฌ๋‹ ์ปค๋ธŒ๋Š” ์กฐ๊ธˆ ์žˆ์ง€๋งŒ Hyperledger๊ฐ€ ๊ธฐ์ˆ ์ ์œผ๋กœ ํฅ๋ฏธ๋กœ์šด ์ด์œ ๋Š” ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. :)
๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” Hyperledger์˜ ๋˜ ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜์  ์„ ํƒ, ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


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

ํ† ๋ก  ์ฐธ๊ฐ€

์ด๋ฉ”์ผ์€ ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ์ž…๋ ฅ์ฐฝ์€ * ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.