๋ธ๋ก์ฒด์ธ์ด๋ผ๋ ์ฃผ์ ๋ ์จ๊ฐ ์ข ๋ฅ์ ๊ณผ๋๊ด๊ณ ๋ฟ๋ง ์๋๋ผ ๊ธฐ์ ์ ๊ด์ ์์ ๋งค์ฐ ๊ฐ์น ์๋ ์์ด๋์ด์ ์์ฒ์ด๊ธฐ๋ ํฉ๋๋ค. ๋ฐ๋ผ์ ๊ทธ๋ ๋ ํ๋ณ์ด ์ ๋๋ ๋์์ ์ฃผ๋ฏผ๋ค์ ์ฐํํ์ง ์์์ต๋๋ค. ์ฌ๋๋ค์ ์ ํต์ ์ธ ์ ๋ณด ๋ฒ ์ด์ค์ ๋ํ ์ ๋ฌธ ์ง์์ ๋ธ๋ก์ฒด์ธ ์์คํ ์ผ๋ก ์ ํํ๊ธฐ ์ํด ๋ฉด๋ฐํ ์ดํด๋ณด๊ณ , ์ฐ๊ตฌํ๊ณ , ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ์ง๊ธ๊น์ง Rostelecom-Solar์ ๊ฐ๋ฐ ์ค ํ๋๋ ๋ธ๋ก์ฒด์ธ์ ๊ธฐ๋ฐ์ผ๋ก ์ํํธ์จ์ด์ ๋ณด์์ ํ์ธํ ์ ์๋ค๋ ์ ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณผ์ ์์ ๋ธ๋ก์ฒด์ธ ์ปค๋ฎค๋ํฐ์ ์์ฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋ํ ๋ช ๊ฐ์ง ์๊ฐ์ด ๋ ์ค๋ฆ ๋๋ค. ์ด๋ฌํ ์ํ ํดํน ์ค ํ๋์ธ CREATE2๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐํฌํ๊ธฐ ์ ์ ์ค๋งํธ ๊ณ์ฝ์ ์ฃผ์๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ ์ฌ๋ฌ๋ถ๊ณผ ๊ณต์ ํ๊ณ ์ถ์ต๋๋ค.
CREATE2 opcode๋ ์ฌํด 28์ XNUMX์ผ ์ฝ์คํํฐ๋
ธํ ํ๋ ํฌํฌ์ ์ถ๊ฐ๋์์ต๋๋ค. EIP์ ๋ช
์๋ ๋๋ก ์ด opcode๋ ์ฃผ๋ก ์ํ ์ฑ๋์ ๋์
๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉํ์ต๋๋ค.
๊ฑฐ๋์์ ์์ก์ด ์๋ ์ฌ์ฉ์๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ ์ฌ์ฉ์์๊ฒ ๋๊ตฌ๋ ํ ํฐ์ ๋ณด๋ผ ์ ์๋ ์ด๋๋ฆฌ์ ์ฃผ์๋ฅผ ์ ๊ณตํ์ฌ ๊ณ์ ์ ๋ณด์ถฉํด์ผ ํฉ๋๋ค. ์ด ์ฃผ์๋ฅผ "์ง๊ฐ"์ด๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค. ํ ํฐ์ด ์ง๊ฐ์ ๋์ฐฉํ๋ฉด ์ด๋ฅผ ๋จ์ผ ์ง๊ฐ(hotwallet)์ผ๋ก ๋ณด๋ด์ผ ํฉ๋๋ค.
๋ค์ ์น์ ์์๋ CREATE2 ์์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ต์ ์ ๋ถ์ํ๊ณ ์ ์ด๋ฅผ ํฌ๊ธฐํ๋์ง ์ค๋ช ํฉ๋๋ค. ์ต์ข ๊ฒฐ๊ณผ์๋ง ๊ด์ฌ์ด ์๋ ๊ฒฝ์ฐ ์ต์ข ์๋ฃจ์ ์น์ ์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ด๋๋ฆฌ์ ์ฃผ์
๊ฐ์ฅ ๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ ์ ๊ท ์ฌ์ฉ์๋ฅผ ์ํด ์๋ก์ด ์ด๋๋ฆฌ์ ์ฃผ์๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ด ์ฃผ์๊ฐ ์ง๊ฐ์ด ๋ฉ๋๋ค. ์ง๊ฐ์์ ํซ์๋ ์ผ๋ก ํ ํฐ์ ์ ์กํ๋ ค๋ฉด ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฑฐ๋์ ์๋ช ํด์ผ ํฉ๋๋ค. ์ด์ () ๋ฐฑ์๋์์ ์ง๊ฐ์ ๊ฐ์ธ ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์๋ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค.
- ๊ทธ๋ฅ
- ์ง๊ฐ์์ ํซ์๋ ์ผ๋ก ํ ํฐ์ ์ ์กํ๋ ๋น์ฉ์ ํจ์๋ฅผ ํธ์ถํ๋ ๋น์ฉ๊ณผ ๊ฐ์ต๋๋ค. ์ด์ ()
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ํ ๊ฐ์ง ์ค์ํ ๋จ์ ์ด ์๊ธฐ ๋๋ฌธ์ ํฌ๊ธฐํ์ต๋๋ค. ์ฆ, ๊ฐ์ธ ํค๋ฅผ ์ด๋๊ฐ์ ์ ์ฅํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ํค๋ ๋ถ์ค๋ ์ ์์ ๋ฟ๋ง ์๋๋ผ ์ด๋ฌํ ํค์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ์คํ๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. ๊ทธ ์ค ์ ์ด๋ ํ๋๊ฐ ์์๋๋ฉด ํน์ ์ฌ์ฉ์์ ํ ํฐ์ด ํซ ์ง๊ฐ์ ๋๋ฌํ์ง ์์ต๋๋ค.
๊ฐ ์ฌ์ฉ์์ ๋ํด ๋ณ๋์ ์ค๋งํธ ๊ณ์ฝ ์์ฑ
๊ฐ ์ฌ์ฉ์๋ง๋ค ๋ณ๋์ ์ค๋งํธ ๊ณ์ฝ์ ๋ฐฐํฌํ๋ฉด ์ง๊ฐ์ ๊ฐ์ธ ํค๋ฅผ ์๋ฒ์ ์ ์ฅํ ์ ์์ต๋๋ค. ๊ฑฐ๋์๋ ์ด ์ค๋งํธ ๊ณ์ฝ์ ํธ์ถํ์ฌ ํ ํฐ์ ํซ์๋ ์ผ๋ก ์ ์กํฉ๋๋ค.
๋ํ ์ค๋งํธ ๊ณ์ฝ์ ๋ฐฐํฌํ์ง ์์ผ๋ฉด ์ฌ์ฉ์์๊ฒ ์์ ์ ์ง๊ฐ ์ฃผ์๋ฅผ ํ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์๋ฃจ์ ์ ํฌ๊ธฐํ์ต๋๋ค(์ค์ ๋ก๋ ๊ฐ๋ฅํ์ง๋ง ์ฌ๊ธฐ์ ๋ ผ์ํ์ง ์๋ ๋ค๋ฅธ ๋จ์ ์ด ์์ด ๋ค์ ๋ณต์กํ ๋ฐฉ์์ ๋๋ค). ๊ฑฐ๋์์์ ์ฌ์ฉ์๋ ํ์ํ ๋งํผ ๋ง์ ๊ณ์ ์ ๋ง๋ค ์ ์์ผ๋ฉฐ ๋ชจ๋ ์ฌ๋์ ์์ ์ ์ง๊ฐ์ด ํ์ํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ์ด ๊ณ์ ์ ์ฌ์ฉํ ๊ฒ์ด๋ผ๋ ํ์ ์์ด ๊ณ์ฝ์ ๋ฐฐํฌํ๋ ค๋ฉด ๋์ ์จ์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
Op์ฝ๋ CREATE2
์ด์ ๋ฐฉ๋ฒ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด CREATE2 opcode๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. CREATE2๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋งํธ ๊ณ์ฝ์ด ๋ฐฐํฌ๋ ์ฃผ์๋ฅผ ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ์ฃผ์๋ ๋ค์ ๊ณต์์ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋ฉ๋๋ค.
keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]
, ์ฌ๊ธฐ์ :
- ์ฃผ์ โ CREATE2๋ฅผ ํธ์ถํ ์ค๋งํธ ๊ณ์ฝ์ ์ฃผ์
- ์๊ธ - ์์์ ๊ฐ
- ์ด๊ธฐํ_์ฝ๋ - ๋ฐฐํฌ์ฉ ์ค๋งํธ ๊ณ์ฝ ๋ฐ์ดํธ์ฝ๋
์ด๋ ๊ฒ ํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ์ฃผ์์ ์ค์ ๋ก ์ํ๋ ๋ฐ์ดํธ์ฝ๋๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ํ ์ด ์ค๋งํธ ๊ณ์ฝ์ ํ์ํ ๋๋ง๋ค ๋ฐฐํฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ฒ์์ผ๋ก ์ง๊ฐ์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ์
๋๋ค.
๋ํ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ค๋งํธ ๊ณ์ฝ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋์ ๋งค๋ฒ ๊ณ์ฐํ ์ ์์ต๋๋ค.
- ์ฃผ์ ๊ณต์์ ์ฐ๋ฆฌ ์ง๊ฐ ๊ณต์ฅ์ ์ฃผ์์ด๋ฏ๋ก ์์์ ๋๋ค.
- ์๊ธ - user_id ํด์
- ์ด๊ธฐํ_์ฝ๋ ๋์ผํ ์ง๊ฐ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๊ตฌ์ ์ ๋๋ค.
์ถ๊ฐ ๊ฐ์
์ด์ ์๋ฃจ์ ์๋ ์ฌ์ ํ ํ ๊ฐ์ง ๋จ์ ์ด ์์ต๋๋ค. ์ฆ, ์ค๋งํธ ๊ณ์ฝ ๋ฐฐํฌ ๋น์ฉ์ ์ง๋ถํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ์ด์ ()๊ทธ๋ฐ ๋ค์ ์ํญ() ์ง๊ฐ ์์ฑ์์์. ๊ทธ๋ฐ ๋ค์ ์ค๋งํธ ๊ณ์ฝ์ ๋ฐฐํฌํ๊ธฐ ์ํ ๊ฐ์ค๊ฐ ๋ฐํ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ฏฟ์๊ณผ๋ ๋ฌ๋ฆฌ CREATE2 opcode๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ผํ ์ฃผ์์ ์ค๋งํธ ๊ณ์ฝ์ ์ฌ๋ฌ ๋ฒ ๋ฐฐํฌํ ์ ์์ต๋๋ค. ์ด๋ CREATE2๊ฐ ๋์ ์ฃผ์์ nonce๊ฐ 1์ธ์ง ํ์ธํ๊ธฐ ๋๋ฌธ์ ๋๋ค(์์ฑ์ ์์ ๋ถ๋ถ์ ๊ฐ "XNUMX"์ด ํ ๋น๋จ). ๋์์, ๊ธฐ๋ฅ ์ํญ() ๋งค๋ฒ Nonce ์ฃผ์๋ฅผ ์ฌ์ค์ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋์ผํ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ CREATE2๋ฅผ ๋ค์ ํธ์ถํ๋ฉด nonce ๊ฒ์ฌ๊ฐ ํต๊ณผ๋ฉ๋๋ค.
์ด ์๋ฃจ์ ์ ์ด๋๋ฆฌ์ ์ฃผ์ ์๋ฃจ์ ๊ณผ ์ ์ฌํ์ง๋ง ๊ฐ์ธ ํค๋ฅผ ์ ์ฅํ ํ์๊ฐ ์๋ค๋ ์ ์ ์ ์ํ์ธ์. ์ง๊ฐ์์ ํซ์๋ ์ผ๋ก ๋์ ์ด์ฒดํ๋ ๋น์ฉ์ ํจ์๋ฅผ ํธ์ถํ๋ ๋น์ฉ๊ณผ ๊ฑฐ์ ๊ฐ์ต๋๋ค. ์ด์ (), ์๋ํ๋ฉด ์ฐ๋ฆฌ๋ ์ค๋งํธ ๊ณ์ฝ ๋ฐฐํฌ ๋น์ฉ์ ์ง๋ถํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ต์ข ๊ฒฐ์
์ฒ์์ ์ค๋นํ ๊ฒ:
- ์๊ธ์ ์ป๋ ๊ธฐ๋ฅ USER_ID
- ์ ์ ํ ์ํธ(์: ์ง๊ฐ ํฉํ ๋ฆฌ)๋ฅผ ์ฌ์ฉํ์ฌ CREATE2 opcode๋ฅผ ํธ์ถํ๋ ์ค๋งํธ ๊ณ์ฝ
- ๋ค์ ์์ฑ์์์ ๊ณ์ฝ์ ํด๋นํ๋ ์ง๊ฐ ๋ฐ์ดํธ์ฝ๋:
constructor () {
address hotWallet = 0xโฆ;
address token = 0xโฆ;
token.transfer (hotWallet, token.balanceOf (address (this)));
selfdestruct (address (0));
}
๊ฐ๊ฐ์ ์ ๊ท ์ฌ์ฉ์์ ๋ํด ์ฐ๋ฆฌ๋ ๊ณ์ฐ์ ํตํด ์ง๊ฐ ์ฃผ์๋ฅผ ํ์ํฉ๋๋ค.
keccak256 (0xff ++ address ++ salt ++ keccak256 (init_code)) [12:]
์ฌ์ฉ์๊ฐ ํด๋น ์ง๊ฐ ์ฃผ์๋ก ํ ํฐ์ ์ ์กํ๋ฉด ๋ฐฑ์๋์์ ๋งค๊ฐ๋ณ์๊ฐ ํฌํจ๋ ์ ์ก ์ด๋ฒคํธ๋ฅผ ํ์ธํฉ๋๋ค. _์๊ฒ์ง๊ฐ ์ฃผ์์ ๋์ผํฉ๋๋ค. ์ด ์์ ์์๋ ์ง๊ฐ์ ๋ฐฐํฌํ๊ธฐ ์ ์ ์ด๋ฏธ ๊ฑฐ๋์์์ ์ฌ์ฉ์์ ์์ก์ ๋๋ฆฌ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ง๊ฐ ์ฃผ์์ ์ถฉ๋ถํ ํ ํฐ์ด ์์ด๋ฉด ํ๊บผ๋ฒ์ ํซ์๋ ์ผ๋ก ์ ์กํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด ๋ฐฑ์๋๋ ๋ค์ ์์ ์ ์ํํ๋ ์ค๋งํธ ๊ณ์ฝ ํฉํ ๋ฆฌ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
function deployWallet (ัะพะปั uint256) {
bytes memory walletBytecode =โฆ;
// invoke CREATE2 with wallet bytecode and salt
}
๋ฐ๋ผ์ ์ง๊ฐ ์ค๋งํธ ๊ณ์ฝ ์์ฑ์๊ฐ ํธ์ถ๋์ด ๋ชจ๋ ํ ํฐ์ ํซ์๋ ์ฃผ์๋ก ์ ์กํ ๋ค์ ์์ฒด ์๋ฉธ๋ฉ๋๋ค.
์ ์ฒด ์ฝ๋๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค
์ ์ Pavel Kondratenkov, ์ด๋๋ฆฌ์ ์ ๋ฌธ๊ฐ
์ถ์ฒ : habr.com