๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

๋ˆˆ์ด ๋ฌด์„ญ๊ณ  ์†์ด ๊ฐ€๋ ต๋‹ค!

์ด์ „ ๊ธฐ์‚ฌ์—์„œ๋Š” ๋ธ”๋ก์ฒด์ธ์ด ๊ตฌ์ถ•๋˜๋Š” ๊ธฐ์ˆ ์„ ๋‹ค๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค.๋ธ”๋ก์ฒด์ธ์„ ๊ตฌ์ถ•ํ•˜๋ ค๋ฉด ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ๊นŒ์š”?) ๋ฐ ๊ทธ๋“ค์˜ ๋„์›€์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋ก€(์™œ ์‚ฌ๋ก€๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ• ๊นŒ์š”?). ์ด์ œ ์†์œผ๋กœ ์ž‘์—…ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค! ํŒŒ์ผ๋Ÿฟ ๋ฐ PoC(๊ฐœ๋… ์ฆ๋ช…)๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํด๋ผ์šฐ๋“œ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์„ธ๊ณ„ ์–ด๋””์—์„œ๋‚˜ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ง€๋ฃจํ•œ ํ™˜๊ฒฝ ์„ค์น˜์— ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „ ์„ค์ •๋œ ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฐธ๊ฐ€์ž ๊ฐ„์— ์ฝ”์ธ์„ ์ „์†กํ•˜๋Š” ๋„คํŠธ์›Œํฌ์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ๊ฒƒ์„ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ๋น„ํŠธ์ฝ”์ธ์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” IBM ํด๋ผ์šฐ๋“œ์™€ ๋ฒ”์šฉ ๋ธ”๋ก์ฒด์ธ Hyperledger Fabric์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋จผ์ € Hyperledger Fabric์ด ์™œ ์œ ๋‹ˆ๋ฒ„์„ค ๋ธ”๋ก์ฒด์ธ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”?

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

Hyperledger Fabric - ๋ฒ”์šฉ ๋ธ”๋ก์ฒด์ธ

์ผ๋ฐ˜์ ์œผ๋กœ ๋ณดํŽธ์  ์ •๋ณด ์‹œ์Šคํ…œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์„œ๋ฒ„ ๋ฐ ์†Œํ”„ํŠธ์›จ์–ด ์ฝ”์–ด ์„ธํŠธ์ž…๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
  • ์žฅ์น˜/์‚ฌ๋žŒ์˜ ๋“ฑ๋ก, ์ธ์ฆ ๋ฐ ์Šน์ธ์„ ์œ„ํ•œ ๋„๊ตฌ
  • ์šด์˜ ๋ฐ ๋ณด๊ด€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค:

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

Hyperledger Fabric์˜ ๊ณต์‹ ๋ฒ„์ „์€ ๋‹ค์Œ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ์œผ๋กœ์ฆ‰, Hyperledger Fabric์€ ํ”„๋ผ์ด๋น— ๋ธ”๋ก์ฒด์ธ์„ ๊ตฌ์ถ•ํ•˜๊ณ  JS ๋ฐ Go ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ž„์˜์˜ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. Hyperledger Fabric์˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ  ์ด๊ฒƒ์ด ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๊ธฐ๋ก์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ๋งŒ ๊ฐ–์ถ˜ ๋ฒ”์šฉ ์‹œ์Šคํ…œ์ธ์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํŠน์ด์„ฑ์€ ๋ชจ๋“  ๋ธ”๋ก์ฒด์ธ์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฐธ๊ฐ€์ž๊ฐ€ ํ•ฉ์˜์— ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋ธ”๋ก์ฒด์ธ์— ๋ฐฐ์น˜๋œ ๋ธ”๋ก์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•œ ํ›„์—๋Š” ์กฐ์šฉํžˆ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ์•„ํ‚คํ…์ฒ˜

๋‹ค์ด์–ด๊ทธ๋žจ์€ Hyperledger Fabric ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

