๋์ด ๋ฌด์ญ๊ณ ์์ด ๊ฐ๋ ต๋ค!
์ด์ ๊ธฐ์ฌ์์๋ ๋ธ๋ก์ฒด์ธ์ด ๊ตฌ์ถ๋๋ ๊ธฐ์ ์ ๋ค๋ฃจ์์ต๋๋ค.
Hyperledger Fabric - ๋ฒ์ฉ ๋ธ๋ก์ฒด์ธ
์ผ๋ฐ์ ์ผ๋ก ๋ณดํธ์ ์ ๋ณด ์์คํ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ ์๋ฒ ๋ฐ ์ํํธ์จ์ด ์ฝ์ด ์ธํธ์ ๋๋ค.
- ์์คํ ๊ณผ์ ์ํธ์์ฉ์ ์ํ ์ธํฐํ์ด์ค
- ์ฅ์น/์ฌ๋์ ๋ฑ๋ก, ์ธ์ฆ ๋ฐ ์น์ธ์ ์ํ ๋๊ตฌ
- ์ด์ ๋ฐ ๋ณด๊ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค:
Hyperledger Fabric์ ๊ณต์ ๋ฒ์ ์ ๋ค์์์ ์ฝ์ ์ ์์ต๋๋ค.
ํ์ดํผ๋ ์ ํจ๋ธ๋ฆญ ์ํคํ ์ฒ
๋ค์ด์ด๊ทธ๋จ์ Hyperledger Fabric ์ํคํ ์ฒ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์กฐ์ง โ ์กฐ์ง์๋ ๋๋ฃ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋ธ๋ก์ฒด์ธ์ ์กฐ์ง์ ์ง์์ผ๋ก ์ธํด ์กด์ฌํฉ๋๋ค. ์๋ก ๋ค๋ฅธ ์กฐ์ง์ด ๋์ผํ ์ฑ๋์ ํฌํจ๋ ์ ์์ต๋๋ค.
์ฑ๋ โ ํผ์ด๋ฅผ ๊ทธ๋ฃน์ผ๋ก ํตํฉํ๋ ๋ ผ๋ฆฌ์ ๊ตฌ์กฐ, ์ฆ ๋ธ๋ก์ฒด์ธ์ด ์ง์ ๋ฉ๋๋ค. 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 ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ๊ตฌํ๋ ์ํํธ์จ์ด ๋ชจ๋์ ๋๋ค.
๋ณด์ฆ ์ ์ฑ โ ๊ฐ ์ฒด์ธ์ฝ๋์ ๋ํด ๊ฑฐ๋ ํ์ธ ํ์์ ๋์์ ๋ํ ์ ์ฑ ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ ์ฑ ์ด ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ "์ฑ๋์ ์๋ ๋ชจ๋ ์กฐ์ง์ ๋ชจ๋ ๊ตฌ์ฑ์์ด ๊ฑฐ๋๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค."์ ๋๋ค. ์ ์ฑ ์ ์:
- ๊ฑฐ๋๋ ์กฐ์ง์ ๊ด๋ฆฌ์์ ์ํด ์น์ธ๋์ด์ผ ํฉ๋๋ค.
- ์กฐ์ง์ ๊ตฌ์ฑ์์ด๋ ๊ณ ๊ฐ์ ํ์ธ์ ๋ฐ์์ผ ํฉ๋๋ค.
- ํผ์ด ์กฐ์ง์ ํ์ธ์ ๋ฐ์์ผ ํฉ๋๋ค.
์ฃผ๋ฌธ ์๋น์ค โ ํธ๋์ญ์
์ ๋ธ๋ก์ผ๋ก ๋ฌถ์ด ์ฑ๋์ ํผ์ด์๊ฒ ๋ณด๋
๋๋ค. ๋คํธ์ํฌ์ ๋ชจ๋ ํผ์ด์๊ฒ ๋ฉ์์ง ์ ๋ฌ์ ๋ณด์ฅํฉ๋๋ค. ์ฐ์
์ฉ ์์คํ
์ ์ฌ์ฉ
ํตํ ํ๋ฆ
- ์ ํ๋ฆฌ์ผ์ด์ ์ 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์ ๋ค์์ ์ํํ ์ ์๋ ์ง์ ํ ๋ฒ์ฉ ์์คํ ์ ๋๋ค.
- ์ค๋งํธ ๊ณ์ฝ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ์์์ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ๋ฅผ ๊ตฌํํฉ๋๋ค.
- JSON ํ์์ผ๋ก ๋ธ๋ก์ฒด์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๊ณ ์์ ํฉ๋๋ค.
- ์ธ์ฆ ๊ธฐ๊ด์ ์ฌ์ฉํ์ฌ API ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๊ณ ํ์ธํฉ๋๋ค.
์ด์ Hyperledger Fabric์ ์ธ๋ถ ์ฌํญ์ ๋ํด ์กฐ๊ธ ์ดํดํ์ผ๋ฏ๋ก ๋ง์นจ๋ด ์ ์ฉํ ์์ ์ ์ํํด ๋ณด๊ฒ ์ต๋๋ค.
๋ธ๋ก์ฒด์ธ ๋ฐฐํฌ
๋ฌธ์ ์ฑ๋ช
์๋ฌด๋ ๋ค์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ Citcoin ๋คํธ์ํฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋๋ค: ๊ณ์ ์์ฑ, ์์ก ํ๋ณด, ๊ณ์ ์ถฉ์ , ํ ๊ณ์ ์์ ๋ค๋ฅธ ๊ณ์ ์ผ๋ก ์ฝ์ธ ์ ์ก. ์ค๋งํธ ๊ณ์ฝ์์ ์ถ๊ฐ๋ก ๊ตฌํํ ๊ฐ์ฒด ๋ชจ๋ธ์ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ด๋ฆ์ผ๋ก ์๋ณ๋๊ณ ์์ก๊ณผ ๊ณ์ ๋ชฉ๋ก์ ํฌํจํ๋ ๊ณ์ ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. ๊ณ์ ๋ฐ ๊ณ์ ๋ชฉ๋ก์ Hyperledger Fabric ์์ฐ ์ธก๋ฉด์์ ๋ํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ทธ๋ค์ ์ญ์ฌ์ ํ์ฌ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๋ช ํํ๊ฒ ๊ทธ๋ ค๋ณด๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ด๋ค:
์๋จ ์์น๋ "์ธ๊ณ ์ํ" ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ํ์ฌ ์ํ์
๋๋ค. ๊ทธ ์๋์๋ ๋ธ๋ก์ฒด์ธ์ ์ ์ฅ๋ ์ด๋ ฅ์ ๋ณด์ฌ์ฃผ๋ ๊ทธ๋ฆผ์ด ์์ต๋๋ค. ์์ฐ์ ํ์ฌ ์ํ๋ ๊ฑฐ๋์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ฉ๋๋ค. Asset์ ์ ์ฒด์ ์ผ๋ก๋ง ๋ณ๊ฒฝ๋๋ฏ๋ก ํธ๋์ญ์
์ ๊ฒฐ๊ณผ๋ก ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์์ฐ์ ํ์ฌ ๊ฐ์น๊ฐ ๋ด์ญ์ ๋ค์ด๊ฐ๋๋ค.
IBM ํด๋ผ์ฐ๋
์ฐ๋ฆฌ๋ ๊ณ์ ์ ๋ง๋ญ๋๋ค
๋ธ๋ก์ฒด์ธ ํ๋ซํผ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ ์์ฑ ๋ธ๋ก์ฒด์ธ ์ค๋งํธ ๊ณ์ฝ ์์ฑ ๋ฐ ์คํ ๋ธ๋ก์ฒด์ธ ํ๋ซํผ์์ ์ด๋ฒคํธ ๋ด๋ณด๋ด๊ธฐ
๋ค์์ IBM Blockchain ํ๋ซํผ์ ์คํฌ๋ฆฐ์ท์ ๋๋ค. ์ด๋ ๋ธ๋ก์ฒด์ธ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ด ์๋๋ผ ๋จ์ํ ์์ ๋ฒ์๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ์ ๋ชฉ์ ์ ์ํด ํ๋์ ์กฐ์ง์ ๋ง๋ญ๋๋ค.
Orderer CA, Org1 CA, Orderer Peer์ ๋
ธ๋๋ฅผ ๋ง๋ญ๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ์ฉ์๋ฅผ ์์ฑํฉ๋๋ค:
์ฑ๋์ ๋ง๋ค๊ณ citcoin์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
๋ณธ์ง์ ์ผ๋ก ์ฑ๋์ ๋ธ๋ก์ฒด์ธ์ด๋ฏ๋ก ๋ธ๋ก 0(Genesis ๋ธ๋ก)์ผ๋ก ์์ํฉ๋๋ค.
์ค๋งํธ ๊ณ์ฝ ์์ฑ
/*
* 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)๋ฅผ ๋น๊ตํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ๊ณ์ ์๊ฐ ๋์์ด ์ฆ๊ฐํ๋ ์ผ์ด ์์ต๋๋ค (์๊ณ ๊ณ์ จ๋์?). ์ด๋ฐ ์ค์๋ ํผํด์ผ ํฉ๋๋ค)
๋ค์์ผ๋ก ์ค๋งํธ ๊ณ์ฝ์ ์ฑ๋์ ๋ก๋ํ๊ณ ์ธ์คํด์คํํฉ๋๋ค.
์ค๋งํธ ๊ณ์ฝ ์ค์น๋ฅผ ์ํ ํธ๋์ญ์
์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฑ๋์ ๋ํ ์ธ๋ถ์ ๋ณด๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ฐ๋ฆฌ๋ IBM ํด๋ผ์ฐ๋์์ ๋ค์๊ณผ ๊ฐ์ ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ ๋ค์ด์ด๊ทธ๋จ์ ์ป์ต๋๋ค. ๋ค์ด์ด๊ทธ๋จ์ ๋ํ ๊ฐ์ ์๋ฒ์ Amazon ํด๋ผ์ฐ๋์์ ์คํ๋๋ ๋ฐ๋ชจ ํ๋ก๊ทธ๋จ์ ๋ณด์ฌ์ค๋๋ค(์์ธํ ๋ด์ฉ์ ๋ค์ ์น์
์์ ์ค๋ช
).
Hyperledger Fabric API ํธ์ถ์ ์ํ GUI ์์ฑ
Hyperledger Fabric์๋ ๋ค์์ ์ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ API๊ฐ ์์ต๋๋ค.
- ์ฑ๋์ ์์ฑํ์ธ์.
- ํผ์ด ํฌ ์ฑ๋ ์ฐ๊ฒฐ;
- ์ฑ๋์ ์ค๋งํธ ๊ณ์ฝ์ ์ค์นํ๊ณ ์ธ์คํด์คํํฉ๋๋ค.
- ํธ๋์ญ์ ํธ์ถ
- ๋ธ๋ก์ฒด์ธ์ ๋ํ ์ ๋ณด๋ฅผ ์์ฒญํฉ๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ
๋ฐ๋ชจ ํ๋ก๊ทธ๋จ์์๋ ํธ๋์ญ์
์ ํธ์ถํ๊ณ ์ ๋ณด๋ฅผ ์์ฒญํ๋ ๋ฐ์๋ง API๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ IBM ๋ธ๋ก์ฒด์ธ ํ๋ซํผ์ ์ฌ์ฉํ์ฌ ๋๋จธ์ง ๋จ๊ณ๋ฅผ ์๋ฃํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ์ค ๊ธฐ์ ์คํ์ธ Express.js + Vue.js + Node.js๋ฅผ ์ฌ์ฉํ์ฌ GUI๋ฅผ ์์ฑํฉ๋๋ค. ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ์์ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ณ๋์ ๊ธฐ์ฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ ๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์ผ๋ จ์ ๊ฐ์์ ๋ํ ๋งํฌ๋ฅผ ๋จ๊ฒจ๋๊ฒ ์ต๋๋ค.
- 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์ ๋ํ ์ค๋ช
Amazon ํด๋ผ์ฐ๋์ ๋ฐ๋ชจ ์ ํ๋ฆฌ์ผ์ด์
Amazon์ ์ ํ๋ฆฌ์ผ์ด์
์ ์
๋ก๋ํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. IBM์ ์ฌ์ ํ โโ๋ด ๊ณ์ ์ ์
๊ทธ๋ ์ด๋ํ๊ณ ๊ฐ์ ์๋ฒ๋ฅผ ์์ฑํ๋๋ก ํ์ฉํ์ง ๋ชปํ์ต๋๋ค. ๋๋ฉ์ธ์ ์ฒด๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ:
- ๋ธ๋ก์ฒด์ธ์ ์ด๊ธฐํํฉ๋๋ค.
- ๊ณ์ ์์ฑ(๊ทธ๋ฌ๋ ์ค๋งํธ ๊ณ์ฝ์ ์ง์ ๋ ์ต๋ ๊ณ์ ์๊ฐ ๋ธ๋ก์ฒด์ธ์ ๋๋ฌํ๊ธฐ ๋๋ฌธ์ ์ด์ ์ ๊ณ์ ์ ์์ฑํ ์ ์์ต๋๋ค)
- ๊ณ์ ๋ชฉ๋ก์ ๋ฐ์ต๋๋ค.
- Alice, Bob ๋ฐ Alex ๊ฐ์ ์ํธ์ฝ์ธ ์ฝ์ธ์ ์ ์กํฉ๋๋ค.
- ์ด๋ฒคํธ ์์ (๊ทธ๋ฌ๋ ์ด์ ์ด๋ฒคํธ๋ฅผ ํ์ํ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก ๋จ์ํ๋ฅผ ์ํด ์ธํฐํ์ด์ค์๋ ์ด๋ฒคํธ๊ฐ ์ง์๋์ง ์๋๋ค๊ณ ํ์๋ฉ๋๋ค)
- ์์ ์ ๊ธฐ๋กํฉ๋๋ค.
๋จผ์ ๋ธ๋ก์ฒด์ธ์ ์ด๊ธฐํํฉ๋๋ค.
๋ค์์ผ๋ก ๊ณ์ ์ ๋ง๋ค๊ณ ์์ก์ผ๋ก ์๊ฐ์ ๋ญ๋นํ์ง ๋ง์ญ์์ค.
์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๊ณ์ ๋ชฉ๋ก์ด ํ์๋ฉ๋๋ค.
๋ณด๋ด๋ ์ฌ๋๊ณผ ๋ฐ๋ ์ฌ๋์ ์ ํํ๊ณ ์์ก์ ๊ฐ์ ธ์ต๋๋ค. ๋ณด๋ธ ์ฌ๋๊ณผ ๋ฐ๋ ์ฌ๋์ด ๋์ผํ๋ฉด ํด๋น ๊ณ์ ์ด ๋ณด์ถฉ๋ฉ๋๋ค.
๋ก๊ทธ์์ ์ฐ๋ฆฌ๋ ํธ๋์ญ์
์คํ์ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
์ฌ์ค ๋ฐ๋ชจ ํ๋ก๊ทธ๋จ์ด ์ ๋ถ์
๋๋ค. ์๋์์ ๋ธ๋ก์ฒด์ธ์์์ ๊ฑฐ๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ์ ์ธ ๊ฑฐ๋ ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๋ Citcoin ๋คํธ์ํฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํ PoC ๊ตฌํ์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ์ต๋๋ค. Citcoin์ด ์ฝ์ธ ์ ์ก์ ์ํ ๋ณธ๊ฒฉ์ ์ธ ๋คํธ์ํฌ๊ฐ ๋๋ ค๋ฉด ๋ ๋ฌด์์ ํด์ผ ํฉ๋๊น? ์์ฃผ ์์:
- ๊ณ์ ์์ฑ ๋จ๊ณ์์ ๊ฐ์ธ/๊ณต๊ฐ ํค ์์ฑ์ ๊ตฌํํฉ๋๋ค. ๊ฐ์ธ ํค๋ ๊ณ์ ์ฌ์ฉ์์ ํจ๊ป ์ ์ฅ๋์ด์ผ ํ๋ฉฐ, ๊ณต๊ฐ ํค๋ ๋ธ๋ก์ฒด์ธ์ ์ ์ฅ๋์ด์ผ ํฉ๋๋ค.
- ์ด๋ฆ์ด ์๋ ๊ณต๊ฐํค๋ฅผ ์ด์ฉํด ์ฌ์ฉ์๋ฅผ ์๋ณํ๋ ์ฝ์ธ ์ด์ฒด๋ฅผ ์งํํฉ๋๋ค.
- ๊ฐ์ธ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์์ ์๋ฒ๋ก ์ด๋ํ๋ ํธ๋์ญ์ ์ ์ํธํํฉ๋๋ค.
๊ฒฐ๋ก
์ฐ๋ฆฌ๋ ๋ค์ ๊ธฐ๋ฅ์ ๊ฐ์ถ Citcoin ๋คํธ์ํฌ๋ฅผ ๊ตฌํํ์ต๋๋ค: ๊ณ์ ์ถ๊ฐ, ์์ก ํ๋ณด, ๊ณ์ ์ถฉ์ , ํ ๊ณ์ ์์ ๋ค๋ฅธ ๊ณ์ ์ผ๋ก ์ฝ์ธ ์ ์ก. ๊ทธ๋ ๋ค๋ฉด PoC๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ๋๋ ๋น์ฉ์ ์ผ๋ง์ ๋๊น?
- ์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ก์ฒด์ธ์ ๊ณต๋ถํ๊ณ ํนํ Hyperledger Fabric์ ๊ณต๋ถํด์ผ ํฉ๋๋ค.
- IBM ๋๋ Amazon ํด๋ผ์ฐ๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ์ญ์์ค.
- JS ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ผ๋ถ ์น ํ๋ ์์ํฌ๋ฅผ ๋ฐฐ์ฐ์ญ์์ค.
- ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก์ฒด์ธ์ด ์๋ ๋ณ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ ์๋ฅผ ๋ค์ด PostgreSQL๊ณผ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ์ญ์์ค.
- ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ์ค์ํ ๊ฒ์ Linux์ ๋ํ ์ง์ ์์ด๋ ํ๋ ์ธ๊ณ์์ ์ด ์ ์๋ค๋ ๊ฒ์ ๋๋ค!)
๋ฌผ๋ก ๋ก์ผ ๊ณผํ์ ์๋์ง๋ง ์ด์ฌํ ๋ ธ๋ ฅํด์ผ ํฉ๋๋ค!
GitHub์ ์์ค
์ถ์ฒ๋ ์ฌ๋ ค๋จ๋ค
์นดํ๋ก๊ทธ ยซ์ฌ๊ธฐ๋ ์ฌ๋ยป โ Node.js ์๋ฒ
์นดํ๋ก๊ทธ ยซํด๋ผ์ด์ธํธยป โ Node.js ํด๋ผ์ด์ธํธ
์นดํ๋ก๊ทธ ยซblockchain"(๋ฌผ๋ก ๋งค๊ฐ๋ณ์ ๊ฐ๊ณผ ํค๋ ์๋ํ์ง ์์ผ๋ฉฐ ์์๋ก๋ง ์ ๊ณต๋ฉ๋๋ค.):
- ๊ณ์ฝ โ ์ค๋งํธ ๊ณ์ฝ ์์ค ์ฝ๋
- wallet โ Hyperledger Fabric API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ฌ์ฉ์ ํค์ ๋๋ค.
- *.cds - ์ค๋งํธ ๊ณ์ฝ์ ์ปดํ์ผ๋ ๋ฒ์
- *.json ํ์ผ - Hyperledger Fabric API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๊ตฌ์ฑ ํ์ผ์ ์
์์์ผ ๋ฟ์
๋๋ค!
์ถ์ฒ : habr.com