Solidity
Solidity๋ ์ค๋งํธ ๊ณ์ฝ ์์ฑ์ ์ํ ์ธ์ด๋ก EVM์์ ์ฌ์ฉํ๋ค.
์๋ผ๋ ๊ฐ์ ํ๋ซํผ์ Rust, C++๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ ์๋ก์ด ์ธ์ด๋ฅผ ๋ง๋ค์๋๊ฐ?
๋ธ๋ก์ฒด์ธ ์์คํ
์ ๋ฐ์ํ๋ ๊ตฌ์กฐ์ ์ธ์ด๋ฅผ ๋ง๋ค๊ธฐ ์ํด์์ด๋ค.
์ธ์ด๋ CPU์ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์ฐ, ๋์คํฌ๋ ๋คํธ์ํฌ ์ ๊ทผ์ ์ํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์๋ก ํ๋ค.
๋ธ๋ก์ฒด์ธ์ storage ์์ญ๊น์ง ๋์ผํด์ผ ํ๋ค. ๊ฒ์์ด ๋์คํฌ์ ์ ์ฅ๋๋ ์์น๋ ๊ฐ ์ปดํจํฐ๋ง๋ค ๋ค๋ฅผ ์ ์์ง๋ง, ๋ธ๋ก์ฒด์ธ์ ๋ชจ๋ ์ปดํจํฐ์์ ๋์ผํ ํธ๋์ญ์
์ ์ฒ๋ฆฌํ๊ณ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์จ๋ค.
ํ๋์ ์ปจํธ๋ํธ๊ฐ ๋ค๋ฅธ ์ปดํจํฐ ์์์ ์คํ๋์ด๋ ๊ฒฐ๊ณผ๋ ๋์ผํด์ผ ํ๋ฉฐ, ์ธ๋ถ ๋ณ์์ ์ํด์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์์์ผ ํ๋ค.
๋ชจ๋ ๋ฐ์ดํฐ ์์ ์์
์ ํธ๋์ญ์
์์์ ์ด๋ฃจ์ด์ง๋ฉฐ, ์ธ๋ถ์ ์ฐจ๋จ๋ ์ํ์์ oracle์ด storage ๊ฐ์ ๋ฏธ๋ฆฌ ๋ณ๊ฒฝํด ๋๋๋ค. ์ดํ์ ํธ๋์ญ์
์ oracle์ด ์ ์ฅํ storage๋ฅผ ๊ฐ์ ธ์จ๋ค.
Stack-based vs Register-based
virtual machine์ ์ข
๋ฅ. stack based๋ ์คํํฌ์ธํฐ๋ก ์ธํด์ ์ ์ผ ์๋จ์ ์๋ ๊ฒ์ ๊ธฐ์ค์ผ๋ก ์ฐ์ฐ์ด ์ผ์ด๋๋๊ฒ. stack based๋ ์ฌ์ค์ ๋ ์ง์คํฐ ๋๊ฐ๋ง ์์ด๋ ๋จ. ๋ช
๋ น์ด๊ฐ ์งง์์ง๋ค.
register based๋ ๋ ์ง์คํฐ 4๊ฐ๋ฅผ ์ด๋ค. ๋ชจ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ ์ฅ์ ์ด ์์ง๋ง ๋ ๋ณต์กํ๋ค.
EVM
EVM์ stack-based VM์ผ๋ก, ์คํ ํฌ์ธํฐ๋ฅผ ํตํด ์๋จ์ ์๋ ๊ฒ๋ค์ ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ง๋ค.
EVM์ stack-based์ด๋ฉฐ, JVM๋ stack-based์ด๋ค. ์ฝ๋ ์์ ์ค์ผ ์ ์๋ ์ฅ์ ์ด ์๋ค.
โข
Word size: 256bit๋ก, ์ต๋ ์ฒ๋ฆฌํ ์ ์๋ ๋นํธ์ ๊ธธ์ด๊ฐ ํฌ๋ค. public key๋ฑ์ ํฌ๊ธฐ๊ฐ ํฌ๊ธฐ ๋๋ฌธ์ ํ๋ฒ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์์ด๋ค.
โข
Precompiled contract: address ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ํ ๋นํ์ฌ ์ ํด์ง ์ฐ์ฐ์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. (์: SHA-256 ํด์ฑ)
ํธ๋์ญ์
์์๋ฃ๋ ๊ฐ์ค๊ฐ ๊ณ์ฐ๋์ด ์ ์ ์ ์ด๋ ์๊ณ ์์ ์ฐจ๊ฐ๋๋ค.
Value Types in Solidity
Address
โข
address: EVM ์ฒด์ธ์ 20๋ฐ์ดํธ ์ฃผ์ ๊ฐ.
โข
address payable: address์ ๊ฐ์ง๋ง, ์ถ๊ฐ์ ์ผ๋ก transfer์ send ๋ฉ์๋๋ฅผ ํฌํจํ๋ค. ์ด ๋ฉ์๋๋ ์ด๋๋ฅผ ์ง์ ์ ์กํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
โข
address payable -> address: ์์์ ๋ณํ์ด ํ์ฉ๋๋ค.
โข
address -> address payable: ๋ณํํ๋ ค๋ฉด payable(<address>)๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
โข
๋ค๋ฅธ ํ์
-> address: uint160, ์ ์ ๋ฆฌํฐ๋ด, bytes20, contract์์ ๋ช
์์ ์ผ๋ก ๋ณํ ๊ฐ๋ฅ.
โข
๋ค๋ฅธ ํ์
-> address payable: ์ค์ง address์ contract๋ง ํ์ฉ๋๋ค.
๋ฉค๋ฒ ํจ์
โข
balance: ์ฃผ์์ ์์ก์ ์กฐํํ ์ ์๋ค.
โข
transfer: ์ฃผ์ด์ง ์ฃผ์๋ก ์ด๋๋ฅผ ์ ์กํ๋ฉฐ, ์์ก์ด ๋ถ์กฑํ๊ฑฐ๋ ์์ ์๊ฐ ๊ฑฐ๋ถํ ๊ฒฝ์ฐ revert๋๋ค.
โข
send: transfer์ ์ ์์ค ๋ฒ์ ์ผ๋ก, ์คํ ์คํจ ์ false๋ฅผ ๋ฐํํ๋ค.
โข
call, delegatecall, staticcall: ๋ค๋ฅธ ๊ณ์ฝ๊ณผ ์ํธ์์ฉํ๊ธฐ ์ํ ์ ์์ค ์ธํฐํ์ด์ค๋ก, ์
๋ ฅ ํ๋ผ๋ฏธํฐ๋ abi.encodeWithSignature๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฝ๋ฉํด์ผ ํ๋ฉฐ, gas์ value๋ฅผ ์๋์ผ๋ก ์ค์ ํ ์ ์๋ค.
โข
code: ๊ณ์ฝ์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
โข
codehash: ๊ณ์ฝ์ ์ฝ๋ ํด์๋ฅผ ๊ฐ์ ธ์ค๋ฉฐ, ์ฃผ์๊ฐ ๊ณ์ฝ์ธ์ง ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
Contract
โข
User-defined type: ์ฌ์ฉ์๊ฐ ์ ์ํ ํ์
์ผ๋ก, ๋ฐฐํฌ๋ ์ค๋งํธ ๊ณ์ฝ์ ๋ํ๋ธ๋ค.
โข
์ฃผ์ ๊ฐ ๋ณํ: address์ contract ๊ฐ์ ๋ช
์์ ๋ณํ์ด ๊ฐ๋ฅํ๋ค.
โข
๋ฐํ์์ ๊ณ์ฝ์ ๋ฐฐํฌํ ์ ์๋ค.
โข
์ ๊ทผ ๊ฐ๋ฅํ ๋ฉค๋ฒ: public์ผ๋ก ์ ์ธ๋ ํจ์์ ๋ณ์.
โข
type C is V: C๋ ์๋ก์ด ์ฌ์ฉ์ ์ ์ ํ์
์ด๋ฉฐ, V๋ ๊ธฐ๋ณธ๊ฐ ํ์
์ด์ด์ผ ํ๋ค.
โข
*C.wrap()**์ C.unwrap(): ์ ์ผํ๊ฒ ์์์ ์ผ๋ก ์ ์๋ ์ฐ์ฐ์.
Address ๋ฐ Selector
โข
.address: ๊ณ์ฝ์ ์ฃผ์๋ฅผ ๋ํ๋ด๋ฉฐ, ์ด ์ฃผ์๋ฅผ ํตํด ์ค๋งํธ ๊ณ์ฝ๊ณผ ์ํธ์์ฉํ ์ ์๋ค.
โข
.selector: ํจ์์ ABI(์์ฉ ํ๋ก๊ทธ๋จ ์ธํฐํ์ด์ค) ํจ์ ์ ํ์๋ฅผ ํฌํจํ๋ฉฐ, ํน์ ํจ์ ํธ์ถ์ ๊ตฌ๋ถํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
Memory
โข
์ค๋ช
: ํจ์ ํธ์ถ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ฉฐ, ํจ์ ํธ์ถ์ด ๋๋๋ฉด ์ฌ๋ผ์ง๋ค.
โข
์ฉ๋: ์์ ๋ฐ์ดํฐ ์ ์ฅ์ ์ฌ์ฉ๋๋ค.
Storage
โข
์ค๋ช
: ๊ณ์ฝ์ ์๊ตฌ ์ ์ฅ์์ ์ ์ฅ๋๋ฉฐ, ๊ณ์ฝ์ ์๋ช
์ฃผ๊ธฐ ๋์ ์ ์ง๋๋ค.
โข
์ฉ๋: ์ํ ๋ณ์๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
Calldata
โข
์ค๋ช
: ํจ์ ํธ์ถ์ ์ํ ํน๋ณํ ๋ฐ์ดํฐ ์์น๋ก, ์ฝ๊ธฐ ์ ์ฉ์ด๋ฉฐ ๋น์๊ตฌ์ ์ด๋ค.
โข
์ฉ๋: ์ธ๋ถ ํธ์ถ์์ ์ธ์๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
ํ ๋น ๋์ (Assignment Behavior)
Solidity์์๋ ๋ฐ์ดํฐ ์์น์ ๋ฐ๋ผ ํ ๋น ๋์์ด ๋ค๋ฅด๊ฒ ์๋ํ๋ค.
โข
Storage์ Memory ๊ฐ์ ํ ๋น: ํญ์ ๋
๋ฆฝ์ ์ธ ๋ณต์ฌ๋ฅผ ์์ฑํ๋ค.
โข
Memory ๊ฐ์ ํ ๋น: ์ฐธ์กฐ๋ง ์์ฑํ๋ฉฐ, ๋ณ๊ฒฝ ์ฌํญ์ด ๋ ๊ณณ์์ ๋ชจ๋ ๋ณด์ธ๋ค.
โข
Storage์์ ๋ก์ปฌ Storage ๋ณ์๋ก์ ํ ๋น: ์ฐธ์กฐ๋ฅผ ์์ฑํ๋ค.
โข
๋ค๋ฅธ Storage๋ก์ ํ ๋น: ํญ์ ๋ณต์ฌ๋๋ค.
๋ฒ์ ํ๋๊ทธ๋ง (Version Pragma)
โข
์ ์: Solidity ์์ค ์ฝ๋์ ์ปดํ์ผ๋ฌ ๋ฒ์ ์ ์ง์ ํ๋ค.
โข
์์: pragma solidity ^0.8.18;๋ 0.8.18 ์ด์ 0.9.0 ๋ฏธ๋ง์ ๋ฒ์ ์์ ์ปดํ์ผ ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ด๋ค.
ABI Coder Pragma
โข
์ ์: ABI ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ์ ์ํ ํ๋๊ทธ๋ง์ด๋ค.
โข
์์: pragma abicoder v1 ๋๋ pragma abicoder v2๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ฒฉ ๋ฐฐ์ด ๋ฐ ๊ตฌ์กฐ์ฒด๋ฅผ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉํ ์ ์๋ค.
์ํ ๋ณ์ (State Variables)
์ํ ๋ณ์๋ ๊ณ์ฝ์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฝ์ ์ํ๋ฅผ ์ ์ฅํ๋ค.
Constant
โข
์ ์: ์ปดํ์ผ ํ์์ ๊ณ ์ ๋ ๊ฐ์ผ๋ก, ์ปดํ์ผ ์ ํด๋น ๊ฐ์ ๋์ฒดํ๋ค.
Immutable
โข
์ ์: ์์ฑ์์์ ํ ๋นํ ์ ์์ผ๋ฉฐ, ๋ฐฐํฌ ์ ํด๋น ๊ฐ์ ๋์ฒดํ๋ค.
ํจ์์ ์ํ (Function State)
โข
view: ์ํ ๋ณ์๋ฅผ ์ฝ์ ์ ์์ง๋ง ์์ ํ ์ ์๋ค.
โข
pure: ์ํ ๋ณ์๋ฅผ ์ฝ๊ฑฐ๋ ์์ ํ ์ ์๋ค. ์ฆ, ํจ์ ๋ด์์ ์ํ์ ๊ด๋ จ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ฒคํธ (Events)
์ด๋ฒคํธ๋ ๊ณ์ฝ์ ๋ก๊น
๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์๋ค.
โข
๊ธฐ๋ฅ: ๊ณ์ฝ์ ์ํ ๋ณํ๋ ํน์ ์์
์ด ์ํ๋ ๋ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๋ค.
โข
๊ตฌ๋
๋ฐ ์ฒญ์ทจ: ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๋ฒคํธ๋ฅผ ์ฒญ์ทจํ๊ณ ๋ฐ์ํ ์ ์๋ค.
โข
์ธ๋ฑ์ค๋ ์์ฑ: ์ต๋ ์ธ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ธ๋ฑ์คํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ด๋ฒคํธ์ "์ฃผ์ "๋ก ํ์๋๋ค.
๋ธ๋ก ๊ด๋ จ ์ ๋ณด
โข
block.coinbase: ํ์ฌ ๋ธ๋ก์ ์ฑ๊ตดํ ๋ง์ด๋์ ์ฃผ์๋ฅผ ๋ํ๋ธ๋ค.
โข
block.difficulty: ํ์ฌ ๋ธ๋ก์ ๋์ด๋๋ฅผ ๋ํ๋ด๋ฉฐ, EVM์ด Paris ์ด์ ์ผ ๊ฒฝ์ฐ ๋์ด๋๋ฅผ ๋ฐํํ๊ณ , EVM์ด Paris ์ดํ์ผ ๊ฒฝ์ฐ block.prevrandao์ ๋ณ์นญ์ผ๋ก ์ฌ์ฉ๋๋ค.
โข
block.gaslimit: ํ์ฌ ๋ธ๋ก์ ๊ฐ์ค ํ๋์ด๋ค.
โข
block.number: ํ์ฌ ๋ธ๋ก ๋ฒํธ๋ฅผ ๋ํ๋ธ๋ค.
โข
block.prevrandao: ๋น์ฝ ์ฒด์ธ์์ ์ ๊ณตํ๋ ๋์์ด๋ค.
๋ฉ์์ง ๊ด๋ จ ์ ๋ณด
โข
msg.data: ํจ์ ํธ์ถ ์ ์ ๋ฌ๋ calldata๋ฅผ ํฌํจํ๋ค.
โข
msg.sender: ๋ฉ์์ง๋ฅผ ์ ์กํ ์ฃผ์๋ฅผ ๋ํ๋ธ๋ค.
โข
msg.sig: ํธ์ถ๋ ํจ์์ ID๋ฅผ ๋ํ๋ธ๋ค.
ABI ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ
โข
abi.decode(bytes memory encodedData, (...)): ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋์ฝ๋ฉํ๋ฉฐ, ๋ฐํ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ ๋ณ์๋ก ๋๋ ์ ์๋ค.
โข
abi.encode(...): ์ฃผ์ด์ง ์ธ์๋ฅผ ์ธ์ฝ๋ฉํ์ฌ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋ฐํํ๋ค. ์ฃผ๋ก ํจ์ ํธ์ถ ์ ์ฌ์ฉ๋๋ค.
abi.encode(addr1, addr2, mystr);
Solidity
๋ณต์ฌ
โข
abi.encodePacked(...): ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋ฐํํ๋ฉฐ, ํด์ฑ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค. ์ ์ฅ ์ฉ๋์ด ๋ ์๋ชจ๋๋ค.
abi.encodePacked(addr1, addr2, mystr);
Solidity
๋ณต์ฌ
โข
abi.encodeWithSelector(bytes4 selector, ...): ์ ํ์์ ํจ๊ป ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋ฐํํ๋ค. ํจ์ ํธ์ถ ์ ์ฌ์ฉ๋๋ค.
abi.encode(fn.selector, addr1, addr2, mystr);
Solidity
๋ณต์ฌ
โข
abi.encodeWithSignature(string memory signature, ...): ํจ์์ ์๋ช
๊ณผ ํจ๊ป ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
abi.encodeWithSignature("foo(address,address,string)", addr1, addr2, mystr);
Solidity
๋ณต์ฌ
โข
abi.encodeCall(function functionPointer, (...)): ํจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
abi.encodeCall(fn, addr1, addr2, mystr);
Solidity
๋ณต์ฌ
์ค๋ฅ ์ฒ๋ฆฌ
โข
assert(bool condition): ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์ผ๋ฉด revert๋๋ค. ๋ด๋ถ ์ค๋ฅ์ ์ฌ์ฉ๋๋ค.
โข
require(bool condition): ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์ผ๋ฉด revert๋๋ค. ์
๋ ฅ ์ค๋ฅ๋ ์ธ๋ถ ์ค๋ฅ์ ์ฌ์ฉ๋๋ค.
โข
require(bool condition, string memory message): ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์ผ๋ฉด revert๋๋ฉฐ, ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ๋ค.
โข
revert(): ์คํ์ ์ค๋จํ๊ณ ์ํ ๋ณ๊ฒฝ์ revertํ๋ค.
โข
revert(string memory reason): ์คํ์ ์ค๋จํ๊ณ ์ํ ๋ณ๊ฒฝ์ revertํ๋ฉฐ, ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ๋ค.
์ํ ๋ฐ ์ํธํ ํจ์
โข
addmod(uint x, uint y, uint k): ๋ ์์ ํฉ์ k๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๋ฐํํ๋ค. ๋ง์
์ด wrap๋์ง ์์ผ๋ฉฐ, k๊ฐ 0์ด ์๋์ง ํ์ธํด์ผ ํ๋ค.
(x + y) % k
Solidity
๋ณต์ฌ
โข
mulmod(uint x, uint y, uint k): ๋ ์์ ๊ณฑ์ k๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๋ฐํํ๋ค. ๊ณฑ์
์ด wrap๋์ง ์์ผ๋ฉฐ, k๊ฐ 0์ด ์๋์ง ํ์ธํด์ผ ํ๋ค.
(x * y) % k
Solidity
๋ณต์ฌ
โข
keccak256(bytes memory): ๋ฐ์ดํธ ๋ฐฐ์ด์ keccak256 ํด์๋ฅผ ๋ฐํํ๋ค.
โข
sha256(bytes memory): ์
๋ ฅ๊ฐ์ SHA256 ํด์๋ฅผ ๋ฐํํ๋ค.