์กฐ์ง โ€” ์กฐ์ง์—๋Š” ๋™๋ฃŒ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธ”๋ก์ฒด์ธ์€ ์กฐ์ง์˜ ์ง€์›์œผ๋กœ ์ธํ•ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ์กฐ์ง์ด ๋™์ผํ•œ ์ฑ„๋„์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฑ„๋„ โ€” ํ”ผ์–ด๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ, ์ฆ‰ ๋ธ”๋ก์ฒด์ธ์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. Hyperledger Fabric์€ ๋‹ค์–‘ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ธ”๋ก์ฒด์ธ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉค๋ฒ„์‹ญ ์„œ๋น„์Šค ์ œ๊ณต์—…์ฒด(MSP) ID๋ฅผ ๋ฐœ๊ธ‰ํ•˜๊ณ  ์—ญํ• ์„ ํ• ๋‹นํ•˜๋Š” CA(์ธ์ฆ ๊ธฐ๊ด€)์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด MSP์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”ผ์–ด ๋…ธ๋“œ โ€” ๊ฑฐ๋ž˜๋ฅผ ํ™•์ธํ•˜๊ณ , ๋ธ”๋ก์ฒด์ธ์„ ์ €์žฅํ•˜๊ณ , ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์‹คํ–‰ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ํ”ผ์–ด์—๋Š” MSP์—์„œ ๋ฐœ๊ธ‰ํ•œ ID(๋””์ง€ํ„ธ ์ธ์ฆ์„œ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ ๊ถŒ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ๋น„ํŠธ์ฝ”์ธ โ€‹โ€‹๋˜๋Š” ์ด๋”๋ฆฌ์›€ ๋„คํŠธ์›Œํฌ์™€ ๋‹ฌ๋ฆฌ Hyperledger Fabric ๋…ธ๋“œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ํ”ผ์–ด ์–ด์ฉŒ๋ฉด ์ง€์ง€ํ•˜๋Š” ๋™๋ฃŒ (EP) ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปค๋ฐ‹ ํ”ผ์–ด (CP) - ๋ธ”๋ก์ฒด์ธ์—๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  "์„ธ๊ณ„ ์ƒํƒœ"๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ์•ต์ปค ํ”ผ์–ด (AP) - ์—ฌ๋Ÿฌ ์กฐ์ง์ด ๋ธ”๋ก์ฒด์ธ์— ์ฐธ์—ฌํ•˜๋Š” ๊ฒฝ์šฐ ์•ต์ปค ํ”ผ์–ด๊ฐ€ ์ด๋“ค ๊ฐ„์˜ ํ†ต์‹ ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์กฐ์ง์—๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์•ต์ปค ํ”ผ์–ด๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. AP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์กฐ์ง์˜ ๋ชจ๋“  ํ”ผ์–ด๋Š” ๋‹ค๋ฅธ ์กฐ์ง์˜ ๋ชจ๋“  ํ”ผ์–ด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AP ๊ฐ„ ์ •๋ณด๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์‹ญ ํ”„๋กœํ† ์ฝœ.
  • ๋ฆฌ๋” ํ”ผ์–ด โ€” ์กฐ์ง์— ์—ฌ๋Ÿฌ ํ”ผ์–ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ”ผ์–ด์˜ ๋ฆฌ๋”๋งŒ์ด Ordering ์„œ๋น„์Šค์—์„œ ๋ธ”๋ก์„ ์ˆ˜์‹ ํ•˜์—ฌ ๋‚˜๋จธ์ง€ ํ”ผ์–ด์—๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋”๋Š” ์ •์ ์œผ๋กœ ์ง€์ •๋˜๊ฑฐ๋‚˜ ์กฐ์ง์˜ ๋™๋ฃŒ์— ์˜ํ•ด ๋™์ ์œผ๋กœ ์„ ํƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์‹ญ ํ”„๋กœํ† ์ฝœ์€ ๋ฆฌ๋”์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ž์‚ฐ โ€” ๊ฐ€์น˜๊ฐ€ ์žˆ๊ณ  ๋ธ”๋ก์ฒด์ธ์— ์ €์žฅ๋˜๋Š” ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. ๋ณด๋‹ค ๊ตฌ์ฒด์ ์œผ๋กœ JSON ํ˜•์‹์˜ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ๋ธ”๋ก์ฒด์ธ์— ๊ธฐ๋ก๋˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ด ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ธ”๋ก์ฒด์ธ์— ์ €์žฅ๋˜๋Š” ๊ธฐ๋ก๊ณผ "์„ธ๊ณ„ ์ƒํƒœ" ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ์—…๋ฌด์— ๋”ฐ๋ผ ์ž„์˜๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ์ž์‚ฐ์— ์†Œ์œ ์ž๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ณ  ๊ฐ€์น˜๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์›์žฅ โ€” ์ž์‚ฐ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ธ”๋ก์ฒด์ธ๊ณผ Word ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. World State๋Š” LevelDB ๋˜๋Š” CouchDB๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Smart contract โ€” ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. Hyperledger Fabric์—์„œ๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์ฒด์ธ์ฝ”๋“œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ฒด์ธ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด์— ๋Œ€ํ•œ ์ž์‚ฐ๊ณผ ๊ฑฐ๋ž˜๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์ธ ์ธก๋ฉด์—์„œ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์€ JS ๋˜๋Š” Go ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๊ตฌํ˜„๋œ ์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

๋ณด์ฆ ์ •์ฑ… โ€” ๊ฐ ์ฒด์ธ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ฑฐ๋ž˜ ํ™•์ธ ํšŸ์ˆ˜์™€ ๋Œ€์ƒ์— ๋Œ€ํ•œ ์ •์ฑ…์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์ฑ…์ด ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ "์ฑ„๋„์— ์žˆ๋Š” ๋ชจ๋“  ์กฐ์ง์˜ ๋ชจ๋“  ๊ตฌ์„ฑ์›์ด ๊ฑฐ๋ž˜๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."์ž…๋‹ˆ๋‹ค. ์ •์ฑ…์˜ ์˜ˆ:

  • ๊ฑฐ๋ž˜๋Š” ์กฐ์ง์˜ ๊ด€๋ฆฌ์ž์— ์˜ํ•ด ์Šน์ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์กฐ์ง์˜ ๊ตฌ์„ฑ์›์ด๋‚˜ ๊ณ ๊ฐ์˜ ํ™•์ธ์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”ผ์–ด ์กฐ์ง์˜ ํ™•์ธ์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ๋ฌธ ์„œ๋น„์Šค โ€” ํŠธ๋žœ์žญ์…˜์„ ๋ธ”๋ก์œผ๋กœ ๋ฌถ์–ด ์ฑ„๋„์˜ ํ”ผ์–ด์—๊ฒŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ์˜ ๋ชจ๋“  ํ”ผ์–ด์—๊ฒŒ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์‚ฐ์—…์šฉ ์‹œ์Šคํ…œ์— ์‚ฌ์šฉ ์นดํ”„์นด ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค, ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ์šฉ ํ˜ผ์ž.

ํ†ตํ™” ํ๋ฆ„

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Go, Node.js ๋˜๋Š” Java SDK๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Hyperledger Fabric๊ณผ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋Š” tx ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•˜์—ฌ ์ด๋ฅผ ์Šน์ธํ•˜๋Š” ํ”ผ์–ด์—๊ฒŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ํ”ผ์–ด๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์„œ๋ช…์„ ํ™•์ธํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์„ ์™„๋ฃŒํ•œ ๋‹ค์Œ ๋ณด์ฆ ์„œ๋ช…์„ ํด๋ผ์ด์–ธํŠธ์— ๋‹ค์‹œ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ฒด์ธ์ฝ”๋“œ๋Š” Endorsing Peer์—์„œ๋งŒ ์‹คํ–‰๋˜๋ฉฐ, ๊ทธ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋ชจ๋“  Peer์—๊ฒŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ PBFT(Practical Byzantine Fault Tolerant) ํ•ฉ์˜๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์™€ ๋‹ค๋ฅด๋‹ค ํด๋ž˜์‹ BFT ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜๊ณ  ๋ชจ๋“  ์ฐธ๊ฐ€์ž๋กœ๋ถ€ํ„ฐ ํ™•์ธ์ด ์˜ˆ์ƒ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŠน์ • ์„ธํŠธ์—์„œ๋งŒ ํ™•์ธ์ด ์˜ˆ์ƒ๋œ๋‹ค๋Š” ์‚ฌ์‹ค;
  • ํด๋ผ์ด์–ธํŠธ๋Š” ๋ณด์ฆ ์ •์ฑ…์— ํ•ด๋‹นํ•˜๋Š” ์‘๋‹ต ์ˆ˜๋ฅผ ๋ฐ›์€ ํ›„ ํŠธ๋žœ์žญ์…˜์„ Ordering ์„œ๋น„์Šค๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • Ordering ์„œ๋น„์Šค๋Š” ๋ธ”๋ก์„ ์ƒ์„ฑํ•˜์—ฌ ๋ชจ๋“  ์ปค๋ฐ‹ ํ”ผ์–ด์—๊ฒŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ฃผ๋ฌธ ์„œ๋น„์Šค๋Š” ๋ธ”๋ก์˜ ์ˆœ์ฐจ์  ๊ธฐ๋ก์„ ๋ณด์žฅํ•˜๋ฏ€๋กœ ์†Œ์œ„ ์›์žฅ ํฌํฌ(Ledger Fork)๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค."ํฌํฌ" ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.);
  • Peer๋Š” ๋ธ”๋ก์„ ๋ฐ›๊ณ , ๋ณด์ฆ ์ •์ฑ…์„ ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ , ๋ธ”๋ก์„ ๋ธ”๋ก์ฒด์ธ์— ์“ฐ๊ณ , โ€œWorld Stateโ€ DB์—์„œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์ €๊ฒƒ๋“ค. ์ด๋กœ ์ธํ•ด ๋…ธ๋“œ ๊ฐ„์˜ ์—ญํ• ์ด ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ธ”๋ก์ฒด์ธ์˜ ํ™•์žฅ์„ฑ๊ณผ ๋ณด์•ˆ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

  • ์Šค๋งˆํŠธ ๊ณ„์•ฝ(์ฒด์ธ์ฝ”๋“œ)์€ ํ”ผ์–ด ์Šน์ธ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ์˜ ๊ธฐ๋ฐ€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ์ฐธ๊ฐ€์ž๊ฐ€ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์Šน์ธํ•˜๋Š” ํ”ผ์–ด์— ์˜ํ•ด์„œ๋งŒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์ฃผ๋ฌธ์ด ๋นจ๋ฆฌ ์ง„ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Ordering์ด ๋ธ”๋ก์„ ํ˜•์„ฑํ•˜๊ณ  ์ด๋ฅผ ๊ณ ์ •๋œ ๋ฆฌ๋” ํ”ผ์–ด ์„ธํŠธ๋กœ ์ „์†กํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์— ์˜ํ•ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์ปค๋ฐ‹ ํ”ผ์–ด๋Š” ๋ธ”๋ก์ฒด์ธ๋งŒ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ”ผ์–ด๊ฐ€ ๋งŽ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋งŽ์€ ์ „๋ ฅ๊ณผ ์ฆ‰๊ฐ์ ์ธ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Hyperledger Fabric์˜ ์•„ํ‚คํ…์ฒ˜ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์ด๊ฒƒ์ด ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑด์ถ•์˜ ๊ธฐ์› ๋˜๋Š” ์—ฌ๊ธฐ : Hyperledger Fabric: ํ—ˆ๊ฐ€๋œ ๋ธ”๋ก์ฒด์ธ์„ ์œ„ํ•œ ๋ถ„์‚ฐ ์šด์˜ ์ฒด์ œ.

