์จํจ๋ก์ง Wasm ๊ธฐ์ ์ ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐ์ง dApp ์ค๋งํธ ๊ณ์ฝ์ ๋ธ๋ก์ฒด์ธ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๋น์ฉ์ ์ค์ฌ dApp ์ํ๊ณ๋ฅผ ํฌ๊ฒ ๊ฐํํฉ๋๋ค.
์ง๊ธ
Rust๋ก WASM ๊ณ์ฝ ๊ฐ๋ฐ
๊ณ์ฝ ์์ฑ
์ด๊ฒ์ด ์์ฑํ๋ ํ๋ก์ ํธ ๊ตฌ์กฐ:
Cargo.toml ํ์ผ์ ๊ธฐ๋ณธ ํ๋ก์ ํธ ์ ๋ณด ๋ฐ ์ข
์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ณด๋ฅผ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํ์ผ์ [lib] ์น์
์ crate-type = ["cdylib"]๋ก ์ค์ ๋์ด์ผ ํฉ๋๋ค. lib.rs ํ์ผ์ ๊ณ์ฝ ๋
ผ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ํ Cargo.toml ๊ตฌ์ฑ ํ์ผ์ [dependencies] ์น์
์ ์ข
์์ฑ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
์ด ์ข
์์ฑ์ ํตํด ๊ฐ๋ฐ์๋ ์ง๋ ฌํ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๋๊ตฌ ๋ฐ ์จํจ๋ก์ง ๋ธ๋ก์ฒด์ธ๊ณผ ์ํธ ์์ฉํ๋ ์ธํฐํ์ด์ค๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
๊ณ์ฝ ์ ๋ ฅ ๊ธฐ๋ฅ
๋ชจ๋ ํ๋ก๊ทธ๋จ์๋ ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ณด๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ์ ๋ ฅ ๊ธฐ๋ฅ์ด ์์ง๋ง ๊ณ์ฝ์๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. Rust๋ฅผ ์ด์ฉํ์ฌ Wasm ์ปจํธ๋ํธ๋ฅผ ๊ฐ๋ฐํ ๋ ์ปจํธ๋ํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ ๋ ฅ ํจ์๋ก ๊ธฐ๋ณธ invoke ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. Rust์ ํจ์ ์ด๋ฆ์ Rust ์์ค ์ฝ๋๋ฅผ ๊ฐ์ ๋จธ์ ์์ ์คํํ ์ ์๋ ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผํ ๋ ๋ช ํํ์ง ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ค๋ณต ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๊ณ์ฝ์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ธฐ ์ํด ํธ์ถ ํจ์๋ #[no_mangle] ์ฃผ์์ ์ถ๊ฐํฉ๋๋ค.
invoke ํจ์๋ ํธ๋์ญ์ ์ ์คํํ๊ธฐ ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ด๋ป๊ฒ ์ป์ต๋๊น?
ontio_std ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํธ๋์ญ์ ์ ์คํํ๊ธฐ ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ป๊ธฐ ์ํด runtime::input() ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ฐ๋ฐ์๋ ZeroCopySource๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ ๋ฐ์ดํธ ๋ฐฐ์ด์ ์ญ์ง๋ ฌํํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฝ์ ๋ฐ์ดํธ์ ์ฒซ ๋ฒ์งธ ๋ฐฐ์ด์ ํธ์ถ ๋ฉ์๋์ ์ด๋ฆ์ด๊ณ ๊ทธ ๋ค์ ๋ฉ์๋ ๋งค๊ฐ ๋ณ์๊ฐ ์์ต๋๋ค.
์ปจํธ๋ํธ ์คํ ๊ฒฐ๊ณผ๋ ์ด๋ป๊ฒ ๋ฐํ๋๋์?
ontio_std ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ runtime::ret ํจ์๋ ๋ฉ์๋ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
์์ฑ๋ invoke ํจ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ณ์ฝ ๋ฐ์ดํฐ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ
๊ณ์ฝ์ ๊ฐ๋ฐํ๋ ๊ณผ์ ์์ ๊ฐ๋ฐ์๋ ํญ์ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ, ํนํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ ๋ฐ์ดํฐ ์ ํ์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ตฌ์กฐ ๋ฐ์ดํฐ ์ ํ์ ์ป๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฝ์ ๋ฐ์ดํธ ๋ฐฐ์ด์ ์ญ์ง๋ ฌํํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ์ ๋ถ๋ชํ๋๋ค.
ontio_std ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฐ์ดํฐ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ๋ฅผ ์ํ ๋์ฝ๋ ๋ฐ ์ธ์ฝ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ตฌ์กฐ์ฒด์ ํ๋๋ ๋ํ ๋์ฝ๋ ๋ฐ ์ธ์ฝ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฏ๋ก ๊ตฌ์กฐ์ฒด๋ฅผ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํํ ์ ์์ต๋๋ค. ๋ค์ํ ๋ฐ์ดํฐ ์ ํ์ด ์ง๋ ฌํ๋ ๋ Sink ํด๋์ค์ ์ธ์คํด์ค๊ฐ ํ์ํฉ๋๋ค. Sink ํด๋์ค์ ์ธ์คํด์ค์๋ ๋ฐ์ดํธ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ธํธ ์ ํ ํ๋ buf๊ฐ ์์ผ๋ฉฐ ์ง๋ ฌํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ buf์ ์ ์ฅ๋ฉ๋๋ค.
๊ณ ์ ๊ธธ์ด ๋ฐ์ดํฐ(์: byte, u16, u32, u64 ๋ฑ)์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ์ง์ ๋ฐ์ดํธ ๋ฐฐ์ด๋ก ๋ณํ๋ ๋ค์ buf์ ์ ์ฅ๋ฉ๋๋ค. ๊ณ ์ ๊ธธ์ด๊ฐ ์๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ๊ธธ์ด๋ฅผ ๋จผ์ ์ง๋ ฌํํ ๋ค์ Ddata๋ฅผ ์ง๋ ฌํํด์ผ ํฉ๋๋ค(์: u16, u32 ๋๋ u64 ๋ฑ์ ํฌํจํ์ฌ ํฌ๊ธฐ๋ฅผ ์ ์ ์๋ ๋ถํธ ์๋ ์ ์).
์ญ์ง๋ ฌํ๋ ์ ๋ฐ๋์ ๋๋ค. ๋ชจ๋ ์ง๋ ฌํ ๋ฐฉ๋ฒ์ ํด๋นํ๋ ์ญ์ง๋ ฌํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ญ์ง๋ ฌํ์๋ Source ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด ํด๋์ค ์ธ์คํด์ค์๋ buf ๋ฐ pos๋ผ๋ ๋ ๊ฐ์ ํ๋๊ฐ ์์ต๋๋ค. Buf๋ ์ญ์ง๋ ฌํํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๊ณ pos๋ ํ์ฌ ์ฝ์ ์์น๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํน์ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ๊ธธ์ด๋ฅผ ์๊ณ ์์ผ๋ฉด ์ง์ ์ฝ์ ์ ์๊ณ ๊ธธ์ด๋ฅผ ์ ์ ์๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ๋จผ์ ๊ธธ์ด๋ฅผ ์ฝ์ ๋ค์ ๋ด์ฉ์ ์ฝ์ ์ ์์ต๋๋ค.
์ฒด์ธ์ ๋ฐ์ดํฐ ์ก์ธ์ค ๋ฐ ์ ๋ฐ์ดํธ
์จํจ๋ก์ง-wasm-cdt-rust - ๊ฐ๋ฐ์๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฒด์ธ์์ ๋ฐ์ดํฐ ์ถ๊ฐ, ์ญ์ , ๋ณ๊ฒฝ ๋ฐ ์ฟผ๋ฆฌ์ ๊ฐ์ ์์ ์ ๊ตฌํํ๋ ๋ฐ ํธ๋ฆฌํ ์ฒด์ธ์ ๋ฐ์ดํฐ ์์ ์ ์ํ ์ด์ ๋ฐฉ๋ฒ์ ์บก์ํํ์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค::get(ํค) - ์ฒด์ธ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ ํค๋ AsRef ์ธํฐํ์ด์ค์ ๊ตฌํ์ ์์ฒญํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค::put(ํค, ๊ฐ) - ๋คํธ์ํฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. Key๋ AsRef ์ธํฐํ์ด์ค์ ๊ตฌํ์ ์์ฒญํ๊ณ value๋ Encoder ์ธํฐํ์ด์ค์ ๊ตฌํ์ ์์ฒญํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค::์ญ์ (ํค) - ์ฒด์ธ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ ํค๋ AsRef ์ธํฐํ์ด์ค์ ๊ตฌํ์ ์์ฒญํฉ๋๋ค.
๊ณ์ฝ ํ ์คํธ
๊ณ์ฝ์ ๋ฉ์๋๊ฐ ๊ตฌํ๋๋ฉด ์ฒด์ธ์ ๋ฐ์ดํฐ์ ์ก์ธ์คํด์ผ ํ๊ณ ๊ณ์ฝ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํ ์ ์ ํ ๊ฐ์ ๋จธ์ ์ด ํ์ํ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ํ
์คํธ๋ฅผ ์ํด ๊ณ์ฝ์ ์ฒด์ธ์ ๋ฐฐํฌํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ํ
์คํธ ๋ฐฉ๋ฒ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ฐ๋ฐ์๊ฐ ๊ณ์ฝ์ ๋ ์ฝ๊ฒ ํ
์คํธํ ์ ์๋๋ก ontio_std ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ
์คํธ๋ฅผ ์ํ ๋ชจ์ ๋ชจ๋์ ์ ๊ณตํฉ๋๋ค. ์ด ๋ชจ๋์ ํ๋ก์ ๋ฐ์ดํฐ ์๋ฎฌ๋ ์ด์
์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ๊ณ์ฝ์ ๋ฐฉ๋ฒ์ ๋จ์ ํ
์คํธํ๊ธฐ ์ฝ๊ฒ ํฉ๋๋ค. ๊ตฌ์ฒด์ ์ธ ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
๊ณ์ฝ ๋๋ฒ๊น
console::debug(msg)๋ ๊ณ์ฝ์ ๋๋ฒ๊น ํ๋ ๋์ ๋๋ฒ๊ทธ ์ ๋ณด๋ฅผ ํ์ํฉ๋๋ค. msg ์ ๋ณด๋ ๋ ธ๋ ๋ก๊ทธ ํ์ผ์ ์ถ๊ฐ๋ฉ๋๋ค. ์ ์ ์กฐ๊ฑด์ ๋ก์ปฌ ์จํจ๋ก์ง ํ ์คํธ ๋ ธ๋๊ฐ ์คํ ์ค์ผ ๋ ๋ก๊ทธ ํ์ผ ์์ค์ ๋๋ฒ๊ทธ ๋ชจ๋๋ก ์ค์ ํ๋ ๊ฒ์ ๋๋ค.
runtime::notify(msg)๋ ๊ณ์ฝ์ด ๋๋ฒ๊น ๋๋ ๋์ ์ ์ ํ ๋๋ฒ๊ทธ ์ ๋ณด๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์ด ๋ฉ์๋๋ ์ฒด์ธ์ ์ ๋ ฅ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ getSmartCodeEvent ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฒด์ธ์์ ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค.
์ด ๊ธฐ์ฌ๋ ํนํ OntologyRussia๋ฅผ ์ํด Hashrate&Shares ํธ์ง์๊ฐ ๋ฒ์ญํ์ต๋๋ค.
ํด๋ฆญ
๋น์ ์ ๊ฐ๋ฐ์์
๋๊น? ๊ธฐ์ ์ปค๋ฎค๋ํฐ์ ๊ฐ์
ํ์ธ์.
์จํจ๋ก์ง
์จํจ๋ก์ง ์น์ฌ์ดํธ GitHub์ /๋์ค์ฝ๋ - ํ
๋ ๊ทธ๋จ
์์ด /๋ฌ์์์ธ ํธ์ํฐ /๋ ๋ง
์ถ์ฒ : habr.com