//
Search
๐Ÿ“œ

Solidity

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 ํ•ด์‹œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.