๋”ฐ๋ผ์„œ Hyperledger Fabric์€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ง„์ •ํ•œ ๋ฒ”์šฉ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

  • ์Šค๋งˆํŠธ ๊ณ„์•ฝ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • JSON ํ˜•์‹์œผ๋กœ ๋ธ”๋ก์ฒด์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์ฆ ๊ธฐ๊ด€์„ ์‚ฌ์šฉํ•˜์—ฌ API ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ  ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ Hyperledger Fabric์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์ดํ•ดํ–ˆ์œผ๋ฏ€๋กœ ๋งˆ์นจ๋‚ด ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ ๋ฐฐํฌ

๋ฌธ์ œ ์„ฑ๋ช…

์ž„๋ฌด๋Š” ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ Citcoin ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ๊ณ„์ • ์ƒ์„ฑ, ์ž”์•ก ํ™•๋ณด, ๊ณ„์ • ์ถฉ์ „, ํ•œ ๊ณ„์ •์—์„œ ๋‹ค๋ฅธ ๊ณ„์ •์œผ๋กœ ์ฝ”์ธ ์ „์†ก. ์Šค๋งˆํŠธ ๊ณ„์•ฝ์—์„œ ์ถ”๊ฐ€๋กœ ๊ตฌํ˜„ํ•  ๊ฐ์ฒด ๋ชจ๋ธ์„ ๊ทธ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฆ„์œผ๋กœ ์‹๋ณ„๋˜๊ณ  ์ž”์•ก๊ณผ ๊ณ„์ • ๋ชฉ๋ก์„ ํฌํ•จํ•˜๋Š” ๊ณ„์ •์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ณ„์ • ๋ฐ ๊ณ„์ • ๋ชฉ๋ก์€ Hyperledger Fabric ์ž์‚ฐ ์ธก๋ฉด์—์„œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋“ค์€ ์—ญ์‚ฌ์™€ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ทธ๋ ค๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ด๋‹ค:

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

