์นด๋ฅด๋ค๋ ธ ์ํคํ ์ฒ
์ด ์น์ ์์๋ ์นด๋ฅด๋ค๋ ธ์ ๊ณ ์์ค ์ํคํ ์ฒ์ ๋ํด ์ค๋ช ํ๋ฉฐ, ํต์ฌ ๊ตฌ์ฑ ์์์ ๊ทธ ์ํธ ์์ฉ์ ๋ํด ์์ธํ ์ค๋ช ํฉ๋๋ค.
์นด๋ฅด๋ค๋ ธ์ ๊ณ ์์ค ์ํคํ ์ฒ
๋ค์ ๋ค์ด์ด๊ทธ๋จ์ ์นด๋ฅด๋ค๋ ธ์ ์์คํ ๊ตฌ์ฑ ์์ ๊ฐ์ ์ํธ ์์ฉ์ ๊ฐ๋ตํ๊ฒ ๋ณด์ฌ์ค๋๋ค:
์์คํ ๊ตฌ์ฑ ์์
์นด๋ฅด๋ค๋ ธ์ ํ์ฌ ๊ตฌํ์ ๊ณ ๋๋ก ๋ชจ๋ํ๋์ด ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ ์์๊ฐ ํฌํจ๋ฉ๋๋ค(๋ฐฐํฌ ์ฌ๋ก๋ง๋ค ๋ค๋ฅธ ๊ตฌ์ฑ ์์ ์กฐํฉ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค):
- ๋ ธ๋
- ์ปค๋งจ๋ ๋ผ์ธ ์ธํฐํ์ด์ค (CLI)
- ๋ค์ด๋ฌ๋ก์ค ์ง๊ฐ
- ์นด๋ฅด๋ค๋ ธ db-sync
- GraphQL API server (Apollo)
- SMASH ์๋ฒ
๋ ธ๋์ ์๊ฒฉ ๋ ธ๋
๋ธ๋ก์ฒด์ธ ์์คํ ์ ๋คํธ์ํฌ์ ๋ถ์ฐ๋ ์ฌ๋ฌ ๋ ธ๋๋ค๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๋ ธ๋๋ค์ ์์คํ ์ํ์ ๋ํ ํฉ์๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ์๋ก ํต์ ํฉ๋๋ค.
๋ ธ๋๋ ๋ค์์ ๋ด๋นํฉ๋๋ค:
- ์ฐ๋ก๋ณด๋ก์ค(Ouroboros) ํ๋กํ ์ฝ ์คํ
- ๋ธ๋ก ๊ฒ์ฆ ๋ฐ ์ ๋ฌ
- ๋ธ๋ก ์์ฑ(์ผ๋ถ ๋ ธ๋)
- ๋ค๋ฅธ ๋ก์ปฌ ํด๋ผ์ด์ธํธ์๊ฒ ๋ธ๋ก์ฒด์ธ ์ํ ์ ๋ณด ์ ๊ณต
์์ ๋๋ ์์ ์ด ์ํ ์กฐ์ง์ด ์ด์ํ๋ ๋ ธ๋๋ง ์ ๋ขฐํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๋ค์ด๋ฌ๋ก์ค(Daedalus)๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ ธ๋๋ฅผ ์คํํ๋ ์ด์ ์ ๋๋ค.
๋ ธ๋ ํ๋ก์ธ์ค
cardano-node๋ ๋ ธ๋์ ์ต์์ ๋ ๋ฒจ์ด๋ฉฐ ๋ค๋ฅธ ํ์ ์์คํ ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ทธ ์ค ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ํฉ์, ์์ฅ ๊ทธ๋ฆฌ๊ณ ๋ณด์กฐ ๊ตฌ์ฑ, CLI, ๋ก๊น ๋ฐ ๋ชจ๋ํฐ๋ง์ด ํฌํจ๋ ๋คํธ์ํน์ ๋๋ค.
๋ ธ๋-๋ ธ๋ IPC ํ๋กํ ์ฝ
๋ ธ๋-๋ ธ๋ ํ๋ก์ธ์ค ๊ฐ ํต์ (IPC) ํ๋กํ ์ฝ์ ๋ชฉ์ ์, ์ฐ๋ก๋ณด๋ก์ค ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ถ๋ก, ๋ ธ๋ ๊ฐ ๋ธ๋ก๊ณผ ํธ๋์ญ์ ์ ๊ตํํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
๋ ธ๋-๋ ธ๋ ํ๋กํ ์ฝ(node-to-node protocol)์ ์ธ ๊ฐ์ง '๋ฏธ๋ ํ๋กํ ์ฝโ๋ก ๊ตฌ์ฑ๋ ๋ณตํฉ ํ๋กํ ์ฝ์ ๋๋ค:
- chain-sync: ์ฒด์ธ์ ์ถ์ ํ๊ณ ๋ธ๋ก ํค๋๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- block-fetch: ๋ธ๋ก ๋ฐ๋๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- tx-submission: ํธ๋์ญ์ ์ ๋ฌ์ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ฌํ ๋ฏธ๋ ํ๋กํ ์ฝ์ ๋ ธ๋ ๊ฐ ์ฅ๊ธฐ๊ฐ ์คํ๋๋ ๋จ์ผ ์ ์ก ์ ์ด ํ๋กํ ์ฝ(TCP) ์ฐ๊ฒฐ์ ๋ค์คํ๋ฉ๋๋ค. P2P(ํผ์ด ํฌ ํผ์ด) ํ๊ฒฝ์ ํ์ฉํ๊ธฐ ์ํด ํ๋์ TCP ์ฐ๊ฒฐ์์ ์๋ฐฉํฅ์ผ๋ก ์คํํ ์ ์์ต๋๋ค.
์ ์ฒด ํ๋กํ ์ฝ๊ณผ ๊ฐ ๋ฏธ๋ ํ๋กํ ์ฝ์ ์์ชฝ ๋ชจ๋ ์๋น์ค ๊ฑฐ๋ถ(DoS) ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํด์ผ ํ๋ ๋ฌด์ ๋ขฐ ํ๊ฒฝ์ ๋ง๊ฒ ์ค๊ณ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ ๋ฏธ๋ ํ๋กํ ์ฝ์ ์๋น์ ์ค์ฌ ์ ์ด ํ๋ฆ์ ์ฌ์ฉํ๋ฏ๋ก ๋ ธ๋๋ ์์ ์ ํธ์ํ๋ ๊ฒ์ด ์๋๋ผ ์ค๋น๊ฐ ๋์์ ๊ฒฝ์ฐ์๋ง ๋ ๋ง์ ์์ ์ ์์ฒญํฉ๋๋ค.
ํ๋กํ ์ฝ ์ค๊ณ๋ ๋ชจ๋์์ด๋ฉฐ ์งํ ๊ฐ๋ฅํฉ๋๋ค. ๋ฒ์ ํ์์ ํตํด ์ฌ์ฉํ ๋ฏธ๋ ํ๋กํ ์ฝ ์ธํธ์ ํฉ์ํจ์ผ๋ก์จ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์๊ณ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ฏธ๋ ํ๋กํ ์ฝ์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๋ ธ๋-ํด๋ผ์ด์ธํธ ๊ฐ IPC
๋ ธ๋-ํด๋ผ์ด์ธํธ IPC ํ๋กํ ์ฝ์ ๋ชฉ์ ์ ๋ก์ปฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ธ๋๋ฅผ ํตํด ๋ธ๋ก์ฒด์ธ๊ณผ ์ํธ ์์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์๋ ์ง๊ฐ ๋ฐฑ์๋๋ ๋ธ๋ก์ฒด์ธ ํ์๊ธฐ์ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํฌํจ๋ฉ๋๋ค. ๋ ธ๋-ํด๋ผ์ด์ธํธ ํ๋กํ ์ฝ์ ํตํด ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ฒด์ธ ๋ฐ์ดํฐ์ ์ก์ธ์คํ๊ณ ํ์ฌ ์์ฅ ์ํ๋ฅผ ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค. ๋ํ ์์คํ ์ ์๋ก์ด ํธ๋์ญ์ ์ ์ ์ถํ ์ ์๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํฉ๋๋ค.
๋ ธ๋-ํด๋ผ์ด์ธํธ ํ๋กํ ์ฝ์ ๋ ธ๋-๋ ธ๋ ํ๋กํ ์ฝ๊ณผ ๋์ผํ ์ค๊ณ๋ฅผ ์ฌ์ฉํ์ง๋ง, ๋ฏธ๋ ํ๋กํ ์ฝ ์ธํธ๊ฐ ๋ค๋ฅด๋ฉฐ, TCP ์ฐ๊ฒฐ์ด ์๋ ๋ก์ปฌ ํ์ดํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ ๋ ธ๋๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ ์ ์๋ ๊ฒ๋ง ๋ ธ์ถํ๋ ๋น๊ต์ ๋ฎ์ ์์ค์ ์ ํ๋ ์ธํฐํ์ด์ค์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ธ๋๋ ๋ชจ๋ ์์ ์ฒด์ธ ๋ฐ์ดํฐ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ์ง๋ง, ์ฒด์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ๋ฐ์ดํฐ ์๋น์ค ๋ฐ ๋ณด๋ค ํธ๋ฆฌํ ์์ ์์ค API๋ฅผ ์ ๊ณตํ๋ ์์ ์ cardano-db-sync ๋ฐ ์ง๊ฐ ๋ฐฑ์๋์ ๊ฐ์ ์ ์ฉ ํด๋ผ์ด์ธํธ์ ์์๋ฉ๋๋ค.
๋ ธ๋-ํด๋ผ์ด์ธํธ ํ๋กํ ์ฝ์ ์ธ ๊ฐ์ง ๋ฏธ๋ ํ๋กํ ์ฝ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
- chain-sync: ์ฒด์ธ์ ์ถ์ ํ๊ณ ๋ธ๋ก์ ๋ฐ๋ ๋ฐ ์ฌ์ฉ
- local-tx-submission: ํธ๋์ญ์ ์ ์ถ์ ์ฌ์ฉ
- local-state-query: ์์ฅ ์ํ ์ฟผ๋ฆฌ์ ์ฌ์ฉ
๋ ธ๋-ํด๋ผ์ด์ธํธ ๊ฐ ์ฒด์ธ ๋๊ธฐํ ๋ฒ์ ์ ๋ธ๋ก ํค๋๊ฐ ์๋ ์ ์ฒด ๋ธ๋ก์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ๋ธ๋ก ๊ฐ์ ธ์ค๊ธฐ ํ๋กํ ์ฝ์ด ํ์ํ์ง ์์ต๋๋ค. local-tx-submission ํ๋กํ ์ฝ์ ๋ ธ๋ ๊ฐ ํธ๋์ญ์ ์ ์ถ ํ๋กํ ์ฝ๊ณผ ๋น์ทํ์ง๋ง ๋ ๊ฐ๋จํ๋ฉฐ, ํธ๋์ญ์ ์ ํจ์ฑ ๊ฒ์ฌ ์คํจ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ฐํํฉ๋๋ค. local-state-query ํ๋กํ ์ฝ์ ํ์ฌ ์์ฅ ์ํ์ ๋ํ ์ฟผ๋ฆฌ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ฌ๊ธฐ์๋ ์ฒด์ธ ์์ฒด์ ์ง์ ๋ฐ์๋์ง ์๋ ํฅ๋ฏธ๋ก์ด ๋ฐ์ดํฐ๊ฐ ๋ง์ด ํฌํจ๋์ด ์์ต๋๋ค.
์ปค๋งจ๋ ๋ผ์ธ ์ธํฐํ์ด์ค(CLI)
๋ ธ๋์ CLI ๋๊ตฌ๋ ์์คํ ์์ "์ค์์ค ์๋ฏธ ๋์ดํ"์ ๊ฐ์ต๋๋ค. ๊ฑฐ์ ๋ชจ๋ ์์ ์ ์ํํ ์ ์์ง๋ง, ํ ์คํธ ๊ธฐ๋ฐ์ด๊ณ ๊ทธ๋ํฝ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(GUI)๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ์ ์์ค์ด๋ฉฐ ๊ทธ๋ค์ง ํธ๋ฆฌํ์ง ์์ต๋๋ค.
CLI ๋๊ตฌ๋ ๋ค์์ ์ํํ ์ ์์ต๋๋ค:
- ๋ ธ๋์ ์ ๋ณด ์ฟผ๋ฆฌ
- ํธ๋์ญ์ ์ ์ถ
- ํธ๋์ญ์ ๊ตฌ์ฑ ๋ฐ ์๋ช
- ์ํธํ ํค ๊ด๋ฆฌ
๋ค์ด๋ฌ๋ก์ค ์ง๊ฐ
๋ค์ด๋ฌ๋ก์ค๋ ์ฌ์ฉ์๊ฐ ์์ด๋ค๋ฅผ ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ ํ ๋ ธ๋ ์ง๊ฐ์ผ๋ก, ์นด๋ฅด๋ค๋ ธ ๋ธ๋ก์ฒด์ธ์์ ์ง๋ถ์ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค. ๋ค์ด๋ฌ๋ก์ค๋ ์ง๊ฐ ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํ๋ก ํธ์๋๋ ์ฌ์ฉ์๊ฐ ๋ณด๊ณ ์ํธ์์ฉํ๋ ๊ทธ๋ํฝ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค. ๋ฐฑ์๋๋ ์ฌ์ฉ์ ์ง๊ฐ์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ์ฝ์ธ ์ ํ, ํธ๋์ญ์ ๊ตฌ์ฑ ๋ฐ ์ ์ถ๊ณผ ๊ฐ์ ๋ชจ๋ '๋ฌด๊ฑฐ์ด ์์ โ์ ์ํํ๋ ์๋น์ค ํ๋ก์ธ์ค์ ๋๋ค. ๋ฐฑ์๋๋ ๋ ธ๋-ํด๋ผ์ด์ธํธ IPC ํ๋กํ ์ฝ์ ํตํด ๋ก์ปฌ ๋ ธ๋์ ์ํธ ์์ฉํ๊ณ HTTP API๋ฅผ ํตํด ํ๋ก ํธ์๋์ ์ํธ ์์ฉํฉ๋๋ค. ๋ฐฑ์๋๋ ์ง๊ฐ๊ณผ ์ํธ์์ฉํ ์ ์๋ CLI๋ ์ ๊ณตํฉ๋๋ค. ์ง๊ฐ ๋ฐฑ์๋๋ API๋ฅผ ํตํด ๋ค์ด๋ฌ๋ก์ค ์์ด๋ ์์ฒด์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์๊ฐ ์นด๋ฅด๋ค๋ ธ๋ฅผ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์์คํ ๊ณผ ํตํฉํ ์ ์๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ๋๋ค.
์นด๋ฅด๋ค๋ ธ๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ ๋๋ถ๋ถ์ ๊ณ ๊ธ ์ฌ์ฉ์๋ ๋ค์ด๋ฌ๋ก์ค์์ ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
cardano-db-sync
์นด๋ฅด๋ค๋ ธ ๋ ธ๋๋ ๋ธ๋ก์ฒด์ธ ์์ฒด์ ๋ธ๋ก์ฒด์ธ ๊ฒ์ฆ์ ํ์ํ ๊ด๋ จ ์ ๋ณด๋ง ์ ์ฅํฉ๋๋ค. ์ด ์ค๊ณ ์์น์ ์ฝ๋ ๋ณต์ก์ฑ์ ์ต์ํํ๊ณ ๊ณ์ฐ ๋น์ฉ๊ณผ ๋ฆฌ์์ค ์ฌ์ฉ์ ์ค์ฌ ๋ ธ๋์ ๋ก์ปฌ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ฅํ ํ ์ต์ํ์ผ๋ก ์ ์งํ๊ณ ์ธ๋ถ ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ๊ณ ํธ๋ฆฌํ ์ธํฐํ์ด์ค์ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ํนํ ๋ ธ๋์์๋ ๋ธ๋ก์ฒด์ธ์ ๊ธฐ๋ก ์ ๋ณด์ ๊ด๋ จ๋ ์ฟผ๋ฆฌ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ด ๋ฐ์ดํฐ ์๋น์ค๋ ๊ตฌ์กฐํ๋ ์ฟผ๋ฆฌ ์ธ์ด(SQL) ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ณ๋์ ์ปดํฌ๋ํธ์์ ์ ๊ณตํฉ๋๋ค.
๋ ์์ธํ ์ฝ์ด๋ณด์ธ์:
* Source: https://docs.cardano.org/explore-cardano/cardano-architecture/
* Translation: Ilhun@CryptoVeri enics_sky@naver.com