치트시트
치트시트 (Cheatsheet)
Solidity의 가장 자주 쓰이는 문법과 내장 기능을 한눈에 정리한 치트시트예요. 연산자 우선순위부터 ABI 인코딩 함수, 주소 멤버, 블록·트랜잭션 속성, 검증 함수, 타입 정보, 가시성 지정자까지 빠르게 참조하기 좋아요. 자세한 의미는 각각의 본문 문서에서 확인할 수 있어요.
출처: 문서
본문
연산자 우선순위 (Order of Precedence of Operators)
다음은 연산자 우선순위를 평가 순서대로 나열한 표예요.
| 우선순위 | 설명 | 연산자 |
|---|---|---|
| 1 | 후위 증가·감소 | ++, -- |
| new 표현식 | new <typename> |
|
| 배열 첨자 | <array>[<index>] |
|
| 멤버 접근 | <object>.<member> |
|
| 함수 호출 | <func>(<args...>) |
|
| 괄호 | (<statement>) |
|
| 2 | 전위 증가·감소 | ++, -- |
| 단항 마이너스 | - |
|
| 단항 연산 | delete |
|
| 논리 NOT | ! |
|
| 비트 NOT | ~ |
|
| 3 | 거듭제곱 | ** |
| 4 | 곱셈, 나눗셈, 모듈로 | *, /, % |
| 5 | 덧셈과 뺄셈 | +, - |
| 6 | 비트 시프트 연산자 | <<, >> |
| 7 | 비트 AND | & |
| 8 | 비트 XOR | ^ |
| 9 | 비트 OR | | |
| 10 | 부등식 연산자 | <, >, <=, >= |
| 11 | 등식 연산자 | ==, != |
| 12 | 논리 AND | && |
| 13 | 논리 OR | || |
| 14 | 삼항 연산자 | <conditional> ? <if-true> : <if-false> |
| 할당 연산자 | =, ` |
|
| 15 | 콤마 연산자 | , |
ABI 인코딩·디코딩 함수 (ABI Encoding and Decoding Functions)
abi.decode(bytes memory encodedData, (...))returns(...): 제공된 데이터를 ABI-디코딩해요. 타입은 두 번째 인자로 괄호 안에 주어져요. 예:(uint a, uint[2] memory b, bytes memory c) = abi.decode(data, (uint, uint[2], bytes))abi.encode(...)returns(bytes memory): 주어진 인자를 ABI-인코딩해요.abi.encodePacked(...)returns(bytes memory): 주어진 인자를 패킹 인코딩(packed encoding)해요. 이 인코딩은 모호할 수 있다는 점에 주의해요.abi.encodeWithSelector(bytes4 selector, ...)returns(bytes memory): 두 번째 인자부터 주어진 인자를 ABI-인코딩하고, 주어진 4바이트 셀렉터를 앞에 붙여요.abi.encodeCall(function functionPointer, (...))returns(bytes memory): 튜플에 들어 있는 인자로functionPointer에 대한 호출을 ABI-인코딩해요. 전체 타입 검사를 수행해 타입이 함수 시그니처와 일치하는지 확인해요. 결과는abi.encodeWithSelector(functionPointer.selector, ...)와 같아요.abi.encodeWithSignature(string memory signature, ...)returns(bytes memory):abi.encodeWithSelector(bytes4(keccak256(bytes(signature))), ...)와 동일해요.
bytes와 string의 멤버 (Members of bytes and string)
bytes.concat(...)returns(bytes memory): 가변 개수의 인자를 하나의 바이트 배열로 이어붙여요.string.concat(...)returns(string memory): 가변 개수의 인자를 하나의 문자열 배열로 이어붙여요.
address의 멤버 (Members of address)
<address>.balance(uint256): Wei 단위의 주소 잔액.<address>.code(bytes memory): 주소의 코드(비어 있을 수 있음).<address>.codehash(bytes32): 주소의 코드해시.<address>.call(bytes memory)returns(bool, bytes memory): 주어진 페이로드로 저수준 CALL을 실행하고 성공 여부와 반환 데이터를 돌려줘요.<address>.delegatecall(bytes memory)returns(bool, bytes memory): 주어진 페이로드로 저수준 DELEGATECALL을 실행하고 성공 여부와 반환 데이터를 돌려줘요.<address>.staticcall(bytes memory)returns(bool, bytes memory): 주어진 페이로드로 저수준 STATICCALL을 실행하고 성공 여부와 반환 데이터를 돌려줘요.<address payable>.send(uint256 amount)returns(bool): 주소로 주어진 양의 Wei를 보내고, 실패하면false를 반환해요(비권장).<address payable>.transfer(uint256 amount): 주소로 주어진 양의 Wei를 보내고, 실패하면 예외를 던져요(비권장).
블록과 트랜잭션 속성 (Block and Transaction Properties)
blockhash(uint blockNumber)returns(bytes32): 주어진 블록의 해시. 최근 256개 블록에 대해서만 동작해요.blobhash(uint index)returns(bytes32): 현재 트랜잭션과 연관된index번째 blob의 버전 해시. 버전 해시는 버전(현재0x01)을 나타내는 단일 바이트와, 그 뒤의 KZG 커밋먼트의 SHA256 해시 마지막 31바이트로 구성돼요(EIP-4844). 주어진 인덱스의 blob이 없으면 0을 반환해요.block.basefee(uint): 현재 블록의 기본 수수료(EIP-3198과 EIP-1559).block.blobbasefee(uint): 현재 블록의 blob 기본 수수료(EIP-7516과 EIP-4844).block.chainid(uint): 현재 체인 ID.block.coinbase(address payable): 현재 블록 채굴자의 주소.block.difficulty(uint): 현재 블록 난이도(EVM < Paris). 다른 EVM 버전에서는 다음 breaking 릴리스에서 제거될block.prevrandao의 비권장 별칭으로 동작해요.block.gaslimit(uint): 현재 블록의 가스 한도.block.number(uint): 현재 블록 번호.block.prevrandao(uint): 비콘 체인이 제공하는 난수(EVM >= Paris, EIP-4399 참고).block.slotnum(uint64): 현재 비콘 체인 슬롯 번호(EVM >= Amsterdam, EIP-7843 참고).block.timestamp(uint): Unix epoch 이후 초 단위의 현재 블록 타임스탬프.gasleft()returns(uint256): 남은 가스.msg.data(bytes): 전체 콜데이터.msg.sender(address): 메시지의 발신자(현재 호출).msg.sig(bytes4): 콜데이터의 처음 4바이트(즉 함수 식별자).msg.value(uint): 메시지와 함께 보내진 wei의 수.tx.gasprice(uint): 트랜잭션의 가스 가격.tx.origin(address): 트랜잭션의 발신자(전체 호출 체인).
검증과 단언 (Validations and Assertions)
assert(bool condition): 조건이 거짓이면 실행을 중단하고 상태 변경을 되돌려요(내부 에러에 사용).require(bool condition): 조건이 거짓이면 실행을 중단하고 상태 변경을 되돌려요(잘못된 입력이나 외부 컴포넌트의 에러에 사용).require(bool condition, string memory message): 조건이 거짓이면 실행을 중단하고 상태 변경을 되돌려요(잘못된 입력이나 외부 컴포넌트의 에러에 사용). 에러 메시지도 제공해요.revert(): 실행을 중단하고 상태 변경을 되돌려요.revert(string memory message): 실행을 중단하고 설명 문자열을 제공하며 상태 변경을 되돌려요.
수학·암호 함수 (Mathematical and Cryptographic Functions)
keccak256(bytes memory)returns(bytes32): 입력의 Keccak-256 해시를 계산해요.sha256(bytes memory)returns(bytes32): 입력의 SHA-256 해시를 계산해요.ripemd160(bytes memory)returns(bytes20): 입력의 RIPEMD-160 해시를 계산해요.ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s)returns(address): 타원곡선 서명에서 공개키와 연관된 주소를 복구하고, 오류 시 0을 반환해요.addmod(uint x, uint y, uint k)returns(uint):(x + y) % k를 계산해요. 덧셈은 임의 정밀도로 수행되고2**256에서 래핑되지 않아요. 버전 0.5.0부터k != 0임을 단언해요.mulmod(uint x, uint y, uint k)returns(uint):(x * y) % k를 계산해요. 곱셈은 임의 정밀도로 수행되고2**256에서 래핑되지 않아요. 버전 0.5.0부터k != 0임을 단언해요.erc7201(string memory id)returns(uint): erc7201 스토리지 네임스페이스의 기본 슬롯을 계산해요. 컴파일 타임 컨텍스트에서 사용할 수 있어요.
컨트랙트 관련 (Contract-related)
this(현재 컨트랙트의 타입): 현재 컨트랙트.address또는address payable로 명시적으로 변환 가능해요.super: 상속 계층에서 한 단계 위의 컨트랙트.selfdestruct(address payable recipient): 모든 자금을 주어진 주소로 보내고(Cancun 이전 EVM에서 또는 컨트랙트를 생성하는 트랜잭션 안에서 호출될 때만) 컨트랙트를 파괴해요.
타입 정보 (Type Information)
type(C).name(string): 컨트랙트의 이름.type(C).creationCode(bytes memory): 주어진 컨트랙트의 생성 바이트코드. 타입 정보(Type Information) 참고.type(C).runtimeCode(bytes memory): 주어진 컨트랙트의 런타임 바이트코드. 타입 정보 참고.type(I).interfaceId(bytes4): 주어진 인터페이스의 EIP-165 인터페이스 식별자를 담은 값. 타입 정보 참고.type(T).min(T): 정수 타입T가 나타낼 수 있는 최솟값. 타입 정보 참고.type(T).max(T): 정수 타입T가 나타낼 수 있는 최댓값. 타입 정보 참고.
함수 가시성 지정자 (Function Visibility Specifiers)
open in Remix
function myFunction() <visibility specifier> returns (bool) {
return true;
}
public: 외부 및 내부에서 보임(스토리지/상태 변수에 대해 게터 함수를 생성).private: 현재 컨트랙트에서만 보임.external: 외부에서만 보임(함수만). 즉this.func를 통해서만 메시지 호출할 수 있어요.internal: 내부에서만 보임.
수정자 (Modifiers)
- 함수의
pure: 상태의 수정이나 접근을 허용하지 않아요. - 함수의
view: 상태의 수정을 허용하지 않아요. - 함수의
payable: 호출과 함께 Ether를 받을 수 있게 해줘요. - 상태 변수의
constant: 할당을 허용하지 않아요(초기화 제외), 스토리지 슬롯을 차지하지 않아요. - 상태 변수의
immutable: 생성 시점에 할당을 허용하고, 배포 시에는 상수예요. 코드에 저장돼요. - 이벤트의
anonymous: 이벤트 시그니처를 토픽으로 저장하지 않아요. - 이벤트 파라미터의
indexed: 파라미터를 토픽으로 저장해요. - 함수와 수정자의
virtual: 파생 컨트랙트에서 함수나 수정자의 동작을 바꿀 수 있게 해줘요. override: 이 함수, 수정자 또는 public 상태 변수가 기본 컨트랙트의 함수나 수정자 동작을 바꾼다고 선언해요.