์ƒ๋‹จ ์ˆ˜์น˜๋Š” "์„ธ๊ณ„ ์ƒํƒœ" ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ํ˜„์žฌ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๊ทธ ์•„๋ž˜์—๋Š” ๋ธ”๋ก์ฒด์ธ์— ์ €์žฅ๋œ ์ด๋ ฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ทธ๋ฆผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‚ฐ์˜ ํ˜„์žฌ ์ƒํƒœ๋Š” ๊ฑฐ๋ž˜์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. Asset์€ ์ „์ฒด์ ์œผ๋กœ๋งŒ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฐ๊ณผ๋กœ ์ƒˆ๋กœ์šด ๊ฐœ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ž์‚ฐ์˜ ํ˜„์žฌ ๊ฐ€์น˜๊ฐ€ ๋‚ด์—ญ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

IBM ํด๋ผ์šฐ๋“œ

์šฐ๋ฆฌ๋Š” ๊ณ„์ •์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค IBM ํด๋ผ์šฐ๋“œ. ๋ธ”๋ก์ฒด์ธ ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ข…๋Ÿ‰์ œ(Pay-As-You-Go)๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ๋น ๋ฅด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด... IBM์€ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๊ณ  ์ด๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ธ์ •์ ์ธ ์ ์€ IBM์ด ํด๋ผ์šฐ๋“œ์— Hyperledger Fabric์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๊ต์œก ์ž๋ฃŒ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค์Œ ์ผ๋ จ์˜ ๊ธฐ์‚ฌ์™€ ์˜ˆ์ œ๋ฅผ ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ IBM Blockchain ํ”Œ๋žซํผ์˜ ์Šคํฌ๋ฆฐ์ƒท์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ธ”๋ก์ฒด์ธ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํžˆ ์ž‘์—… ๋ฒ”์œ„๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด ํ•˜๋‚˜์˜ ์กฐ์ง์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

