Hyperledger Besu์ ์ํคํ ์ณ
์ด ์ ์, Besu๋ ์ด๋๋ฆฌ์ ํ๋กํ ์ฝ์ ๊ตฌํํ ์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ๋ผ๊ณ ์ด์ผ๊ธฐํ์๋ค. ์ด ์์ Besu๋ EEA์ ํ๋กํ ์ฝ์ ๊ตฌํํจ์ผ๋ก์จ ์ด๋๋ฆฌ์์ ํ๋ผ์ด๋น ํธ๋์ญ์ , ํ๊ฐ์ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ์ถ๊ฐ๋ก ํ์ฅํ๋ค. ๋๋ถ๋ถ์ Besu์ ๊ตฌ์กฐ์ ์ธ ๊ตฌ์ฑ๊ณผ ๊ฐ๋ ์ด ์ด๋๋ฆฌ์์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์, ์ด๋๋ฆฌ์์ ๋ํ ์ค๋ช ๋ ๊ฐ์ด ํ๊ณ ์ ํ๋ค. ์ด๋๋ฆฌ์์ ํ๋กํ ์ฝ์ด๊ธฐ ๋๋ฌธ์, ๋จ ํ๋์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ด ์๋ ๊ฒ์ด ์๋๋ค. Go-Ethereum ๋ฅผ ํ์ค์ผ๋ก ์น๋ ๊ฒฝ์ฐ๋ ์์ง๋ง, Open Ethereum๊ณผ ๊ฐ์ด ๋ค๋ฅธ ๊ตฌํ๋ ์กด์ฌํ๋ค). Besu๋ ๋ค๋ฅธ ์ด๋๋ฆฌ์ ๊ตฌํ์ forkํด์จ ๊ฒ์ด ์๋๋ค. JAVA๋ก ์ด๋๋ฆฌ์ ํ๋กํ ์ฝ์ ์์ฒด์ ์ผ๋ก ๊ตฌํํ ๊ฒ์ด๋ค. ๋๋ฌธ์ ๋น์ทํ ์์ ์ ํ๊ณ ์๋ ์กฐ์ง๋ค๋ Besu๋ฅผ ์ฃผ๋ชฉํ๊ณ ์๋ค.
- 0. ๋ ธ๋
- 1. ๊ณ์
- 2. ์ฅ๋ถ
- 3. ์ค๋งํธ ์ปจํธ๋ํธ
- 4. ์ด๋๋ฆฌ์ ๊ฐ์๋จธ์
- 5. ๋คํธ์ํฌ์ ์ํธ์์ฉ
- 6. ํ๊ฐ
0. ๋ ธ๋
Besu ๋คํธ์ํฌ๋ ์์ ํ ๋์ผํ ํผ์ด ๋ ธ๋์ ์ํด ์คํ๋๊ณ , ๊ฐ ๋ ธ๋๋ Besu ์ํฐํ๋ผ์ด์ฆ ์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ ์ธ์คํด์ค๋ฅผ ์คํํ๋ค. ํผ์ด๋ค ๊ฐ์ ํต์ ์ ์์ ํ P2P ๋ฐฉ์์ผ๋ก ์งํ๋๊ณ , ์ฝ๊ฐ์ ์ค์ํ(ํ์ค์ํ์ ๋ฐ๋)๋ ๋ค๋ฅธ ๋ ธ๋ ํ์ ์ ํ์ฉํ์ง ์๋๋ค. ์ด ๋ ธ๋๋ค์ ๋ชจ๋ ํธ๋์ญ์ ๊ณผ ํจ๊ป ์ฅ๋ถ๋ฅผ ์ ์ฅํ๊ณ ์๋ ์ ์ฒด ๋ธ๋ก์ฒด์ธ์ ์ ์ฅํ๊ณ , ํ๋ ธ๋(Full Node)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํ๋ ธ๋๋ค์ ๋ชจ๋ ํธ๋์ญ์ ์ ์์ฐจ์ ์ผ๋ก ์คํ('๋น ๋ฅธ ๋๊ธฐํ' ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๋๋ค)ํด์ผํ๊ธฐ ๋๋ฌธ์, ๊ทธ๋ค์ ๊ฐ์ฅ ์ต์ ์ world state๋ฅผ ๊ฐ๋๋ค. ๋คํธ์ํฌ์ ์๋ก์ด ํ๋ ธ๋๋ ๋ค๋ฅธ ํผ์ด์๊ฒ ๋ธ๋ก์ ์์ฒญํด์ ์ด world state๋ฅผ ์ ๊ฑฐํ ์ ์๋ค. ํ์ง๋ง, ํ๋ ธ๋๋ ์ค์ง ๊ฐ์ฅ ์ต์ ์ world state๋ง ์ ์งํ๊ณ ์๊ธฐ ๋๋ฌธ์, ํ๋ ธ๋๋ ์ด์ ๋ธ๋ก์ state๋ฅผ ๋น ๋ฅด๊ฒ ์กฐํํ ์๋ ์๋ค(ํ์ฌ head ์ ๋ธ๋ก์ ์๊ณ , ์ค๋งํธ ์ปจํธ๋ํธ state ๋ฑ).
๋น๋ก ์์์ ์์ ํ ๋์ผํ ๋ ธ๋๋ค์ด ๋คํธ์ํฌ๋ฅผ ๊ตฌ์ฑํ๋ค๊ณ ํ์ง๋ง, ์ฝ๊ฐ์ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์๋ค. ์์นด์ด๋ธ ๋ ธ๋๊ฐ ์ถ๊ฐ์ ์ผ๋ก ํ๋ ธ๋์ ํ์ฅ ๊ฐ๋ ์ผ๋ก ์กด์ฌํ๋๋ฐ, ์ด ๋ ธ๋๋ค์ ๊ฐ ๋ธ๋ก์ ๊ฐ์ ๋ชจ๋ ์ค๊ฐ world state๋ฅผ ์ ์ฅํด์, ๋ค์ ํธ๋์ญ์ ๋ค๋ก ๋ค์ ๊ณ์ฐํ์ฌ ์ด์ ์ world state๋ฅผ ๊ฐ์ ธ์ฌ ํ์๊ฐ ์๊ฒ๋ํ๋ค. ๋์ ์์นด์ด๋ธ ๋ ธ๋๋ ๋ ๋ง์ ์ ์ฅ๊ณต๊ฐ์ด ํ์ํ๋ค. ์์นด์ด๋ธ ๋ ธ๋๋ ํ๋ ธ๋์ ํ์ฅ ๊ฐ๋ ์ด๋ฏ๋ก, ํ ๋ ธ๋์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ์ฃผ์ ๋ ์กฐ์ง๊ณผ ๋ ธ๋์ ๊ด๊ณ์ด๋ค. Besu์์๋ '์กฐ์ง'์ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ ๊ด๊ณ๋ ๊ต์ฅ์ด ๋จ์ํ๋ค. ๋ชจ๋ ๋ ธ๋๋ค์ด ๊ทธ๋ค ์์ ์ public / privateํค๋ฅผ ๊ฐ์ง๊ณ ์์ ์ ์ ์์ ์ฆ๋ช ํ๋ค. ์ด๊ฒ์ ๋คํธ์ํฌ์ ์ฐธ์ฌํจ์ ์์ด ์กฐ์ง์ด ํจ์ฌ ์ ์ฐํจ์ ์๋ฏธํ๋ค: ์์ ์กฐ์ง์ ํ๋์ ๋ ธ๋๋ฅผ ์ด์ฉํด ์ฐธ์ฌํ๊ณ , ํฐ ์กฐ์ง์ ์ฌ๋ฌ ๊ฐ์ ๋ ธ๋๋ฅผ ์ด์ฉํด ์ฐธ์ฌํ ์๋ ์๋ค.
๋คํธ์ํฌ ์์ฑ
Besu๋ ๋คํธ์ํฌ๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ญ์ ๊ต์ฅํ ๋จ์ํ๋ค. ์ด ๊ณผ์ ์ ํฌ๊ฒ 3๊ฐ์ ๋จ๊ณ๋ฅผ ํฌํจํ๋ค.
- ์ ๋ค์์ค ํ์ผ์ ์ค์ ํ๋ค. ์ด๊ฒ์ ์ ๋ค์์ค ๋ธ๋ก์ ๋ง๋๋๋ฐ ์ฌ์ฉ๋๋ค.
- ๊ฐ ๋ ธ๋๋ณ ์ค์ ์ด config.toml์ ์ค์ ๋์ด์ผ ํ๋ค.
- ๋ง์ง๋ง์ผ๋ก ๋ ธ๋๋ฅผ ์คํํ๋ค.
์ ๋ค์์ค ์ค์ ํ์ผ์ ๋น๊ต์ ์๊ณ , ์ ์ฒด ๋คํธ์ํฌ์ ์ ์ฉํ ๋ค์ํ ์ค์ ๋ค์ ํฌํจํ๊ณ ์๋ค. ์ด ์ค ํ๊ฐํ ๋คํธ์ํฌ์์ ์ฃผ์ํ 4๊ฐ์ง ์ค์ ๊ฐ๋ค์ ์ดํด๋ณด์.
- config : ๋คํธ์ํฌ์์ ์ฌ์ฉํ ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์ ํ๋ค.
- gasLimit : ๋ธ๋ก์ ์ต๋ ๊ฐ์ค๋์ ์ ํ๋ค. ๊ธฐ์ ์์๋ ๋ณดํต gas ์์ด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์ต๋ ๊ฐ์ผ๋ก ์ค์ ํ๋ค.
- contractSizeLimit : contract์ ์ฌ์ด์ฆ๋ฅผ ์ ํํ๋ค. ๊ธฐ๋ณธ 24KB๋ก ์ค์ ๋์ด ์๋ค. ํ์(์ฑ ๊ตฌํ)์ ๋ฐ๋ผ ๋๋ฆด ์ ์๋ค.
- alloc : ์ค๋งํธ ์ปจํธ๋ํธ๋ ์ ๊ทผํ ๊ณ์ ๊ณผ ์ด๊ธฐ ์๊ณ ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํ๋๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
๋คํธ์ํฌ๋ฅผ ์์ฑํ์ผ๋ ๋ค์, ๊ฐ ๋ ธ๋๋ค์ด ์ค์ ๋์ด์ผ ํ๋ค. ์ด ๊ณผ์ ์ญ์ ๋งค์ฐ ๊ฐ๋จํ๋ค. ๊ฑฐ์ ๋ชจ๋ ๊ธฐ๋ฅ๋ค์ ์ค์์น ์ฒ๋ผ ์จ-์คํ๋ก ์ค์ ํ ์ ์๋ค. rpc-http-enabled, rpc-ws-enabled, graphql-http-enabled ์ต์ ๋ค๊ณผ ํธ์คํธ, IP ์ต์ ์ ์ด ๋ ธ๋๊ฐ ๊ธฐ๋ฅ์ JSON-RPC๋ฅผ ํตํด ์ ๊ณตํ ์ง, WebSocket์ ํตํด ์ ๊ณตํ ์ง, GraphQL๋ก ์ ๊ณตํ ์ง ์ ํํ ์ ์๋๋ก ํด์ค๋ค. Metrics-enabled๋ Prometheus ๊ฐ์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ธ๋ก์ฒด์ธ์ ๋ฉํธ๋ฆญ์ค๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์กฐ์ฌํด ๋์ด, ๋ง์ง๋ง ๋ธ๋ก ๋ฒํธ, ์ฐ๊ฒฐ๋ ํผ์ด, ํผ์ด๋ณ ์ฐ๊ฒฐ๋ ํผ์ด ์ ๋ฑ๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋๋ก ํ์ฉํ๋ค. permissions-nodes-config-file์ ํตํด ๋ ธ๋๋ณ๋ก ๋ค๋ฅธ ๊ณ์ ๊ณผ ๋ ธ๋์ ์ ๊ทผ์ ์ ํํ ์ ์๋ค. min-gas-price๋ ํน๋ณํ ํ๊ฐํ ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ๋ฅผ ์ํด ์ค์ํ๋ฐ, 0์ผ๋ก ์ค์ ํ์ง ์์ผ๋ฉด ์ผ์ ๋์ ๊ฐ์ค๋ฅผ ๋ง์กฑํ์ง ์์ผ๋ฉด ํธ๋์ญ์ ์ ์คํํ์ง ์์ ๊ฒ์ด๋ค. bootnodes๋ ์๋ฏธ๋ฅผ ์ ๋๋ก ์๋๊ฒ์ด ์ค์ํ๋ค. ๋ ธ๋๋ฅผ ์คํํ๋ฉด, ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋์ด ์๋ ์ด๋ค ๋ ธ๋ ์ค ํ๋๋ฅผ ์ฐธ์กฐํ์ฌ ํ์ฌ ์คํํ๋ ค๋ ๋ ธ๋๊ฐ ์ฐ๊ฒฐํ ํผ์ด์ ๋ํ ์ ๋ณด๋ฅผ ์ป๋๋ค. ์ด๋ฆ์ด ๋ ธ๋์ ์ข ๋ฅ ๊ฐ์์ ๋ ธ๋์ ๋ถํ ์ ๋์์ฃผ๋, ๋คํธ์ํฌ์ ๋ฌธ์ง๊ธฐ์ฒ๋ผ ์ค์ํ๋ ํํ๋ฅผ ์์ํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฐํน ์์ง๋ง ํท๊ฐ๋ฆฌ์ง ๋ง์. bootnodes๋ก ์ค์ ํ๋ ๋ ธ๋๋ ๋ค๋ฅธ ๋ ธ๋์ ๋๊ฐ์ ๋ ธ๋์ด๋ค. ๊ฒฐ๊ตญ, ํผ์ด๋ ๊ฐ์ ์ค์ ํ ๋ถํธ๋ ธ๋๋ฅผ ๋คํธ์ํฌ์ ์ด๋ค ๋ ธ๋๋ก๋์ง ๋ฐ๊ฟ ์ ์๋ค.
๋ง์ฝ ํผ์ด์ ์ต์ ์ซ์(ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค)๋ฅผ ์ฐพ์ผ๋ฉด, ๋คํธ์ํฌ๊ฐ ๋์๋๊ธฐ ์์ํ๋ค. ์ผ๋ง๋ ๋ค์ํ ์กฐ์ง๋ค์ด ํผ์ด์ ๊ด์ ์ผ๋ก ๋คํธ์ํฌ๋ฅผ ํตํด ํ์ ํ ์ ์๋์ง ๊ทธ๋ฆผ 3.12์์ ๋ณด์ฌ์ค๋ค. ์กฐ์ง๋ค์ ๊ตฌ๋ถ์ด ์ ๋๋ผ๊ณ ์์น ํ ๊ฒ์ด์ง, ๊ธฐ์ ์ ์ผ๋ก ๋ค๋ฆ์ ๋ํ๋ด์ง ์๋๋ค. ์ด์ ์๋ ๋งํ์ง๋ง Besu์๋ ์กฐ์ง์ด๋ผ๋ ์ปจ์ ์์ฒด๊ฐ ์๋ค. ํ์ง๋ง ๊ธฐ๊ด์์ ํ๋์ ๋ ธ๋๋ฅผ ๋ฉ์ธ ๋ถํธ ๋ ธ๋๋ก ์ฌ์ฉํ๋ฉด์, ๋ค๋ฅธ ๊ธฐ๊ด์ ๋คํธ์ํฌ์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ๋ ์ฌ์ฉํ ์๊ฐ ์๋ค. ๊ทธ๋ฆผ 3.12์์ ์ดOrg3์ ๊ฒฝ์ฐ๊ฐ ๊ทธ๋ฌํ๋ค. ์ด ๋ค์ด์ด๊ทธ๋จ์ ํตํด์, ์กฐ์ง์ด ๊ทธ๋ค์ bootnode๋ฅผ ์ ํ๋ ๋ฐ์ ์์ด, ๊ต์ฅํ ์ ์ฐํ๋ฉฐ ์ฌ๋ฌ๊ฐ์ ์กฐ์ง์ ๊ฑธ์ณ ์ฌ๋ฌ๊ฐ์ ๋ ธ๋๋ฅผ ์์ ์ bootnode๋ก ์ค์ ํ ์ ์์์ ํ์ธํ ์ ์๋ค. ์ฌ์ค ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋ ํ๋์ ๋ ธ๋์๋ง ์ฐ๊ฒฐ๋์ด ์์ด๋, peer discovery๋ฅผ ํตํด ๋คํธ์ํฌ ์์ ๋ชจ๋ ๋ ธ๋์ ํต์ ํ ์ ์๋ค.
1. ๊ณ์
์์์๋ ๋ ธ๋๊ฐ ๋ฌด์์ธ๊ฐ, ์ด๋ป๊ฒ ๊ทธ๋ค๋ผ๋ฆฌ ์๋ก ์ฐ๊ฒฐํ๊ณ , ์ด๋ป๊ฒ ๋คํธ์ํฌ๋ฅผ ๊ตฌ์ฑํ๋๊ฐ์ ๋ํด์ ์ค๋ช ํ๋ค. ํ์ง๋ง, ์ด ๋ ธ๋๋ค์ด ํธ๋์ญ์ ์ ์์ฑํ๊ณ ์ฌ์ธํ๋๋ฐ์ ์ฐธ์ฌํ๋ ๊ฒ์ ์๋๋ค. ๊ทธ๋ค์ ์ ์ผํ ์ญํ ์ ์ฅ๋ถ๋ฅผ ๊ณ์ํด์ ์ถ์ ๊ด๋ฆฌํ๊ณ , ๋ธ๋ก์ ๋ง๋ค๋ฉฐ ํธ๋์ญ์ ์ ๊ฒ์ฆํ๋ ๊ฒ์ด๋ค. ํธ๋์ญ์ ์ ๊ณ์ ์ ์ํด ์์ฑ๋๊ณ ์ฌ์ธ๋๋ค. ์ฌ์ค, ์ด๋ฌํ ๊ณ์ ๋ค์ ๋คํธ์ํฌ์ ์์ ํ ๋ฌด๊ดํ ์๋ ์๋ ๊ฐ์ฒด๋ค์ด๋ค. ํธ๋์ญ์ ์ ๊ณ์ ๊ณผ ๊ณ์ ์ฌ์ด์ ์ผ์ด๋๋ค. ์์ฝํ๋ฉด, ๋ ธ๋๋ค์ด ๋คํธ์ํฌ์ ์ธํ๋ผ์ ๋ถ๊ณผํ๋ฉฐ, ๊ณ์ ๋ค์ด ์ธํ๋ผ ์์์ ์ค์ ํ๋์ ํ๋ ๊ฐ์ฒด๋ค์ด๋ผ๋ ์ฌ์ค์ด๋ค. ๊ณ์ ์๋ ๋ ์ข ๋ฅ๊ฐ ์๋ค. EOA(Externally Owned Accounts)์ SCA(Smart Contract Account)๊ฐ ์๋ค. ๋ ํ์ ์ ๊ณ์ ๋ชจ๋ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ํ์ฉํ์ฌ ์ํธ์์ฉํ ์ ์๋ค.
EOA (Externally Owned Account)
EOA๋ ๊ฐ์ธ์ด๋ ๊ทธ๋ฃน์ด ๊ฐ์ง ์ ์๋ ์ ํ์ ์ธ ํ์ ์ ๊ณ์ ์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก EOA๋ ํ ์์ ๊ณต๊ฐํค์ ๊ฐ์ธํค์ด๋ฉฐ, ์์ ํ ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ์ ๋ฐ๊นฅ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก, ๊ณ์ ์ ๋๊ตฌ๋ ์์ฑํ ์ ์๊ณ , ๋คํธ์ํฌ๊ฐ ๋นํ๊ฐํ์ด๊ฑฐ๋, ์ก์ธ์ค ๊ถํ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ด๋๋ฆฌ์ ๊ธฐ๋ฐ ๋คํธ์ํฌ์์ ์ฌ์ฉํ ์ ์๋ค. ๊ณต๊ฐํค-๊ฐ์ธํค ์์ ํ์๊ณก์ ์ํธ๋ฅผ ํตํด ์์ฑ๋๋ฉฐ, ์ด๊ฒ์ RSA(Rivest-Shamir-Adleman)์ ๋นํด ๋ ๋น ๋ฅด๊ณ ์์ ํ ๋ฐฉ๋ฒ์ด๋ค.
๊ณ์ ์ ์์ฑํ๊ธฐ ์ํด์, ๋จผ์ 0๊ณผ 2256 ์ฌ์ด์ ์ ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ธ ํค๋ฅผ ์์๋ก ์์ฑํ๋ค. ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ฝ 1077๊ฐ์ ๊ฐ์ธํค๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฐ์ฃผ์์ ๊ด์ธก ๊ฐ๋ฅํ ์์๋๋ณด๋ค 100๋ฐฐ~1000๋ฐฐ ๋ฐ์ ์ ์ง ์์ ์์น์ด๋ค. ๊ฐ์ ๊ฐ์ธํค๋ฅผ ๊ฐ๊ฒ ๋๋ ๊ฒ์ด ์ผ๋ง๋ ๋ฎ์ ํ๋ฅ ์ธ์ง ์ ์ ์๋ค. ๊ฐ์ธ ํค๋ ๊ณต๊ฐ ํค๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. secp256k1 ์๊ณ ๋ฆฌ์ฆ์ ๊ณต๊ฐ ํค๋ฅผ ๊ณ์ ์ ์ฃผ์๋ฅผ ๋ํ๋ด๋ ํ๋์ ์ ์๋ก ์์ถํ๋ฉฐ, ์ด ์ ์๋ ๋ณดํต 16์ง์ ๋ฌธ์์ด๋ก ํํ๋๋ค. ์ด ๊ณต๊ฐ ํค์ ๊ฐ์ธ ํค๋ฅผ ๊ฐ์ง๊ณ PKI๊ฐ ์๋, ECDSA(Elliptic Curve Digital Signature Algorithm)์ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ์ ์๋ช ํ๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก, ์ฐธ์ฌ์๋ค์ ๊ณต๊ฐ ํค๋ฅผ ์๋ก ๊ณต์ ํ ํ์๊ฐ ์๋ค. ์ด๊ฒ์ด ์ ๊ณต๊ฐํค๊ฐ ์ฌ์ ์ ์ฅ๋ถ์ ๋ฑ๋ก๋์ง ์๊ณ ๋, EOA๊ฐ ์คํ์ฒด์ธ์์ ์์ฑ๋ ์ ์๋ ์ง๋ฅผ ์ค๋ช ํ๋ค.
SCA (Smart Contract Account)
SCA๋ EOA๊ฐ ์ค๋งํธ ์ปจํธ๋์ ์ฌ์ฉํ ๋ ์๋์ผ๋ก ์์ฑ๋๋ค. SCA๋ ๋ ๊ทธ ์์ ๋ง์ ์ฃผ์๋ฅผ ๊ฐ๋๋ฐ, ์ด๊ฒ์ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ์์ฑํ EOA์ ์ฃผ์์ nonce๊ฐ์ ์ธ์ฝ๋ฉํ์ฌ keccak256์ผ๋ก ์์ฑํ๋ค. SCA ์ฃผ์๋ ๊ณ์ ์ ์ฃผ๋ ์๋ณ์์ด๋ฉฐ ๋ค๋ฅธ ๊ณ์ ์ด ์ด ์ฃผ์๋ฅผ ์ฐพ์ ์ํธ์์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํค ์ ๊ตฌ์กฐ
๋น๋ก Besu์ ๋ชจ๋ ๊ฐ๊ฐ์ ๋ ธ๋์ ๊ณ์ ์ด ๊ณต๊ฐ ํค/๊ฐ์ธ ํค ์์ ํ๋์ฉ ๊ฐ์ง๊ณ ์๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด์ง๋ง, ํน์ ์์์ ์กฐ์ง์ด ์ฌ์ธ์ ํ ์ ์๋ ์ฌ์ง๊ฐ ์๋์ง ํ์ธํด ๋ณผ ํ์๊ฐ ์๋ค. Besu๋ ECDSA๋ก ๊ณต๊ฐ ํค/๊ฐ์ธ ํค ์์ ์ฌ์ฉํ๋ค. ๊ณต๊ฐ ํค/๊ฐ์ธ ํค๋ ํ๋์ ํ ์คํธ์ด๋ฉฐ, ๊ฐ์ธ ํค๋ 256๋นํธ์ ์ ์์ ๋์ํ๋ 64๋นํธ 16์ง์์ ์ ์์ด๋ค. ๊ณต๊ฐ ํค๋ 512๋นํธ์ ์ ์์ ๋์ํ์ฌ secp256k1์ ํ์ ๊ณก์ ์ ์ด์ฉํด ์์ฑ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํค๋ค์ ํจ๋ธ๋ฆญ์์ ์ฌ์ฉ๋๋ ์ธ์ฆ์์ ๋ค๋ฅด๊ฒ ํญ์ ์ซ์๋ก ์ฌ์ฉ๋๋ค. Besu์์ ํค๋ค์ ์ธ์ฆ์๋ก ํฌ์ฅ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์, ์์ ์กฐ์ง์ ์ํด ์ฌ์ธ์ด ๋ ์ ์๋ค.
2. ์ฅ๋ถ(Ledger)
Besu์ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ์ ์ฅ๋๋์ง ์ดํดํ๋ ค๋ฉด, ๋ํ๋จผํธ๊ฐ ๊ต์ฅํ ์ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ์์ค์ฝ๋๋ฅผ ์ดํด๋ณผ ์ ๋ฐ์ ์๋ค. ์์ค์ฝ๋๋ฅผ ๋ณด๋ฉด StorageProvider๋ผ๋ ํ์ฌ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ ์๋ค.
// 3.1 StorageProvider
public interface StorageProvider extends Closeable {
BlockchainStorage createBlockchainStorage ( ProtocolSchedule protocolSchedule );
WorldStateStorage createWorldStateStorage ( DataStorageFormat dataStorageFormat );
WorldStateStorage createPrivateWorldStateStorage () ;
GoQuorumPrivateStorage createGoQuorumPrivateStorage () ;
}
์ฒซ์งธ๋ก, BlockchainStorage๋ ๋ธ๋ก์ ์ ์ฅํ๋๋ฐ์ ์ฌ์ฉ๋๋ค. ๋ธ๋ก์ ํด์์ ๋ณธ๋ฌธ์ ์ ๊ณตํด์, ๋ธ๋ก์ ์ ์ฅํ ๋ ํ์ํ put-์ฐ์ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ด ๋ธ๋ก๋ค์ ์ธ๋ถ์ ํค-๋ฐธ๋ฅ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํด ์ ์ฅํ ์ ์๋ค. ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ฒ์ rocksdb๋ก ์ค์ ๋์ด ์์ง๋ง, ๋ค๋ฅธ ํค-๋ฐธ๋ฅ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ตฌํํด ์ฌ์ฉํ ์ ์๋ค. BlockchainStorage๋ ๋น ๋ฅด๊ฒ ๋ธ๋ก์ ์กฐํํ ์ ์๋๋ก, ๋ธ๋ก ๋ฒํธ์์ ๋ธ๋ก ํด์๋ก์ ๋งตํ ๋ํ ์ ์ฅํ๊ณ ์๋ค.
๋๋ฒ์งธ๋ก, WorldStateStorage๋ฅผ ํตํด world state์ ์ ์ฅํ๋ค. ์ด world state์ ํธ๋ผ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ ์ ์ฅ๋๋ค. ์ด ์ญ์ key-value ์ ์ฅ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ ์ ์๋ค. ๊ธฐ๋ณธ๊ฐ์ผ๋ก, ์ฝ๊ฐ ๋ณํ๋ Bonsai Trie ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ฌ์ฉ๋๋ค. ์ด๊ฒ์ ์์ ํ๊ธฐ ์ํ ๊ฐ์ด ์จ๊ฒจ์ ธ ์๋ ๊ฒ์ผ๋ก ๋ณด์ ๊ถ์ฅ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ผ๊ณ ์๊ฐ๋๋ค. ์ฌ์ค ์ค์ํ ๊ฒ์ ์ด ๋ฐ์ดํฐ ํ์ ์ ์ด๋ค ์ข ๋ฅ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋๊ฐ์ด๋ค. ๋ค์ ์ค๋ช ํ๊ฒ ์ง๋ง world state๋ ๊ณ์ ์ฃผ์์์ ๊ณ์ state๋ก์ ๋งคํ ์ ๋ณด ์ญ์ ํฌํจํ๊ณ ์๋ค. ์ค๋งํธ ์ปจํธ๋์ ์ฃผ์(ํด์)์์ ์ฝ๋๋ก์ ๋งคํ ์ ๋ณด์ญ์ ํฌํจํ๊ณ ์๋ค. ์ฌ์ค, ์ด ์ฝ๋ ์์ฒด๊ฐ ์ค๋งํธ๋์ด๋ค. ๋ง์ง๋ง์ผ๋ก world state๋ ๊ณ์ ์ ํด์์์ ๊ณ์ ์ ์ ์ฅ๊ณต๊ฐ๊น์ง์ ๋งคํ ์ญ์ ํฌํจํ๊ณ ์๋ค. ์ ์ฅ๊ณต๊ฐ์ ์ค๋งํธ ์ปจํธ๋์ ์ ๋ํฌํ key-value ๋งคํ์ ์ฐธ์กฐํ๋ค.
// 3.2 Storing of World State in Besu
public interface WorldStateStorage {
interface Updater {
Updater putAccountStateTrieNode ( Bytes location , Bytes32 nodeHash , Bytes node );
Updater putCode ( Hash accountHash , Bytes32 nodeHash , Bytes code );
Updater putAccountStorageTrieNode ( Hash accountHash , Bytes location , Bytes32 nodeHash ,
Bytes node );
}
}
์ธ๋ฒ์งธ๋ก, createPrivateWorldStateStorage()๋ผ๋ ํจ์๋ ๊ฐ์ ๋ฐ์ดํฐ ํ์ (WorldStateStorage)์ ๋ฐํํ๋ค. ์ด๊ฒ์ ํตํด์, ์ฐ๋ฆฌ๋ ํ๋ผ์ด๋น ๋ฐ์ดํฐ๋ ํ๋ผ์ด๋น ๋ฐ์ดํฐ ๋ง์ world state๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ๋คํธ์ํฌ์ world state์๋ ์์ ํ ๋ถ๋ฆฌ๋์ด ์์์ ์ ์ ์๋ค. ๋ง์ง๋ง ํจ์์ธ createGoQuorumPrivateSotrage()๋ก Besu์ world state๊ฐ GoQuorum์ด๋ผ๋ ๋๋ค๋ฅธ ์ํฐํ๋ผ์ด์ฆ ์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ์ ํ์๊ณผ ๋์ผํ ํ์์ผ๋ก ์ ์ฅํ ์ ์์์ ์ ์ ์๋ค. ๊ทธ๋ฆผ 3.13์ด Besu ์ฅ๋ถ์ ๋จ์ํ๋ ๋ชจ์ต์ ๋ณด์ฌ์ค๋ค.
๊ณ์ ๊ตฌ์กฐ
์ด์ ์ ์ด๋๋ฆฌ์ ๋ฐฑ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๊น ๊ณ์ ์ ๋ํด ์ค๋ช ํ์ง๋ง, Besu์ ๊ณ์ ์ด ์ด๋๋ฆฌ์ ํ๋กํ ์ฝ๊ณผ ๊ฐ๋ ์ ์ผ๋ก ์์ ํ ๋๋ฑํ์ง๋ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก Besu์ ๊ณ์ ์ด ์ด๋ป๊ฒ ์ฅ๋ถ์ ์ ์ฅ์ด ๋๋์ง, accountState๋ ๋ฌด์์ธ์ง ์์๋ณผ ํ์๊ฐ ์๋ค. ๋ค์ 3.3์ AccountState์ ๋จ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ณด์ฌ์ค๋ค.
// 3.3 Account State
public interface AccountState {
Hash getAddressHash () ;
long getNonce () ;
Wei getBalance () ;
default boolean hasCode () ;
Bytes getCode () ;
Hash getCodeHash () ;
UInt256 getStorageValue ( UInt256 key );
}
์ด ์ฝ๋ ์กฐ๊ฐ์์, ๋ชจ๋ ๊ณ์ ์ ํธ๋์ญ์ ์ ํ๊ธฐ ์ํ ์ฃผ์์ธ AddressHash๋ฅผ ์ํ ํ๋๋ฅผ ๊ฐ์ง๊ณ ์์์ ์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ณ์ ์ด Nonce์ ์ฐ๊ฒฐ์ง์ด์ ธ ์๋ค. ๋์ค์ ์ดํด๋ณด๊ฒ ์ง๋ง, ๋ชจ๋ ํธ๋์ญ์ ์ ํ๋์ EOA์ ์ํด ์ฌ์ธ ๋ฐ ์ด๊ธฐํ๋๋ค. ๋ชจ๋ EOA์ ํธ๋์ญ์ ์ Nonce ๊ฐ์ ๊ฐ์ง๋ฉฐ, ์ด ๊ฐ์ด ๊ณ์ ์ Nonce ๋ณด๋ค ์ปค์ผ ํธ๋์ญ์ ์ ์ ํจ์ฑ์ ๊ฒ์ฆํ๊ณ , ์ด์ค์ง์ถ์ ๋ฐฉ์งํ ์ ์๋ค. SCA์ nonce๋ ์ค์ง ๊ณ์ฝ์ด ์๋ก์ด (๋ค๋ฅธ) ๊ณ์ฝ์ ์คํํ ๋๋ง ์ฆ๊ฐํ๋ค. ๋ ๊ณ์ ์ ์ํธํํ์ ๊ด๋ จํด Balance๋ฅผ Wei ๋จ์๋ก ๊ฐ์ง๊ณ ์์์ ์ ์ ์๋ค. ๋ฌผ๋ก ํ๊ฐํ ๋คํธ์ํฌ์์๋ ๋๋ถ๋ถ ๋ถํ์ํ ์์์ด๋ค. ๊ณ์ ์ ์ฝ๋์ ์ ์ฅ์์ ์ ๊ทผํ ์ ์๋ ๊ธฐ๋ฅ ์ญ์ ์ ๊ณตํ๊ณ ์์์ ์ ์ ์๋ค. ๋ฌผ๋ก ๊ณ์ ๋ด๋ถ๊ฐ ์๋, ๋ฐ๋ก ์ ์ฅ๋์ด ์๋ ์ ๋ณด์ ๊ณ์ ์ ํด์๋ฅผ ์ด์ฉํด ์ ๊ทผํ๋ ๋ฐฉ์์ด๋ค.
์์ ์ธํฐํ์ด์ค๋ EOA์ SCA์ ๊ณตํต์ผ๋ก ์ ์ฉ๋๋ค. ํ์ง๋ง EOA๋ ์ด๋ค ์ฝ๋๋, (ํค-๊ฐ)์ ์ฅ์๋ ๊ฐ์ง๊ณ ์์ง ์๋ค. ์ฝ๋์ ์คํ ๋ฆฌ์ง๋ ์ค๋งํธ ์ปจํธ๋์ ๋ํด์๋ง ์กด์ฌํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก, ์ฐ๋ฆฌ๋ EOA์ SCA์ ๊ตฌ์กฐ์ ์ฐจ์ด๋ฅผ ๊ทธ๋ฆผ 3.14์ ๊ฐ์ด ์๊ฐํํ ์ ์๋ค. ํ์์ ํญ๋ชฉ์ ๋น์ด์๊ฑฐ๋ ์ฌ์ฉํ์ง ์๊ฑฐ๋, ํ๊ฐํ ์ค์ ์ ์ํด์๋ ๋ฌด๊ดํ ํญ๋ชฉ๋ค์ด๋ค.
ํธ๋์ญ์ ๊ตฌ์กฐ
์ด์ ์ฅ๋ถ์ ๊ตฌ์กฐ, ๊ณ์ ์ ์๋ฏธ์ ๊ตฌ์กฐ์ ๋ํด ๋ช ํํ ์๊ณ ์์ผ๋, ์ด์ ๊ณ์ ๋ค์ด ์ด๋ป๊ฒ ์ฅ๋ถ์ ํธ๋์ญ์ ์ ํตํ์ฌ ์์ ํ๋์ง ์์๋ณผ ์ ์๋ค. ํธ๋์ญ์ ์ 3.4์ ์๋ ํจ์๋ค์ ๊ตฌํํ๋ค. ์ด ์ธํฐํ์ด์ค๋ก Besu๊ฐ ํธ๋์ญ์ ํ์ ์ ๋ฉ์์ง ์ฝ๊ณผ ๊ณ์ฝ ์์ฑ์ผ๋ก ๊ตฌ๋ถํ๊ณ ์์์ ์ ์ ์๋ค.
// 3.4 Transaction Structure
public interface Transaction {
Hash getHash () ;
long getNonce () ;
Quantity getGasPrice () ;
Optional < Quantity > getGasPremium () ;
Optional < Quantity > getFeeCap () ;
long getGasLimit () ;
Optional <? extends Address > getTo () ;
Quantity getValue () ;
BigInteger getV () ;
BigInteger getR () ;
BigInteger getS () ;
Address getSender () ;
Optional < BigInteger > getChainId () ;
Optional < Bytes > getInit () ;
Optional < Bytes > getData () ;
Bytes getPayload () ;
TransactionType getType () ;
}
๋ชจ๋ ํธ๋์ญ์ ์ ์๋ณ๊ณผ nonce๋ฅผ ์ํด ์์ ๊ณ ์ ์ ํด์๋ฅผ ๊ฐ๋๋ค. ํธ๋์ญ์ ์ nonce๋ ํธ๋์ญ์ ์ ์์ฑํ ์ฌ๋์ nonce, ์ฆ ๊ณ์ ์ด ์์ฑํ ํธ๋์ญ์ ์ ๊ฐ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ธด ์ซ์์ด๋ค. ๋ง์ฝ ์ด ํธ๋์ญ์ ์ nonce๊ฐ ๊ณ์ ์ nonce ๋ณด๋ค ์๋ค๋ฉด, ํธ๋์ญ์ ์ ์ด์ ๋ธ๋ก์ด๋ ๊ฐ์ ๋ธ๋ก์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ด๋ฏธ ํฌํจ๋ ํธ๋์ญ์ ์ ์ ์คํ๋์ด์ผ ํ๋ฏ๋ก ๊ฒ์ฆ๋์ง ์๋๋ค. ๋ชจ๋ ํธ๋์ญ์ ์ด ์์์ ๋ง๊ฒ ์ ๋ ฌ๋์ด ์๊ธฐ ๋๋ฌธ์, ๋์ค์ ๋์ฐฉํ ํธ๋์ญ์ ์ ์ด๋ฏธ ํฌํจ๋ ํธ๋์ญ์ ๋ณด๋ค ๋จผ์ ์คํ๋ ์ ์๋ค(Fork์ ๊ฒฝ์ฐ ์ ์ธ). ๊ฐ์ค๋ ๋ณดํต ํ๊ฐํ ๋คํธ์ํฌ์์๋ ์ค์ ํ์ง ์์ผ๋ฏ๋ก GasPremium, FeeCap, GasLimit, Value๋ ๋นผ๊ธฐ๋ก ํ๋ค. ๊ฒ๋ค๊ฐ ๋ชจ๋ ํธ๋์ญ์ ์ ์ฌ์ธ ๊ณผ์ ์ ์ผ๋ถ๋ก์ ECDSA์ ์ํด ์์ฑ๋ V, R, S-๊ฐ์ ํฌํจํ๋ค. Sender ํญ๋ชฉ์ ํธ๋์ญ์ ์ ์์ฑํ๋ ๊ณ์ ์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ค. ์ด ๊ฐ๋ค์ V, R, S-๊ฐ์์ ํ์๋๊ธฐ ๋๋ฌธ์ Sender๊ฐ SCA๊ฐ ์๋ EOA๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ๋ถ๋ช ํ๋ค. ChainId ์ญ์ ์ฌ์ง์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด V-๊ฐ์์ ํ์๋๋ค.
์ค๋งํธ ์ปจํธ๋์ ํธ์ถํ๊ธฐ ์ํด์, ์ก์ ์๋ To ํญ๋ชฉ์ SCA ์ฃผ์์ Payload ํญ๋ชฉ์ ํจ์ ํธ์ถ, ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ถํ๋ค. ๊ณ์ฝ ์์ฑ ํธ๋์ญ์ ์ To ํญ๋ชฉ์ ์์ ์์ ์ฃผ์๋ฅผ ์ ์ ํ์๊ฐ ์๋๋ฐ, ์๋ํ๋ฉด ์ด ์ฃผ์๋ ์ก์ ์์ ์ฃผ์์ nonce์ ์ํด ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ณ์ฝ ์์ฑ ํธ๋์ญ์ ์ ์ค๋งํธ ์ปจํธ๋ ํธ์ถ๊ณผ ๋๋น๋๊ฒ๋, ์ธ์ ๋์ Payload ํญ๋ชฉ์ ์ค๋งํธ ์ปจํธ๋์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ง์ ํ๋ค. Init ํญ๋ชฉ์ ํธ๋์ญ์ ์ด ์ค๋งํธ ์ปจํธ๋์ ์์ฑํ๋ค๋ฉด Payload ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๊ณ , ๋ฉ์์ง ์ฝ์ด๋ผ๋ฉด ๋น์ด์๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก Data ํญ๋ชฉ์ ํธ๋์ญ์ ์ด ๋ฉ์์ง ์ฝ์ด๋ผ๋ฉด Payload ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๊ณ , ์ค๋งํธ ์ปจํธ๋์ด๋ผ๋ฉด ๋น์ด์๋ค. ๋ง์ง๋ง์ผ๋ก, Type์ ์ด๊ฑฐํ ํ์ ์ ๊ฐ๋ฆฌํค๋ฉฐ, ์ต๊ทผ์๋ EIP1559๋ก ์ค์ ๋์ด์๋ค. ์ด๊ฒ์ ์๋ก์ด ์ ํ์ ํธ๋์ญ์ ์ ์๋ฐฉํฅ ํธํ์ฑ์ ์ฌ์ฉ๋๋ค. ๋ ๊ฐ์ง ์ ํ์ ๊ฑฐ๋์ ๋ํ ๊ฐ์๋ ๊ทธ๋ฆผ 3.15๋ฅผ ์ฐธ๊ณ ํ์.
3. ์ค๋งํธ ์ปจํธ๋ํธ
์์์ ๋ดค๋ฏ์ด, ์ฐ๋ฆฌ๋ ์ค๋งํธ ์ปจํธ๋(ํน์ SCA)๊ฐ 3๊ฐ์ ์ฃผ์ ๊ตฌ์ฑ์์๋ก ์ด๋ฃจ์ด์ ธ ์์์ ๋ณด์๋ค: (์ฃผ์, nonce๋ฅผ ํฌํจํ)account state, ์ค๋งํธ ์ปจํธ๋ ๋ฐ์ดํธ์ฝ๋, ์ค๋งํธ ์ปจํธ๋ ์ ์ฅ์. ์ด ๊ตฌ์ฑ์์๋ค์ด ์ฅ๋ถ ์์์ ์ด๋ป๊ฒ ์ ์ฅ๋๊ณ ์ด๋ป๊ฒ ์ค ์ฐ๊ฒฐ๋๋์ง๋ ์์๋ณด์๋ค. ๋น๋ก ๊ฐ ์ค๋งํธ ์ปจํธ๋์ด ์ ์ฅ(ํน์ state)์ ๊ด์ ์์ ๋ ๋ฆฝ๋์ด ์์ง๋ง, ์ค๋งํธ ์ปจํธ๋์ ํ๋์ ๊ณ์ฝ์ด ๋ค๋ฅธ ๊ณ์ฝ์ ํธ์ถํ ์ ์๋ค๋ ์ ์์ ๊ตฌ์ฑ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ๊ตฌ์ฑ๋ ์ค๋งํธ ์ปจํธ๋์ด๋ผ๋ EOA์ ์ํด ํธ์ถ๋์ด์ผ ํ๊ณ , ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์๊ธฐ ์์ ์ ํธ์ถํ ์ ์๋ค. ์ด ์น์ ์์๋ ์ค๋งํธ ์ปจํธ๋์ด ์ด๋ป๊ฒ ์์ฑ๋๊ณ , ์ ์ง๋๋์ง ๊ฐ๋ ์ ์ธ ๋จ๊ณ์์ ์ง์คํด ์์๋ณด์.
์ค๋งํธ ์ปจํธ๋ ์ฐ๊ธฐ
์ด์ ์ ๋ดค๋ฏ์ด, ์ค๋งํธ ์ปจํธ๋์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ ์์ฑ๋๋ค. ๋ฐ์ดํธ ์ฝ๋๋ผ๋ ์ฉ์ด๋ ํต์์ ์ผ๋ก ์ปจํธ๋ ์์ฑ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ง์นญํ๋๋ฐ, ์ด๋ ์ค๋งํธ ์ปจํธ๋์ ์์ฑ์๋ฅผ ํฌํจํ๋ค. ๋ค์, ์ด ๋ฐ์ดํธ ์ฝ๋๋ ์ค์ ์ฅ๋ถ์ ์ ์ฅ๋๋ ํํ์ด์ ํธ๋์ญ์ ์ ์คํํ๋ ๋ฐํ์ ๋ฐ์ดํธ์ฝ๋๋ก ๋ฒ์ญ๋๋ค. ์ค๋งํธ ์ปจํธ๋์ ์ฅ๋ถ์ ์ฌ๋ฆฌ๊ธฐ ์ํด์, (์ ๊ทธ๋ฆผ 3.15์์ ๋ดค๋)์ปจํธ๋ ์์ฑ ๋ฐ์ดํธ์ฝ๋๋ฅผ ํฌํจํ๋ ์ปจํธ๋ ์์ฑ ํธ๋์ญ์ ์ด ์ ์ถ๋์ด์ผ ํ๋ค. ๊ฐ๋ฐ์์๊ฒ ๋ณดํต ๋ฐํ์ ๋ฐ์ดํธ์ฝ๋์ ๋ํ ์ง์์ด ํ์๋ ์๋์ง๋ง ํน์ ๋ฐ์ํ ์ ์๋ ํผ๋์ ์ค์ด๊ธฐ ์ํด์ ์์๋๋ฉด ์ข๋ค.
์ด ์ข๊ฒ๋, ๋ฐ์ดํธ์ฝ๋๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๊ฐ ์์ฑํ์ง๋ ์๋๋ค. ํ์ง๋ง, ๊ณ ๊ธ ์ธ์ด๋ฅผ ์ปดํ์ผํ์ฌ ์์ฑ๋๋ค. ์ต๊ทผ์๋ EVM์ด Solidity, Vyper, Yul(+) ๋ฑ์ ์ธ์ด๋ฅผ ์ง์ํ๊ณ ์๋ค. ์ด ์ธ์ด๋ค์ DSL์ด๋ค. ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ธ์ด๋ Solidity์ด๋ค. Solidity๋ JavaScript์ ์ํฅ์ ํฌ๊ฒ ๋ฐ์ ๋ฐ์ ์ ์ ํ์ ์ธ์ด์ด๋ค. Solidity ์ค๋งํธ ์ปจํธ๋์ ์ถ๊ฐ ํ์ผ์ ์ ์๋ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. Vyper๋ ๋ ๋ค๋ฅธ DSL์ธ์ด๋ก, ๊ฐ๊ฒฐ์ฑ, ์์ ๊ฐ๋ฅ์ฑ, ๋ณด์ ๋ฑ์ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ํ์ํ๋ค. Vyper๋ ์ฝ๋๋ฒ ์ด์ค๊ฐ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ํด ์ฒ ์ ํ๊ฒ ๊ฒ์ฆ๋์ด์ผํ ํ์๊ฐ ์์ ๋ ์ฌ์ฉํ๋ฉด ์ข์ ์ธ์ด์ด๋ค. ์๋ฅผ ๋ค๋ฉด ์ปจ์์์์ ์ฐธ์ฌํ ๊ธฐ๊ด๊ฐ์ ์๋ก๋ฅผ ์์ ํ ์ ๋ขฐํ ์ ์์ ๋ ์ฌ์ฉํ๋ฉด ์ข๋ค. ํ์ง๋ง ์ด๊ฒ์ Solidity๊ฐ ์์ ๋ถ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ๋ ์๋๋ค. ์ด๊ฒ์ ๋จ์ง Solidity๋ก ์์ฑ๋ ์ค๋งํธ ์ปจํธ๋์ด Vyper๊ฐ ์๊ฒฉํ๋ฐ์ ๋นํด ๋ ์ ์ฐํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ธ๋ฒ์งธ๋ก Yul(+)์ ๊ต์ฅ์ด ๋ก์ฐ ๋ ๋ฒจ์ ์ธ์ด์ด๊ณ , ์์ ๋ค์ ๊ตฌํ์ ๋ณด๋ค ์ต์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์๋ค.
์ค๋งํธ ์ปจํธ๋์ด ์์ ๋งํ๋ ์ธ์ด๋ค๋ก ์ฐ์ฌ์ง๋ฉด, ํด๋น ์ธ์ด์ ์ปดํ์ผ๋ฌ๊ฐ ์ปจํธ๋์ ๋ฐ์ดํธ ์ฝ๋๋ก ๋ฒ์ญํ๋ค. ์ด ๋ฐ์ดํธ์ฝ๋๋ (์ ๊ทผ ํ๊ฐ๊ฐ ์๋ค๋ฉด)์ด๋ค ๊ณ์ ์ด๋์ง ๋คํธ์ํฌ์ ์ ์ถํ ์ ์๋ ์ปจํธ๋ ์์ฑ ํธ๋์ญ์ ์ ํฌํจํ๋ค.
์ค๋งํธ ์ปจํธ๋ ์ ์งํ๊ธฐ
์ค๋งํธ ์ปจํธ๋์ด ๋ธ๋ก์ฒด์ธ ๊ทธ ์์ฒด์ ๋ฐฐํฌ๋์ด ์๋ค๋ ์ฌ์ค ๋๋ฌธ์, ๊ทธ๊ฒ๋ค์ ๋ฐฐํฌ๊ฐ ๋๊ณ ๋๋ฉด ์์ ๋ ์ ์๋ค. ์ด ๊ฒ์ ์ค๋งํธ ์ปจํธ๋ ๊ฐ๋ฐ์์๊ฒ ๋๋ค๋ฅธ ๊ณผ์ ์ด๋ค. ์ด ๋ฐฉํด๋ฌผ์ DelegateCall() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๋ถ๋ถ์ ์ผ๋ก ๊ทน๋ณตํ ์ ์๋ค. ์ค๋งํธ ์ปจํธ๋ A๊ฐ ์ด ํจ์๋ฅผ ํธ์ถํ๋ฉด, ๋ค๋ฅธ ์ค๋งํธ ์ปจํธ๋์ ํจ์(B)๋ฅผ ํธ์ถํ ์ ์๊ฒ ๋๋ค. ํจ์์ ์คํ ๊ฒฐ๊ณผ ์๊ธด ๋ณํ๋ A์ ์ค๋งํธ ์ปจํธ๋์ ํค-๊ฐ ์ ์ฅ์์ ์ ์ฅ๋๋ค. ๊ฐ๋ฐ์๋ค์ DelegateCall() ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ์ค๋งํธ ์ปจํธ๋์ ์ค์ ๊ตฌํ์ ์์ฑํ๊ณ , ์ค๋งํธ ์ปจํธ๋์ ๋๋ฆฌ๋ก ๋ฐฐํฌํ ๋ ์ฌ์ฉํด์๋ค. OpenZeppelin์ ๋ฐฐํฌํ๊ณ ์ ๊ทธ๋ ์ด๋ ๊ฐ๋ฅํ ์ค๋งํธ ์ปจํธ๋์ ์์ ํ๋ ๊ฒ์ ๊ฐํธํ๊ฒ ํ๋ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค์๋ค. ํ์ง๋ง ์ด๊ฒ์ด ๋ฌธ์ ์ ๋ํ ์๋ฒฝํ ํด๋ต์ ์๋๋ค. ๋ง์ฝ ์ค๋งํธ ์ปจํธ๋์ด ํ๋์ ๊ฐ์ธ์ ์ํด ์ ๊ทธ๋ ์ด๋๊ฐ ๋๋ค๊ณ ํ๋ฉด, ์ด๊ฒ์ ์ ๋ขฐ์ ๋จ์ฉ ์ํ์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ๋ค. ์ด๊ฒ์ ์ค์ ๋ณ๊ฒฝํ๊ธฐ ์ ์, ์ฌ๋ฌ๊ฐ์ EOA๊ฐ ์ฐธ์กฐ๋ ์ปจํธ๋์ ์ฃผ์๋ฅผ ์ ๋ฐ์ดํธํ๋๋ก ์๊ตฌํจ์ผ๋ก์จ ๊ทน๋ณตํ ์ ์๋ค. ๋ง์ฝ ์ปจํธ๋์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ค๋ฉด, SCA ์ ์ฅ์๊ฐ ์ด๋ฏธ ๋ฐ๋์์ ๊ฒ์ด๊ณ , ์ด๊ฒ์ ๋ณต๊ตฌํ๊ธฐ๋ ์ฝ์ง ์์ ์๋ ์๋ฐ. 131๊ฐ์ ์ค๋งํธ ์ปจํธ๋์ ์ฐ๊ตฌ ๋ ผ๋ฌธ๊ณผ, 150๋ช ์ด ๋๋ ์ด๋๋ฆฌ์ ๊ฐ๋ฐ์๋ฅผ ๋์์ผ๋ก ํ ์ค๋ฌธ๊ฒฐ๊ณผ๋ฅผ ํตํด ์ด๋ฌํ ์ด์์ ๋ํด ์ด๋ป๊ฒ ๋์ํ๋์ง ์กฐ์ฌํ๋ค. 36%์ ์๋ต์๋ ์ด ๋๋ฆฌ-์ ๊ทผ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ , ๋ฐ๋ฉด์ ๋๋ค์๋ ๊ทธ๋ฅ ์๋ก์ด ์ปจํธ๋์ ๋ฐฐํฌํ๋ค. ์๋ก์ด ์ปจํธ๋์ ๋ฐฐํฌํ ๋๋ค์์ ๊ฐ๋ฐ์๋ค์, Selfdestruct()ํจ์๋ฅผ ์ฌ์ฉํด ์ด์ ์ปจํธ๋์ ํ๊ธฐํ๋ค.
4. ์ด๋๋ฆฌ์ ๊ฐ์๋จธ์
Besu๋ EVM์ ํธ๋์ญ์ ์ ์คํํ๋ ์์ง์ผ๋ก ์ฌ์ฉํ๋ค. EVM์ ์ค-ํ๋ง์์ ์ด๋ผ๊ณ ํ๊ธฐ๋ ํ๋๋ฐ, ์ด๊ฒ์ ๊ฐ์ค ์ ํ๊ณผ ์คํ ์๊ฐ ๋๋ฌธ์ด๋ค. ๋ณดํต EVM์ GasCalculator๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ์คํ์ ์ฌ์ฉ๋ ๊ฐ์ค์ ์์ ์ถ์ ํ๋ค. ๊ฐ์ค๊ฐ ๋ค ๋จ์ด์ง๋ฉด, ํธ๋์ญ์ ใ ์คํ์ ์ทจ์๋๊ณ , ๋ณ๊ฒฝ๋ state๋ ๋กค๋ฐฑ๋๋ค. ์ด ์ ์ ์ธ๊ธํ๋ฏ์ด, ์ด๋ฌํ ํ๊ณ๋ ๊ฐ์ค๋ฅผ 0์ผ๋ก ์ค์ ํ๊ณ , ๊ฐ์ค ์ ํ์ ์ต๋๊ฐ์ผ๋ก ์ค์ ํ๋ ํ๊ฐํ ์ค์ ์ ํ๋ฉด ์ฌ๋ผ์ง๋ค. ๊ฐ์ค ์ ํ์ด ๊ฑฐ์ ๋ฌดํ์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ EVM์ ํ๋ง์์ ์ด๋ผ๊ณ ์ด์ผ๊ธฐํ ์ ์๋ค. ํ์ง๋ง ๊ฐ์ค๊ฐ ํ์์๋ ํ๊ฐํ ์ค์ ์์๋, ๋ง์ฝ ๋๊ตฐ๊ฐ๊ฐ ํ๊ฐํ์์ ๊ฐ์ค๋น๋ฅผ ํฉ๋ฆฌ์ ์ผ๋ก ๋ฎ๊ฒ ์ค์ ํ๋ค๋ฉด, ์ด์คํ๊ฒ ์์ฑ๋ ์ค๋งํธ ์ปจํธ๋์ด ์ ์ฒด ๋คํธ์ํฌ์ ์๋๋ฅผ ๋ฎ์ถ์ง๋ ์์ ๊ฒ์ด๋ค.
Besu์ ์์ค์ฝ๋๋ฅผ ๋ณด๋ฉด, EVM ๊ตฌํ์ด ์คํ ๊ธฐ๋ฐ์ ์ํคํ ์ณ๋ฅผ ํ๊ณ ์์์ด ๋ช ๋ฐฑํด์ง๋ค. ์ด๊ฒ์ ์ด๋๋ฆฌ์์ ๊ธฐ์ ๋ฌธ์์ ์ ์๋ ์ปจ์ ๊ณผ ๋น์ทํ๋ค. ์ด EVM์ EVM์ด ์คํํ ์ ์๋ ์ฐ์ฐ์ ๋ฆฌ์คํธ์ธ OperationRegistry๋ฅผ ์ ์ํ๋ค. ์ด ๋ฆฌ์คํธ์๋ ๊ฐ๋จํ Push, Pop ์ฐ์ฐ์ ํฌํจํด์ DelegateCall๊ณผ ๊ฐ์ ๋ณต์กํ ์ฐ์ฐ๋ ์๋ค.
Besu์์์ ํธ๋์ญ์ ์ ๋ฉ์์ง ์ฝ์ด๊ฑฐ๋ ์ปจํธ๋ ์์ฑ ํธ๋์ญ์ ์ด๋ค. ์ฐ๋ฆฌ๋ ์ด ๋ ๊ฐ์ง ํธ๋์ญ์ ์ด ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ตฌํ๋จ์ ์ ์ ์์๋ค. ์ด ๋๊ฐ์ง ํธ๋์ญ์ ์ด ๋ฉ์ธ์ง, ์ฆ ์ฅ๋ถ์ ์์ฒญํ ๋ณํ๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์จ๋ค. ๋ฉ์ธ์ง๋ค์ Besu์์ MessageFrame์ ํํ๋ก ํํ๋๋๋ฐ, MessageFrame์ "๋ฉ์ธ์ง์ ๊ด๋ จ๋ ๋ชจ๋ state์ ์ปจํ ์ด๋ ๊ฐ์ฒด"์ด๋ค. ๊ด์ต์ ์ผ๋ก, ์ด๊ฒ์ MessageFrame์ global state(WorldsState, blockchain), ์คํ ์ํคํ ์ณ(program counter, memory, stack) ๋ฑ ์ฌ๋ฌ ๊ฐ(44)์ private ํญ๋ชฉ์ ํฌํจํ๊ณ ์์์ ์๋ฏธํ๋ค. Besu์ EVM ๊ตฌํ ์ ๋ถ๋ฅผ ์ค๋ช ํ๋ ๊ฒ์ ๋๋ฌด ๊ธฐ์ ์ ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ทธ๋ฆผ 3.16, ๊ทธ๋ฆผ 3.17์ ์์ฝ๋ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ์ด๋ค.
5. ๋คํธ์ํฌ์ ์ํธ์์ฉ
๋ก์ปฌ์ ํน์ ์๊ฒฉ ์ดํ๋ฆฌ์ผ์ด์ ์ ํ๋์ ๋ ธ๋์ ํต์ ํจ์ผ๋ก์จ ๋คํธ์ํฌ์ ์ํธ์์ฉํ ์ ์๋ค. ์ด ์ปค๋ฎค๋์ผ์ด์ ์ ๋ค์ํ ํ๋กํ ์ฝ๊ณผ API๋ฅผ ํตํ์ฌ ์ด๋ฃจ์ด์ง ์ ์๋ค. HTTP๋ฅผ ํตํ JSON-RPC, WebSockets๋ฅผ ํตํ JSON-RPC, HTTP๋ฅผ ํตํ GraphQL์ด ๊ทธ๊ฒ์ด๋ค.
JSON-RPC๋ JSON์ ์ฌ์ฉํ๋ RPC์ ํ์ค์ด๋ฉฐ, ๋น์ํ ํต์ ์ ํ๋๋ฐ์ ๊ท์น๊ณผ ํ์์ ์ ์ํ๋ค. Besu๋ 2.0 ๋ฒ์ ผ์ ์ง์ํ๋ค. RPC๊ฐ ๋ณดํต ๊ทธ๋ฌํ๋ฏ, ํธ์ถํ๋ ์ฌ๋์ ๋ฉ์๋์ ์ด๋ฆ๊ณผ, ์ธ์๋ค์ด ํฌํจ๋ ์์ฒญ์ ํ์ด๋ก๋ ํํ๋ก ๋ถ์ฌ ๋๊ธด๋ค. 3.5์์ ํด๋น ํ์ด๋ก๋์ ๋ํด ์์๊ฐ ์๋ค.
# 3.5 JSON-RPC example payload
{
"jsonrpc": "2.0",
"method" : "eth_blockNumber",
"params" : [],
"id" : 1
}
์ฐ๋ฆฌ๋ ๊ฐ ์ฟผ๋ฆฌ๊ฐ JSON-RPC ํ๋กํ ์ฝ, ๋ฉ์๋ ์ด๋ฆ, ๋ฉ์๋์ ํ์ํ ์ธ์, ์๋ณ์๋ก ๊ตฌ์ฑ๋์ด ์์์ ํ์ธํ ์ ์๋ค. ์ด ์๋ณ์๋ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋ ธ๋๋ฅผ ์๋ ค์ฃผ๋ ๋ฐ์๋ง ์ฌ์ฉ๋๋ค. ๋ง์ฝ ์๋ณ์๋ฅผ ํฌํจ์ํค์ง ์๋๋ค๋ฉด, ํด๋ผ์ด์ธํธ๋ ์๋ต์ ๋๋ ค๋ฐ์ ์ ์๋ค. ๋ช ๋ฐฑํ๊ฒ JSON-RPC๋ ๋ฉ์์ง ์ ๋ฌ ํ๊ฒฝ๊ณผ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ค. ๋ฐ๋ผ์ WebSockets์ ํตํ ์ํธ์์ฉ๋ ๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊บผ์ ธ์๊ธด ํ์ง๋ง, ์์ฒญ์ ํ ๋, ๋ ธ๋์ ์ค์ ํ์ผ์ ์ ์ํ๋ค๋ฉด ์ ์ ์ด๋ฆ/ ๋น๋ฐ๋ฒํธ ์, ํน์ JWT๋ฅผ ํตํ ์ธ์ฆ์ด ๊ฐ๋ฅํ๋ค.
๋ง์ง๋ง์ผ๋ก HTTP๋ฅผ ํตํ GraphQL์ด ์ง์๋๋ค. GraphQL์ ํธ์ถํ๋ ์ฌ๋์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ์ด๋ค ํญ๋ชฉ์ ์์ฒญํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํ ์ ์๋ ์ฟผ๋ฆฌ ์ธ์ด์ด๋ค. ์์ฐ์ค๋ฝ๊ฒ, ์ฟผ๋ฆฌ ์ธ์ด๋ ์ฅ๋ถ๋ฅผ ์ฟผ๋ฆฌํ๊ธฐ ์ํด ์ค๊ณ๋๋ค. ์ถ๊ฐ์ ์ผ๋ก GraphQL์ ํธ๋์ญ์ ์ ์์ฑํ๋ ๋ฑ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํธ์ถํ๋๋ฐ ์ฌ์ฉ๋ ์๋ ์๋ค. 3.6์ ์์๊ฐ ๋จ์ ํธ๋์ญ์ ์ ๊ฐ์๋ฅผ ์ฟผ๋ฆฌํด์ค๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.
# 3.6 GraphQL example payload
{
"query": "{pending {transactionCount}}"
}
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ดํ๋ฆฌ์ผ์ด์
๋น๋ก HTTP ํน์ WebSocket ๋ฉ์์ง๋ก ๋ ธ๋์ ์ง์ ํต์ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. Besu๊ฐ ์ด๋๋ฆฌ์ ํ๋กํ ์ฝ์ ๋๋ถ๋ถ์ ๊ตฌํํ๊ธฐ ๋๋ฌธ์(์๋ช ๋์ง ์์ ํธ๋์ญ์ ์ ์ ์กํ๋ ๋ถ๋ถ ์ ์ธ), ์ด๋๋ฆฌ์ ํ๋กํ ์ฝ์ ํตํด ์ํธ์์ฉํ ์ ์๋ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ Besu์ ์ฌ์ฉํ ์ ์๋ค. ์ ๋ช ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Web3.js(JavaScript), Web3j(Java), Web3py(Python), Nethereum(.Net)์ด ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋๋ฆฌ์ ๋คํธ์ํฌ์ ํต์ ํ๋ ์ดํ๋ฆฌ์ผ์ด์ ๋ค๋, ์ปค์คํ ๋คํธ์ํฌ์ ์คํ์ ๋ง์กฑํ๋ค๋ฉด, Besu์ ์ ์ฉ๋ ์ ์๋ค. Truffle, Remix ๋ ์ค๋งํธ ์ปจํธ๋์ ๋ฐฐํฌํ๊ณ ํ ์คํธ ํ๋๋ฐ ์ ๋ช ํ ๋๊ตฌ๋ค์ด๋ค. Tenderly๋ ๋ถ์์๋ฃ๋ฅผ ๋ชจ์ผ๊ณ , ์ค๋งํธ ์ปจํธ๋์ ๋ชจ๋ํฐ๋งํ๋๋ฐ์ ์ฌ์ฉํ ์ ์๋ค. ์ถ๊ฐ์ ์ผ๋ก Prometheus๋ Besu ๋คํธ์ํฌ๋ฅผ ๋ชจ๋ํฐ๋ง ํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ค. Grafana๋ Prometheus๋ก ๋ชจ์ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ ์ ์๋ค. ๊ทธ๋ฆผ 3.18์ Besu ๋คํธ์ํฌ์ ๋ชจ๋ํฐ๋ง ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ Grafana ๋์๋ณด๋์ด๋ค. ๋ช ๋ฐฑํ ์ด์ ๋ค๋ก, ๋ฐ์ดํฐ ํ๋ผ์ด๋ฒ์์ ๊ฐ์ Besu์ ํน์ง ๊ธฐ๋ฅ๋ค์, ์ด๋๋ฆฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค. Besu ๊ณ ์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ์น์ 6.2์ ์์ธํ ์ค๋ช ๋ Web3.js-eeea59์ ๊ฐ์ด EEA ํ์ฅ ๋ฒ์ ์ ์ฌ์ฉํ ์ ์๋ค.
EthSigner๋ฅผ ํตํธ ํธ๋์ญ์ ์ ์ก
์ด ์ ์, ํธ๋์ญ์ ์ ๋ ธ๋๊ฐ ์๋๋ผ ๊ณ์ ์ ์ํด ์์ฑ๋๋ค๊ณ ์ค๋ช ํ๋ค. ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ ์ฌ์ฉ์ ๋ฑ actor๊ฐ ์ด ํธ๋์ญ์ ์ ์์ฑํ๊ณ , ์ด ๊ฒ์ JSON-RPC ํ๋กํ ์ฝ์ ์ฌ์ฉํด ์ง์ ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด์๋ ๋ ธ๋์ ๋ณด๋ธ๋ค. ์ด ํธ๋์ญ์ ์ด ๋คํธ์ํฌ์์ ํฉ๋ฒ์ผ๋ก ์ธ์ ๋ฐ์ผ๋ ค๋ฉด, ์ด๊ฒ์ ๋ฐ๋์ ๊ณ์ ์ ๊ฐ์ธ ํค๋ฅผ ์ด์ฉํด์ ์๋ช ๋์ด์ผ ํ๋ค. Go Ethereum, Open Ethereum ๊ฐ์ ์ ํต์ ์ธ ์ด๋๋ฆฌ์ ๋ ธ๋๋ค์ ๋ด์ฅ๋ ์ง๊ฐ์ด ์์ด, ๊ณต๊ฐ ํค/๊ฐ์ธ ํค ์์ ๋ณด๊ดํ๋ค. ์ถ๊ฐ์ ์ผ๋ก ์ด ์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ๋ค์ eth_sendTransaction์ endpoint๋ฅผ ์ง์ํด์, actor๋ค์ด ์๋ช ๋์ง ์์ ํธ๋์ญ์ ์ ๋ณด๋ผ ์ ์์๋ค. ์๋ช ๋์ง ์์ ํธ๋์ญ์ ์์ฒญ์ ์๋ นํ๋ฉด, ๋ ธ๋๋ ์ง๊ฐ์ ๊ฐ์ธ ํค๋ฅผ ๋ณด๊ณ ์๋ช ํ์ฌ ๋คํธ์ํฌ์ ๋ฟ๋ ธ๋ค. ํ์ง๋ง Besu๋ ๋ด์ฅ ์ง๊ฐ๊ณผ eth_sendTransaction์ ํตํ ๋ฌด์๋ช ํธ๋์ญ์ ์ ๋ชจ๋ ์ง์ํ์ง ์๋๋ค.
Besu์ ์๋ actor๋ค์๊ฒ๋ eth_sendTransaction ๋ฉ์๋๊ฐ (๊ตฌํ๋์ง ์์)์ฌ์ฉ ๋ถ๊ฐํ๋ฏ๋ก, eth_sendRawTransaction ๋ฉ์๋๊ฐ ๋์ ์ ๊ณต๋๋ค. ์ด ํจ์ ์ญ์ ์ด๋๋ฆฌ์ ํ๋กํ ์ฝ์ ํ ๋ถ๋ถ์ด๋ค. ์ด ๋ฉ์๋๋ ์๋ช ๋ ํธ๋์ญ์ ์ ์ ๋ ฅ์ผ๋ก ๋ฐ๋๋ค. 3.7์ ์์๊ฐ eth_sendRawTransaction ๋ฉ์๋๋ฅผ JSON-RPC๋ก ํธ์ถํ๋ ํ์ด๋ก๋ ์์๋ฅผ ๋ณด์ฌ์ค๋ค.
# 3.7 sendRawTransaction example
{
" jsonrpc ": "2.0 ",
" method ": "eth_sendRawTransaction ",
" params ": ["0 xf869018203e ... "],
"id": 1
}
sendRawTransaction ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํธ๋์ญ์ ์ ์์ฑํ ๋๋ ๋ชจ๋๊ฐ ๊ฐ์ธ ํค๋ฅผ ๊ฐ์ง๊ณ ์๋ช ํด์ผ ํ๋ฏ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์๊ฒ ๋๋ฌด ๋ง์ ๋ถ๋ด์ ์ง๊ฒํ๋ ๊ฒ์ผ ์๋ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก Besu๋ EthSigner๋ผ๋ ์ํํธ์จ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, EthSigner๋ eth_sendTransaction ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉฐ, ๋ ธ๋ ์์ ๋ถ์ด ํ๋ก์ ์ปดํฌ๋ํธ์ ์ญํ ์ ํ๋ค. EthSigner๋ฅผ ํตํด actor๋ ๊ฐ์ธ ํค์ ๋ํด ์๊ณ , ํธ๋์ญ์ ์ ์์ฑํ๋ ๊ฒ์ ๋ํ ๋ถ๋ด ์์ด eth_sendTransaction ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. EthSigner๋ ๋ฌด์๋ช ํธ๋์ญ์ ์ ๋ฐ์ผ๋ฉด, ๊ทธ๊ฒ์ ์๋ช ํ๊ณ ๋ ธ๋์ eth_sendRawTransaction์ผ๋ก ๋ณด๋ผ ๊ฒ์ด๋ค. ๊ณต๊ฐ ํค/๊ฐ์ธ ํค ์ ์ญ์ EthSigner ์ธ์คํด์ค์ ํ์ผ ์์คํ ์ ๋ก์ปฌ๋ก ์ ์ฅํ๊ฑฐ๋, Hashicorp Vault์ ์ ์ฅํ๊ฑฐ๋, Key Vault of Microsoft Azure์ ์ ์ฅํ ์ ์๋ค. ๊ทธ๋ฆผ 3.19๋ ๋ ธ๋์ ํธ๋์ญ์ ์ ๋ณด๋ด๋ ๊ณผ์ ์ ์ค๋ช ํ๋ค.
6. ํ๊ฐ
Besu๋ ๋ฉค๋ฒ๊ฐ ์๋ ์ฌ๋๋ค์ ์ ๊ทผ์ ๋ง๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํด ๋คํธ์ํฌ๋ฅผ private๋ก ์ ์งํ ์ ์๋ค. ํ๊ฐ์ ๊ด๋ จ๋ Besu์ ๊ธฐ์ ์ ์์๋ณด๊ธฐ ์ ์ ์ ๊น ์ธ๊ธํ์๋ฉด, ๋ฐ๋๋ผ(์์) ์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ ์ญ์ ์ด๋๋ฆฌ์ ํ๋ผ์ด๋น ๋คํธ์ํฌ์ ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์๋ค. ์ด๋๋ฆฌ์ ํ๋ผ์ด๋น ๋คํธ์ํฌ๋ ๋ฉ์ธ๋ท์ด ์๋ ๋คํธ์ํฌ๋ก ์ ์๋์ด ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ค ์ฌ๋์ด๋ ์๋ก์ด ์ ๋ค์์ค ๋ธ๋ก์ ์์ฑํ ์ ์๊ณ , ๋ง์ ํผ์ด๋ฅผ ๊ทธ ๋คํธ์ํฌ์ ๋ถ์ผ ์ ์๋ค. ํ์ง๋ง ์ด๊ฒ์ ๊ทธ์ ๋ฉ์ธ๋ท๊ณผ ์ ์ ์ด ์๋ ๊ณ ๋ฆฝ๋ ๋คํธ์ํฌ์ผ ๋ฟ์ด๋ค. ์ด๊ฒ์ ๋ณดํธ๋ ๋ณด์์ ์ ๊ณตํ์ง ์๋๋ค. ์ด๋๋ฆฌ์ ํ๋ผ์ด๋น ๋คํธ์ํฌ์๋ ๋ค๋ฅด๊ฒ, Besu ๋คํธ์ํฌ๋ ๋ณดํธ์ ๋ณด์์ ๋ค์ํ ํ๊ฐ ๊ธฐ์ ๋ก ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค. ๋ช๋ช ํ๊ฐ ๊ธฐ์ ์ ๋ก์ปฌ ๋ ธ๋ ๋ ๋ฒจ์์๋ง ์ ์ฉ๋ ์ ์๊ณ , ์จ์ฒด์ธ ๋ ๋ฒจ์์ ์ ์ฉ๋ ์๋ ์๋ค.
๋ก์ปฌ : ์ฌ์ฉ์-๊ธฐ๋ฐ ์ธ์ฆ
๋ ธ๋๋ JSON-RPC ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ ์ฌ์ฉ์ ๋ฆฌ์คํธ๋ฅผ ํฌํจํ๊ณ ์๋ toml ํ์ผ์ ํน์ ํ ์ ์๋ค. ๊ฐ ์ฌ์ฉ์๋ค์ ๋ํด ๋ค์ ํญ๋ชฉ๋ค์ด ํน์ ๋๋ค: ๊ณต๊ฐ ํค, ๋น๋ฐ๋ฒํธ์ ํด์, ํ๊ฐ์ ๋ชฉ๋ก. ์ฌ๊ธฐ์ ํ๊ฐ์ ๋ชฉ๋ก์ ์ฌ์ฉ์๊ฐ ํธ์ถํ ์ ์๋ JSON-RPC ๋ฉ์๋์ ์ด๋ฆ์ ๋ชฉ๋ก์ ๋งํ๋ค. 3.8์ ์์๊ฐ ์๋ค. ์ด ํํ์ ์ธ์ฆ์ ๋ ธ๋์๋ง ๋ก์ปฌ ๋ ๋ฒจ์์ ์ ์๋๊ณ , ํด๋น ์ค์ ํ์ผ์ ์ ์ํ ๋ ธ๋์๋ง ์ ์ฉ๋๋ค.
# 3.8 User-Based Authentication
[ Users . username1 ]
password = " $2a$10$l3GA7K8g6rJ /Yv. YFSygCuI9byngpEzxgWS9qEg5emYDZomQW7fGC "
permissions =[" net :*"," eth : blockNumber "]
privacyPublicKey =" U7ANiOOd5L9Z / dMxRFjdbhA1Qragw6fLuYgmgCvLoX4 ="
[ Users . username2 ]
password = " $2b$10$6sHt1J0MVUGIoNKvJiK33uaZzUwNmMmJlaVLkIwinkPiS1UBnAnF2 "
permissions =[" net : version "," admin :*"]
privacyPublicKey =" quhb1pQPGN1w8ZSZSyiIfncEAlVY /M/ rauSyQ5wVMRE ="
์ฌ์ฉ์ ์ด๋ฆ๊ณผ ํจ์ค์๋๋ ๋ ธ๋์ ์์ฒญํ์ฌ ๋ก๊ทธ์ธํ ๋ ์ฌ์ฉํ๋ค. ๋ ธ๋๋ ๊ณต๊ฐ ํค ์ ๊ฐ์ธ ํค๋ฅผ RSA๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์ฌ, ์ฌ์ฉ์๋ฅผ ์ํ JWT๋ฅผ ์์ฑํ๋ค. ๋ง์ฝ ํด๋น ์ต์ ์ด ์ผ์ก๋ค๋ฉด, ์์ฒญ ํค๋ Authorization ํญ๋ชฉ์ ์ ํจํ JWT๋ฅผ ์ ๋ ฅํ ํด๋ผ์ด์ธํธ๋ง ๋ ธ๋์ ๊ธฐ๋ฅ์ ํธ์ถํ ์ ์๋ค. ์ด๊ฒ์ ๋ํ ์์๋ ๊ทธ๋ฆผ 3.20์ ๋์์๋ค.
๋ก์ปฌ/๋คํธ์ํฌ : ๋ ธ๋ ํ๊ฐ ๋ชฉ๋ก
์์ ๋๊ฐ์ง ํ๊ฐ ๊ธฐ์ ์ ๋ ธ๋์ API๋ฅผ ํธ์ถํ ์ ์๋ actor์ ์ด์ ์ ๋ง์ท๋ค. Besu ๋คํธ์ํฌ์ ๋ชจ๋ ๋ ธ๋๋ค์ bootnode์ peer discovery๋ฅผ ์ด์ฉํด ์ฐ๊ฒฐํ๋ค๋ ๊ฒ์ ๋ค์ ๊ธฐ์ตํด๋ณด์. ์ฌ๊ธฐ์, ์ฐ๋ฆฌ๋ ํ๋์ฑ(A๊ฐ B์ ์ฐ๊ฒฐ๋๊ณ , B๊ฐ C์ ์ฐ๊ฒฐ๋๋ฉด, A๊ฐ C์ ์ฐ๊ฒฐ๋จ)์ด ์ด ์ฐ๊ฒฐ์ ์ ์ฉ๋จ์ ์ ์ ์๋ค. ๊ฒ๋ค๊ฐ ๊ณต๊ฒฉ์๊ฐ ํ๊ฐํ ๋คํธ์ํฌ๋ฅผ ์ด์ฉํ๋ ์กฐ์ง๊ณผ ์ ํ ์ ์ด ์์ด, bootnode์ ์ฃผ์๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์ฐ๊ฒฐํ ์๋ ์๋ค. ์ด๊ฒ์ ์ ํํ์ง ์๋๋ค๋ฉด, ์ ์ฒด ๋คํธ์ํฌ๊ฐ ์๋กญ๊ฒ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ์ธ์ํ๊ณ ๊ทธ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ณต์ ํ ๊ฒ์ด๋ค. Besu๋ ์ฐ๊ฒฐ ๊ฐ๋ฅํ ๋ ธ๋ ๋ชฉ๋ก์ ์ ์ํด ์ด๊ฒ์ ํด๊ฒฐํ๋ค. ๋ชฉ๋ก์ ์๋ ๋ ธ๋๋ค์ ์ฐ๊ฒฐ์ ๊ฑฐ์ ํ๋ค. ์ด ์ฐธ๊ฐ ์ ํ์ EEA์ ์ํฐํ๋ผ์ด์ฆ ์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ ์ ์์์ connectionAllowed ํจ์๋ก๋ ์๋ ค์ ธ์๋ค.
๋ ธ๋ ํ๊ฐ๋ชฉ๋ก์ ์ฌ์ฉํ๊ธฐ ์ํด์, ๋คํธ์ํฌ์ ๋ชจ๋ ๋ ธ๋๋ค์ ์ ๋ํฌํ ๊ณต๊ฐํค์ ๊ฐ์ธํค๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. ๋ค์, ๋ ธ๋์ enode๊ฐ ๋ ธ๋์ ํ๊ฐ๋ชฉ๋ก์ ์ ํ์์ด์ผ ํ๋ค. enode๋ "enode://nodePubKey@host:port" ํ์์ URL์ด๋ค. ๊ฐ ๋ ธ๋๋ ์ ๋ํฌํ๊ฒ ๋คํธ์ํฌ์ ๋ ธ๋๋ฅผ ์๋ณํ ์ ์๋ค. ์ด ํ๊ฐ๋ชฉ๋ก์ ๋ก์ปฌ์ toml ํ์ผ์ ์ ์ํ ์ ์๋ค.
๋ก์ปฌ/๋คํธ์ํฌ : ๊ณ์ ํ๊ฐ ๋ชฉ๋ก
'๐ป > ๋ธ๋ก์ฒด์ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ธ๋ก์ฒด์ธ] quorum-dev-quickstart ์ฐ๋ ํ ์คํธ (1) | 2022.09.20 |
---|---|
[๋ธ๋ก์ฒด์ธ] Windows ํ๊ฒฝ์์ Ganache ๋คํธ์ํฌ ํ ์คํธ (0) | 2022.08.30 |
[Besu] ๋ ผ๋ฌธ์์ฝ : Permissioned Blockchains : A Comparative Study (1) (0) | 2021.12.06 |
[Fabric] ์ฌ์ฉ์ ๊ด๋ฆฌ ๋ฐฉ๋ฒ (0) | 2021.12.01 |
[Fabric] ์ฒด์ธ์ฝ๋ ๋์ ๊ณผ์ (0) | 2021.12.01 |