์ด๋ค ๋ฌผํ์ ์์ ๊ถ ์ด์ ํํฉ์ ๋ธ๋ก์ฒด์ธ์ ๊ธฐ๋ก ํ์ฌ ํน์ ๋ฌผํ์ ๋งค๋งค์ ํ์ฌ์ ์์ ์, ์ ์ฒด ์์ ๊ถ ์ด์ ํ์คํ ๋ฆฌ, ์ค๊ฑฐ๋ ๊ฐ๊ฒฉ ๋ณ๋ ์ถ์ด ๋ฑ ์ ๋ขฐํ ์ ์๋ ์ ๋ณด๋ฅผ ๊ฑฐ๋ ๋น์ฌ์ ์์ธก์ด ํ์ธ ํ ์ ์๋ ์์คํ ์ ๊ตฌํ
myBlockChain์ ์ํ P2P ๋คํธ์ํฌ๋ ๋ค์์ full ๋ ธ๋๋ค๊ณผ ๋ค์์ ์ฌ์ฉ์ ๋ ธ๋๋ค๋ก ๊ตฌ์ฑ๋๋ค. P2P ๋คํธ์ํฌ์ ์์(topology)์ ํ์ผ topology.dat์ ๊ธฐ์ ๋ ๊ฒ์ฒ๋ผ ์ ํด์ง๋ค. ํ์ผ์ ์๋ ๋ค์๊ณผ ๊ฐ์ผ๋ฉฐ, ์ฌ๊ธฐ์ Fi๋ full ๋ ธ๋, Ui๋ ์ฌ์ฉ์ ๋ ธ๋, Ui-Fj๋ Ui์ Fj์ฌ์ด์ ๋งํฌ, Fi-Fj๋ Fi์ Fj ์ฌ ์ด์ ๋งํฌ๋ฅผ ์๋ฏธํ๋ค.
% cat topology.dat
{
node F0, F1, F2, F3, F4, F5
node U0, U1, U2, U3
link U0-F1, U1-F2, U2-F4, U3-F0
link F0-F1, F2-F1, F2-F4, F3-F4, F4-F0, F4-F1, F3-F1, F2-F5, F4-F5 }
%
๊ฐ full ๋ ธ๋๋ ์์ ํ ํธ๋์ญ์ ์ ๊ฒ์ฆํ๋๋ฐ, ๊ฒ์ฆ ์ฑ๊ณต(valid๋ผ ํ๋จ)ํ๋ฉด ์ ์ฅํ ํ, ์ด๋ฅผ ์ด์ ๋ ธ๋(๋ค)์ ๋ณด๋ด๊ณ , ๊ฐ ์ด์ ๋ ธ๋๋ ์ด๋ฅผ ๋ค์ ์ด์(๋ค)์ ์ ํ ํ๋ ์์ผ๋ก ์ ์ฒด ๋คํธ์ํฌ์ ์ ํ๋๊ฒ ํ๋ค. Full ๋ ธ๋๋ ์์ ์ด ํ๋จํ๋ longest chain์ ๋ง์ง๋ง ๋ธ๋ก์ ์ฐ๊ฒฐํ ๋ธ๋ก์ ์ฑ๊ตดํ๋๋ฐ, ์ด ๊ณผ์ ์์ ์ฑ๊ตด์ ๋จผ์ ์ฑ๊ณตํ๊ธฐ ์ํด ๋ค๋ฅธ full ๋ ธ๋๋ค๊ณผ ๊ฒฝ์ํ๋ค. Full ๋ ธ๋๋ ์ฑ๊ตด ์ฑ๊ณต ์, ์ฑ๊ตด ๋ธ๋ก์ ์ฆ ์ ์ด์ ๋ ธ๋(๋ค)์ ์ ๋ฌํด ์ด ๋ธ๋ก์ด ์ ์ฒด ๋คํธ์ํฌ๋ก ์ ํ๋๊ฒ ํ๋ค.
์ด ์๋น์ค์์ ํ์ํ ํธ๋์ญ์ ์ ๋จ ํ ๊ฐ์ง ์ข ๋ฅ๋ก ํ๋งค์(seller)๊ฐ ๊ตฌ๋งค์(buyer)์๊ฒ ๋ฌผํ์ ์์ ๊ถ์ ๋๊ธฐ๋ ๊ฑฐ๋ ๋ด์ฉ์ ๊ธฐ๋กํ ๊ฒ์ด๋ค. ํธ๋์ญ์ ์ trID: <input, output, identifier, modelNo, manufactured date, price, trading date, others>๋ก ๊ตฌ์ฑ๋๋๋ฐ, input์ ํน์ ๋ฌผํ์ ํ๋งค์(ํ์ฌ ํด๋น ๋ฌผ๊ฑด์ ์์ ์)์ public key์ด๋ฉฐ, output์ ์ด ๋ฌผํ ๊ตฌ๋งค์์ public key์ด๋ค. ๋ํ identifier(ํน์ ๋ฌผํ์ ์ง์นญํ๋ ID(์๋ฅผ ๋ค์ด, ๋ฌผํ์ ๋ถ์ฐฉ๋ bar-code๋ QR- code ํตํด ์ป๋ ๊ฐ)), modelNo(๋ฌผํ์ ๋ชจ๋ธ๋ช ), manufactured date(๋ฌผํ์ ์ ์กฐ์ผ)์ ์ด ๋ฌผํ์ ๋ชจ ๋ ๊ณผ๊ฑฐ ๋ฐ ํ์ฌ์ ๋ฏธ๋์ ํ๋งค ํธ๋์ญ์ ๋ค์์ ๊ฐ์ด ๋ณํ ์ ์๋ immutable์ด๋ฉฐ, price(ํ๋งค๋ ๊ฐ๊ฒฉ), trading date(๊ฑฐ๋์ผ)์ others๋ mutable์ด๋ค. others ํ๋๋ ์ด ๋ฌผํ์ ๋ํ ์ค๋ช ์ผ๋ก ์ด๋ค ๋ด์ฉ์ด๋ ์ธ ์ ์๋ค. trID๋ ํธ๋์ญ์ ์ ID๋ก์ ํธ๋์ญ์ ์ ์ฒด(์๋ช ์ ์ธ)์ ๋ํ ํด์ ํจ์ ์ ์ฉ ๊ฒฐ๊ณผ์ด๋ค. ํธ๋์ญ์ ์ ํ๋งค์์ ๊ตฌ๋งค์์ ํ์ธ ํ, ํ๋งค์์ ํธ๋์ญ์ ์ ์ฒด์ ๋ํ ์๋ช ์ด ์ถ๊ฐ๋ ์ํ๋ก P2P ๋คํธ์ํฌ์ ์ ํ๋๋ค. ์ด ์๋ช ์ ํ๋งค์์ public key๋ก ๊ฒ์ฆํ ์ ์๋ค.
๋ธ๋ก์ ํค๋์ ๋๋จธ์ง ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋๋ฐ, ํค๋์๋ blockNo(myBlockChain ์์ ๋ธ๋ก ์์๋ก์ genesis block์ blockNo๋ก 0, ๋ค์ ๋ธ๋ก์ 1, ... ์ No๋ฅผ ๊ฐ์ง), prevHash(myBlockChain ์ ์ง์ ๋ธ๋ก์ ๋ํ hash pointer), nonce(hash puzzle ํ ๋, ์ด๋ฅผ ๋ณ๊ฒฝ์ํค๋ฉฐ target number๋ณด๋ค ๋ธ๋ก hash ๊ฒฐ๊ณผ๊ฐ ์์์ง ๋๊น ์ง ์๋ํจ) ๋ฐ Merkle-root(ํธ๋์ญ์ ๋ค์ leaf๋ก ๊ฐ์ง๋ Merkle-tree์ root์ ํด๋นํ๋ hash ๊ฐ)์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๋๋จธ์ง ๋ถ๋ถ์ ์ด ๋ธ๋ก์ ํฌํจ๋ ํธ๋์ญ์ ๋ค์ leaf ๋ค๋ก ํ๋ Merkle-tree์ด๋ค(๋ค๋ง Bitcoin๊ณผ๋ ๋ค๋ฅด๊ฒ coinbase ํธ๋์ญ์ ์ ์์).
๊ฐ full ๋ ธ๋๋ ์ฑ๊ตด์ ์ํด ๋ธ๋ก์ ํฌํจ๋ ํธ๋์ญ์ ๋ค์ ๋ชจ๋ ๊ฒ์ฆํ๋๋ฐ, ๊ฒ์ฆ์ ์ํ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค. ํธ๋์ญ์ T์ ๋ํ์ฌ, (1) T๋ฅผ ํตํด ํ๋งคํ๋ ค๋ ๋ฌผํ์ ์ต์ข ์์ ์(์ฆ ํฉ์๋ ๋ง์ง๋ง ํ๋งค์ ๊ตฌ๋งค์)๊ฐ T์ input(์ฆ ํ๋งค์)๊ณผ ๊ฐ์ ์ง, (2) T์ immutable ํ๋๋ค ๊ฐ์ด ํฉ์๋ ๋ง์ง๋ง ํ๋งค์ ๊ทธ๊ฒ๋ค๊ณผ ์ผ์นํ๋์ง, (3) ์๋ช ์ด T์ input ์ฃผ์์ธ public key๋ก ๊ฒ์ฆํ ๊ฒฐ๊ณผ T ์ ์ฒด(์๋ช ์ ์ธํ)์ ์๋ช ์ด ๋ง๋์ง, ํ์ธํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒ์ฆ์ ํต๊ณผํ ํธ๋์ญ์ ๋ค์ ์ ํํด Merkle-tree๋ฅผ ๊ตฌ์ฑํ๊ณ , ๋ธ๋ก ํค๋์ nonce ๊ฐ์ ์ฐจ๋ก๋ก ๋ณ๊ฒฝํ๋ฉด์ target number๋ณด๋ค ์์์ง ๋๊น์ง ๋ฐ๋ณตํ๋ค. ์ฑ๊ตด์ ์ฑ๊ณตํ full ๋ ธ๋๋ ์ฑ๊ตดํ ๋ธ๋ก์ ์ฆ์ P2P ๋คํธ์ํฌ์ ๋ค๋ฅธ ๋ ธ๋๋ค์๊ฒ ์ ํํ๋ค(์ฌ์ฉ์ ๋ ธ๋๋ ๋์ฐฉํ ์ฑ๊ตด ๋ธ๋ก์ ๋ฌด์ํ๋๋ก ํ๊ฑฐ๋, ์์ Fj->Ui๋ฐฉํฅ์ ํต์ ์ ์ฐจ๋จํจ). ์ฑ๊ตด๋ ๋ธ๋ก์ ์์ ํ full ๋ ธ๋๋ ์ด ๋ธ๋ก์ ๊ฒ์ฆํ ํ, ์ด ๋ธ๋ก์ ๋ฐ์ํ ๊ฐฑ์ ๋ myBlockChain์ ๊ธฐ๋ฐํ์ฌ ์๋ก์ด ๋ธ๋ก์ ์ฑ๊ตด์ ์๋ํ๋ค. Bitcoin๊ณผ ๋ฌ๋ฆฌ, ์ด๋ฌํ ์ฑ๊ตด ๊ณผ์ ์ ๋๋(difficulty)๋ ๋ถ๋ณ์ด๋ผ ๊ฐ์ ํ๊ณ target number ์ญ์ ๊ณ ์ ๋ ๊ฐ์ ์ฌ์ฉํ๋ค. ์ด๋ target number๋ ๋ธ๋ก ์ฑ๊ตด์ ์์๋๋ ํ๊ท ์๊ฐ์ด (10์ด~15์ด) ์ ๋๊ฐ ๋๋๋ก ์์ ๋กญ๊ฒ ์ ํ๋ค. myBlockChain์ Bitcoin์ longest chain rule์ ๋ฐ๋ผ ๊ฐ full ๋ ธ๋๊ฐ ํ์ฌ ํฉ์๋ chain์ด ๋ฌด์์ธ์ง๋ฅผ ๋ ์์ ์ผ๋ก ํ๋จํ๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ค์ ์ฑ๊ตด๋ ๋ธ๋ก์ ์ด๋ ๋ธ๋ก์ ์ฐ๊ฒฐํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๊ฒ ํ๋ค. ๋ฐ๋ผ์ Bitcoin ๋ธ๋ก์ฒด์ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ผ์ ๊ธฐ๊ฐ full ๋ ธ๋ ์ฌ์ด์ ํฉ์๋ ์ฒด์ธ์ ๋ํ ์๊ฒฌ ๋ถ์ผ์น๊ฐ ์์ ์ ์์ง๋ง, ๊ถ๊ทน์ ์ผ๋ก ๋ชจ๋ full ๋ ธ๋๋ค ์ฌ์ด์ ํฉ์๋, ๊ฐ์ฅ ๊ธด myBlockChain์ด ์กด์ฌํ ๊ฒ์ด๋ค.
๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ด ์๊ตฌ ์ฌํญ์ ๋ชจ๋ ๋ง์กฑ์ํค๋์ง ํ์ธํ๊ธฐ ์ํด, ์ง์๋ฅผ ๋ฐ๊ณ ๊ทธ์ ๋ํ ์๋ต์ ๊ตฌํ์ฌ ๋ณด์ฌ์ฃผ๋ ์ญํ ์ ํ๋ ๋ง์คํฐ process๋ฅผ ์์ฑํ๋ค. ์ด process๋ myBlockChain ๋ฐ ๋ชจ๋ full ๋ ธ๋๋ค์ ์ ๊ทผํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ๊ฑฐ๋ ์์ฒญํ์ฌ ๋ฐ์ ์ ์๋ค. Full ๋ ธ๋๋ฅผ ๊ตฌํํ process๋ ๋ง์คํฐ process์ ๋ฐ ์ดํฐ ์์ฒญ์ ๋ํ์ฌ ์ฆ๊ฐ์ ์ผ๋ก ์ํ์ฌ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํด์ผ ํ๋ค. ๋ง์คํฐ process๋ฅผ ํตํด ํ์ธํ ์ ์๋ ๋์์ ์ข ๋ฅ๋ ๋ค์๊ณผ ๊ฐ๋ค.
(1) snapshot myBlockChain ALL(๋๋ ํน์ Fi) ALL์ด ์ง์ ๋๋ฉด ํ์ฌ ์์ ์ ๊ฐ full ๋ ธ๋๊ฐ ํ๋จํ๋ myBlockChain์, ํน์ Fi ๊ฐ ์ง์ ๋๋ฉด ํด๋น Fi๊ฐ ํ๋จํ๋ myBlockChain์, ๊ฐ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅํ๋ค.
(2) snapshot trPool <Fi> Full ๋ ธ๋ Fi๊ฐ ํ์ฌ ์ ์งํ๊ณ ์๋ ํธ๋์ญ์ ํ(์ฑ๊ตด ์ ๋ธ๋ก์ ํฌํจ๋ ์ ์๋ ํธ๋์ญ์ ๋ค์ ์งํฉ)์ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅํ๋ค.
(3) verifyLastTr <Fi> Full ๋ ธ๋ Fi๊ฐ ๊ฐ์ฅ ์ต๊ทผ์ ๋ธ๋ก ์ฑ๊ตด ์ ํฌํจํ ๋ง์ง๋ง ํธ๋์ญ์ ์ ๊ฒ์ฆ ๊ฒฐ๊ณผ (์ฆ, Fi๊ฐ ๊ฐ์ฅ ์ต๊ทผ ์๋ํ ์ฑ๊ตด ์(์ฑ๊ณต ์ฌ๋ถ ๋ฌด๊ด) ์ฌ์ฉํ ๋ธ๋ก์ ๋ง์ง๋ง์ผ๋ก ํฌํจ๋(Merkle tree์ rightmost leaf์ ํด๋นํ๋) ํธ๋์ญ์ ์ ๋ํ ๊ฒ์ฆ ๋ด์ฉ ๋ฐ ๊ฒฐ๊ณผ)๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅํ๋ค.