Orderer CA, Org1 CA, Orderer Peer์— ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

์ฑ„๋„์„ ๋งŒ๋“ค๊ณ  citcoin์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

๋ณธ์งˆ์ ์œผ๋กœ ์ฑ„๋„์€ ๋ธ”๋ก์ฒด์ธ์ด๋ฏ€๋กœ ๋ธ”๋ก 0(Genesis ๋ธ”๋ก)์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

์Šค๋งˆํŠธ ๊ณ„์•ฝ ์ž‘์„ฑ

/*
 * Citcoin smart-contract v1.5 for Hyperledger Fabric
 * (c) Alexey Sushkov, 2019
 */
 
'use strict';
 
const { Contract } = require('fabric-contract-api');
const maxAccounts = 5;
 
class CitcoinEvents extends Contract {
 
    async instantiate(ctx) {
        console.info('instantiate');
        let emptyList = [];
        await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(emptyList)));
    }
    // Get all accounts
    async GetAccounts(ctx) {
        // Get account list:
        let accounts = '{}'
        let accountsData = await ctx.stub.getState('accounts');
        if (accountsData) {
            accounts = JSON.parse(accountsData.toString());
        } else {
            throw new Error('accounts not found');
        }
        return accountsData.toString()
    }
     // add a account object to the blockchain state identifited by their name
    async AddAccount(ctx, name, balance) {
        // this is account data:
        let account = {
            name: name,
            balance: Number(balance),       
            type: 'account',
        };
        // create account:
        await ctx.stub.putState(name, Buffer.from(JSON.stringify(account)));
 
        // Add account to list:
        let accountsData = await ctx.stub.getState('accounts');
        if (accountsData) {
            let accounts = JSON.parse(accountsData.toString());
            if (accounts.length < maxAccounts)
            {
                accounts.push(name);
                await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(accounts)));
            } else {
                throw new Error('Max accounts number reached');
            }
        } else {
            throw new Error('accounts not found');
        }
        // return  object
        return JSON.stringify(account);
    }
    // Sends money from Account to Account
    async SendFrom(ctx, fromAccount, toAccount, value) {
        // get Account from
        let fromData = await ctx.stub.getState(fromAccount);
        let from;
        if (fromData) {
            from = JSON.parse(fromData.toString());
            if (from.type !== 'account') {
                throw new Error('wrong from type');
            }   
        } else {
            throw new Error('Accout from not found');
        }
        // get Account to
        let toData = await ctx.stub.getState(toAccount);
        let to;
        if (toData) {
            to = JSON.parse(toData.toString());
            if (to.type !== 'account') {
                throw new Error('wrong to type');
            }  
        } else {
            throw new Error('Accout to not found');
        }
 
        // update the balances
        if ((from.balance - Number(value)) >= 0 ) {
            from.balance -= Number(value);
            to.balance += Number(value);
        } else {
            throw new Error('From Account: not enought balance');          
        }
 
        await ctx.stub.putState(from.name, Buffer.from(JSON.stringify(from)));
        await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to)));
                 
        // define and set Event
        let Event = {
            type: "SendFrom",
            from: from.name,
            to: to.name,
            balanceFrom: from.balance,
            balanceTo: to.balance,
            value: value
        };
        await ctx.stub.setEvent('SendFrom', Buffer.from(JSON.stringify(Event)));
 
        // return to object
        return JSON.stringify(from);
    }
 
    // get the state from key
    async GetState(ctx, key) {
        let data = await ctx.stub.getState(key);
        let jsonData = JSON.parse(data.toString());
        return JSON.stringify(jsonData);
    }
    // GetBalance   
    async GetBalance(ctx, accountName) {
        let data = await ctx.stub.getState(accountName);
        let jsonData = JSON.parse(data.toString());
        return JSON.stringify(jsonData);
    }
     
    // Refill own balance
    async RefillBalance(ctx, toAccount, value) {
        // get Account to
        let toData = await ctx.stub.getState(toAccount);
        let to;
        if (toData) {
            to = JSON.parse(toData.toString());
            if (to.type !== 'account') {
                throw new Error('wrong to type');
            }  
        } else {
            throw new Error('Accout to not found');
        }
 
        // update the balance
        to.balance += Number(value);
        await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to)));
                 
        // define and set Event
        let Event = {
            type: "RefillBalance",
            to: to.name,
            balanceTo: to.balance,
            value: value
        };
        await ctx.stub.setEvent('RefillBalance', Buffer.from(JSON.stringify(Event)));
 
        // return to object
        return JSON.stringify(from);
    }
}
module.exports = CitcoinEvents;

์ง๊ด€์ ์œผ๋กœ ์—ฌ๊ธฐ์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋ช…ํ™•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ๋ชจ ํ”„๋กœ๊ทธ๋žจ์ด Hyperledger Fabric API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance)์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • SendFrom ๋ฐ RefillBalance ํ•จ์ˆ˜๋Š” ๋ฐ๋ชจ ํ”„๋กœ๊ทธ๋žจ์ด ์ˆ˜์‹ ํ•  ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์Šคํ„ด์Šคํ™” ํ•จ์ˆ˜๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ์ด ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์Šค๋งˆํŠธ ๊ณ„์•ฝ ๋ฒ„์ „์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋นˆ ๋ฐฐ์—ด๋กœ ๋ชฉ๋ก์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์Šค๋งˆํŠธ ๊ณ„์•ฝ ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•˜๋ฉด ํ˜„์žฌ ๋ชฉ๋ก์ด ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ดœ์ฐฎ์•„์š”. ๊ทธ๋ƒฅ ๋ฐฐ์šฐ๋Š” ์ค‘์ด์—์š”).
  • ๊ณ„์ • ๋ฐ ๊ณ„์ • ๋ชฉ๋ก์€ JSON ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. JS๋Š” ๋ฐ์ดํ„ฐ ์กฐ์ž‘์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • getState ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‚ฐ์˜ ํ˜„์žฌ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ  putState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ„์ •์„ ์ƒ์„ฑํ•  ๋•Œ AddAccount ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ๋ธ”๋ก์ฒด์ธ์˜ ์ตœ๋Œ€ ๊ณ„์ • ์ˆ˜(maxAccounts = 5)๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— ๊ณ„์ • ์ˆ˜๊ฐ€ ๋์—†์ด ์ฆ๊ฐ€ํ•˜๋Š” ์žผ์ด ์žˆ์Šต๋‹ˆ๋‹ค (์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”?). ์ด๋Ÿฐ ์‹ค์ˆ˜๋Š” ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค)

๋‹ค์Œ์œผ๋กœ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์ฑ„๋„์— ๋กœ๋“œํ•˜๊ณ  ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

์Šค๋งˆํŠธ ๊ณ„์•ฝ ์„ค์น˜๋ฅผ ์œ„ํ•œ ํŠธ๋žœ์žญ์…˜์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

์ฑ„๋„์— ๋Œ€ํ•œ ์„ธ๋ถ€์ •๋ณด๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” IBM ํด๋ผ์šฐ๋“œ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ธ”๋ก์ฒด์ธ ๋„คํŠธ์›Œํฌ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์–ป์Šต๋‹ˆ๋‹ค. ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋˜ํ•œ ๊ฐ€์ƒ ์„œ๋ฒ„์˜ Amazon ํด๋ผ์šฐ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ฐ๋ชจ ํ”„๋กœ๊ทธ๋žจ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค(์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ์„น์…˜์—์„œ ์„ค๋ช…).

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

Hyperledger Fabric API ํ˜ธ์ถœ์„ ์œ„ํ•œ GUI ์ƒ์„ฑ

Hyperledger Fabric์—๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฑ„๋„์„ ์ƒ์„ฑํ•˜์„ธ์š”.
  • ํ”ผ์–ด ํˆฌ ์ฑ„๋„ ์—ฐ๊ฒฐ;
  • ์ฑ„๋„์— ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์„ค์น˜ํ•˜๊ณ  ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜ ํ˜ธ์ถœ
  • ๋ธ”๋ก์ฒด์ธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ

๋ฐ๋ชจ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜์„ ํ˜ธ์ถœํ•˜๊ณ  ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฐ์—๋งŒ API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ IBM ๋ธ”๋ก์ฒด์ธ ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜๋จธ์ง€ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ‘œ์ค€ ๊ธฐ์ˆ  ์Šคํƒ์ธ Express.js + Vue.js + Node.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GUI๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ œ์ž‘์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ œ๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ–ˆ๋˜ ์ผ๋ จ์˜ ๊ฐ•์˜์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๋‚จ๊ฒจ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค. Vue.js ๋ฐ Express.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ’€ ์Šคํƒ ์›น ์•ฑ. ๊ทธ ๊ฒฐ๊ณผ Google ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ ์Šคํƒ€์ผ์˜ ์นœ์ˆ™ํ•œ ๊ทธ๋ž˜ํ”ฝ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–์ถ˜ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ REST API๋Š” ์—ฌ๋Ÿฌ ํ˜ธ์ถœ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • HyperledgerDemo/v1/init - ๋ธ”๋ก์ฒด์ธ์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • HyperledgerDemo/v1/accounts/list โ€” ๋ชจ๋“  ๊ณ„์ • ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • HyperledgerDemo/v1/account?name=Bob&balance=100 โ€” Bob ๊ณ„์ •์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • HyperledgerDemo/v1/info?account=Bob โ€” Bob ๊ณ„์ •์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 - Bob์—์„œ Alice๋กœ ๋‘ ๊ฐœ์˜ ์ฝ”์ธ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • HyperledgerDemo/v1/disconnect - ๋ธ”๋ก์ฒด์ธ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค.

ํฌํ•จ๋œ ์˜ˆ์ œ์™€ API์— ๋Œ€ํ•œ ์„ค๋ช… ์šฐํŽธ๋ฐฐ๋‹ฌ๋ถ€ ์›น์‚ฌ์ดํŠธ - HTTP API ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ž˜ ์•Œ๋ ค์ง„ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

Amazon ํด๋ผ์šฐ๋“œ์˜ ๋ฐ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

Amazon์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—…๋กœ๋“œํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. IBM์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚ด ๊ณ„์ •์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ๊ฐ€์ƒ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ—ˆ์šฉํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ์— ์ฒด๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•: www.citcoin.info. ์ž ์‹œ ๋™์•ˆ ์„œ๋ฒ„๋ฅผ ์ผœ๋‘์—ˆ๋‹ค๊ฐ€ ๋„๊ฒ ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒ๋ฉด... ์ž„๋Œ€๋ฃŒ๊ฐ€ ๋š๋š ๋–จ์–ด์ง€๊ณ  ์žˆ๊ณ  ์‹œํŠธ์ฝ”์ธ ์ฝ”์ธ์€ ์•„์ง ์ฆ๊ถŒ ๊ฑฐ๋ž˜์†Œ์— ์ƒ์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) ์ž‘์—…์˜ ๋…ผ๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•˜๋„๋ก ๊ธฐ์‚ฌ์— ๋ฐ๋ชจ ์Šคํฌ๋ฆฐ์ƒท์„ ํฌํ•จ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๋ฐ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ธ”๋ก์ฒด์ธ์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ„์ • ์ƒ์„ฑ(๊ทธ๋Ÿฌ๋‚˜ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์— ์ง€์ •๋œ ์ตœ๋Œ€ ๊ณ„์ • ์ˆ˜๊ฐ€ ๋ธ”๋ก์ฒด์ธ์— ๋„๋‹ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ ์ƒˆ ๊ณ„์ •์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค)
  • ๊ณ„์ • ๋ชฉ๋ก์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • Alice, Bob ๋ฐ Alex ๊ฐ„์— ์‹œํŠธ์ฝ”์ธ ์ฝ”์ธ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฒคํŠธ ์ˆ˜์‹ (๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ์ด๋ฒคํŠธ๋ฅผ ํ‘œ์‹œํ•  ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฏ€๋กœ ๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค)
  • ์ž‘์—…์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ๋ธ”๋ก์ฒด์ธ์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

๋‹ค์Œ์œผ๋กœ ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  ์ž”์•ก์œผ๋กœ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ณ„์ • ๋ชฉ๋ก์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ๊ณผ ๋ฐ›๋Š” ์‚ฌ๋žŒ์„ ์„ ํƒํ•˜๊ณ  ์ž”์•ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋ณด๋‚ธ ์‚ฌ๋žŒ๊ณผ ๋ฐ›๋Š” ์‚ฌ๋žŒ์ด ๋™์ผํ•˜๋ฉด ํ•ด๋‹น ๊ณ„์ •์ด ๋ณด์ถฉ๋ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

๋กœ๊ทธ์—์„œ ์šฐ๋ฆฌ๋Š” ํŠธ๋žœ์žญ์…˜ ์‹คํ–‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

์‚ฌ์‹ค ๋ฐ๋ชจ ํ”„๋กœ๊ทธ๋žจ์ด ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๋ธ”๋ก์ฒด์ธ์—์„œ์˜ ๊ฑฐ๋ž˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์ธ ๊ฑฐ๋ž˜ ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ: ์–ด๋–ค PoC๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ• ๊นŒ์š”?

์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” Citcoin ๋„คํŠธ์›Œํฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ PoC ๊ตฌํ˜„์„ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. Citcoin์ด ์ฝ”์ธ ์ „์†ก์„ ์œ„ํ•œ ๋ณธ๊ฒฉ์ ์ธ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋˜๋ ค๋ฉด ๋˜ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•„์ฃผ ์ž‘์€:

  • ๊ณ„์ • ์ƒ์„ฑ ๋‹จ๊ณ„์—์„œ ๊ฐœ์ธ/๊ณต๊ฐœ ํ‚ค ์ƒ์„ฑ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ ํ‚ค๋Š” ๊ณ„์ • ์‚ฌ์šฉ์ž์™€ ํ•จ๊ป˜ ์ €์žฅ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๊ณต๊ฐœ ํ‚ค๋Š” ๋ธ”๋ก์ฒด์ธ์— ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฆ„์ด ์•„๋‹Œ ๊ณต๊ฐœํ‚ค๋ฅผ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ฝ”์ธ ์ด์ฒด๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ์ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—์„œ ์„œ๋ฒ„๋กœ ์ด๋™ํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ Citcoin ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค: ๊ณ„์ • ์ถ”๊ฐ€, ์ž”์•ก ํ™•๋ณด, ๊ณ„์ • ์ถฉ์ „, ํ•œ ๊ณ„์ •์—์„œ ๋‹ค๋ฅธ ๊ณ„์ •์œผ๋กœ ์ฝ”์ธ ์ „์†ก. ๊ทธ๋ ‡๋‹ค๋ฉด PoC๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ์€ ์–ผ๋งˆ์ž…๋‹ˆ๊นŒ?

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ธ”๋ก์ฒด์ธ์„ ๊ณต๋ถ€ํ•˜๊ณ  ํŠนํžˆ Hyperledger Fabric์„ ๊ณต๋ถ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • IBM ๋˜๋Š” Amazon ํด๋ผ์šฐ๋“œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค.
  • JS ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ์ผ๋ถ€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค.
  • ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ธ”๋ก์ฒด์ธ์ด ์•„๋‹Œ ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์˜ˆ๋ฅผ ๋“ค์–ด PostgreSQL๊ณผ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์ค‘์š”ํ•œ ๊ฒƒ์€ Linux์— ๋Œ€ํ•œ ์ง€์‹ ์—†์ด๋Š” ํ˜„๋Œ€ ์„ธ๊ณ„์—์„œ ์‚ด ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!)

๋ฌผ๋ก  ๋กœ์ผ“ ๊ณผํ•™์€ ์•„๋‹ˆ์ง€๋งŒ ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

GitHub์˜ ์†Œ์Šค

์ถœ์ฒ˜๋Š” ์˜ฌ๋ ค๋†จ๋‹ค GitHub์˜. ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…:
์นดํƒˆ๋กœ๊ทธ ยซ์„ฌ๊ธฐ๋Š” ์‚ฌ๋žŒยป โ€” Node.js ์„œ๋ฒ„
์นดํƒˆ๋กœ๊ทธ ยซํด๋ผ์ด์–ธํŠธยป โ€” Node.js ํด๋ผ์ด์–ธํŠธ
์นดํƒˆ๋กœ๊ทธ ยซblockchain"(๋ฌผ๋ก  ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’๊ณผ ํ‚ค๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์˜ˆ์‹œ๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.):

  • ๊ณ„์•ฝ โ€” ์Šค๋งˆํŠธ ๊ณ„์•ฝ ์†Œ์Šค ์ฝ”๋“œ
  • wallet โ€” Hyperledger Fabric API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ํ‚ค์ž…๋‹ˆ๋‹ค.
  • *.cds - ์Šค๋งˆํŠธ ๊ณ„์•ฝ์˜ ์ปดํŒŒ์ผ๋œ ๋ฒ„์ „
  • *.json ํŒŒ์ผ - Hyperledger Fabric API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์˜ˆ

์‹œ์ž‘์ผ ๋ฟ์ž…๋‹ˆ๋‹ค!

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€