티스토리 뷰
반응형
Ether Units
- 접미사
- Ether에서 더 작은 범위의 숫자를 표현하기 위해 사용
- 접미사가 없는 Ether은 Wei로 가정
Ethereum의 하위 유닛들
Unit | wei value | wei | ether value |
---|---|---|---|
wei | 1 wei | 1 | 10^-18 ETH |
kwei | 10^3 wei | 1,000 | 10^-15 ETH |
mwei | 10^6 wei | 1,000,000 | 10^-12 ETH |
gwei | 10^9 wei | 1,000,000,000 | 10^-9 ETH |
microether | 10^12 wei | 1,000,000,000,000 | 10^-6 ETH |
milliether | 10^15 wei | 1,000,000,000,000,000 | 10^-3 ETH |
ether | 10^18 wei | 1,000,000,000,000,000,000 | 1 ETH |
assert(1 wei == 1);
assert(1 gwei == 1e9);
assert(1 ether == 1e18);
Time Units
- 시간 단위 표현에 사용
- 초가 기본 단위
- 리터럴 숫자 + 단위 조합으로 사용
- 변수에 사용이 불가능
윤초(시간 보정을 위해 사용)가 발생할 수 있기 때문에 오라클로 calendar 라이브러리를 업데이트해야 함
단위
- seconds
- minutes
- hourse
- days
- weeks
years는 삭제됨
// 변수에 사용이 불가능 하기 대문에 1 days를 곱하여 적용
if (block.timestamp >= start + daysAfter * 1 days) {
// ...
}
}
// 부호의 관계는 아래와 같음
assert(1 seconds == 1);
assert(1 minutes == 60 seconds);
assert(1 hours == 60 minutes);
assert(1 day == 24 hours);
assert(1 week == 7 days);
Special Variables and Functions
- global namespace에 존재
- 블록체인의 정보 제공
- 일반적으로 사용되는 유틸리티 함수 역할
괄호 안은 리턴 값
Block and Transaction Properties
- blockhash(uint blockNumber) returns (bytes32): 해당 블록의 hash 값 - 현재 블록을 제외한 가장 최근 256 블록에만 적용
- block.chainid (int): 현재 체인의 id
- block.coinbase (address payable): 현재 블록 채굴자의 address
- block.difficulty (uint): 현재 블록 난이도
- block.gaslimit (uint): 현재 블록의 gaslimit
- block.number (uint): 현재 블록의 번호
- block.timestamp (uint): unix epoch 이후의 현재 블록 타임스탬프
- gasleft() returns (uint256): 잔여 gas
- msg.data (bytes calldata): 완전한 calldata
- msg.sender (address): 현재 호출 메시지 발신자
- msg.sig (bytes4): calldata의 첫 4바이트(함수 식별자와 같음)
- msg.value (uint): 메시지와 전송된 wei수
- tx.gasprice (uint): 트랜잭션의 gas 가격
- tx.origin (address): 트랜잭션의 발신자
Note
- msg.sender와 msg.value를 포함한 msg의 모든 멤버의 값은 모든 외부 함수(라이브러리 함수도 포함) 호출에 의해 변경 가능
- 무엇을 하는지 모른다면, 랜덤 소스로 block.timestamp나 blockhash에 의존 하지 말 것
- block hash는 범위 문제로 모든 블록에 적용할 수는 없음
- block.blockhash가 blockhash로 변경
- msg.gas가 gasleft로 변경
- now가 사라짐
ABI Encoding and Decoding Functions
abi.decode(bytes memory encodedData, (...)) returns (...): 데이터를 두번째 argument의 타입으로 ABI-decode
(uint a, uint[2] memory b, bytes memory c) = abi.decode(data, (uint, uint[2], bytes))
abi.encode(...) returns (bytes memory): argument로 ABI-encode
abi.encodePacked(...) returns (bytes memory): packed encoding 수행
abi.encodeWithSelector(bytes4 selector, ...) returns (bytes memory): 두번째 argument부터 ABI-encode 수행하고 앞에 argument로 받은 4바이트 크기의 selector을 붙임
abi.encodeWithSignature(string memory signature, ...) returns (bytes memory): abi.encodeWithSelector와 같음
Members of bytes
- bytes.concat(...) returns (bytes memory) argument를 하나의 바이트 배열로 연결
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;
contract C {
bytes s = "Storage";
function f(bytes calldata c, string memory m, bytes16 b) public view {
bytes memory a = bytes.concat(s, c, c\[:2\], "Literal", bytes(m), b);
// s.length: 문자열 s 길이
// c.length: 문자열 c 길이
// 2: 문자열 c에서 2 바이트만 슬라이싱
// 7: 문자열 "Literal"의 크기
// bytes(m).length: bytes(m)의 길이
// 16: b는 bytes16 타입
assert((s.length + c.length + 2 + 7 + bytes(m).length + 16) == a.length);
}
}
Error Handling
- assert(bool condition): 조건이 충족되지 않으면 에러 발생 - 내부 오류에 사용
- require(bool condition): 조건이 충족되지 않으면 되돌림 - 입력과 외부 구성요소에 사용
- require(bool condition, string memory message): 조건이 충족되지 않으면 되돌림 - 입력과 외부 구성요소에 사용 + 에러 메시지 제공
- revert(): 실행 중지 및 상태 변경 취소
- revert(string memory reason): 설명 문자열과 함께 실행 중지 및 상태 변경 취소
if (msg.sender != owner) { throw; }
과 표현이 유사한 것들
if(msg.sender != owner) { revert(); }
assert(msg.sender == owner);
require(msg.sender == owner);
assert
와 require
은 실행을 중지revert
은 실행을 중지하고 되돌림
Mathematical and Cryptographic Functions
- addmod(uint x, uint y, uint k) returns (uint): (x + y) % k 계산. 0.5.0 버전 이후부터 k != 0을 보장
- mulmod(uint x, uint y, uint k) returns (uint): (x * y) % k 계산. 0.5.0 버전 이후부터 k != 0을 보장
- 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을 리턴
Members of Address Types
- <address>.balance (uint256): wei 주소의 잔고
- <address payable>.transfer(uint256 amount): amount 크기의 wei를 address로 전송
- <address payable>.send(uint256 amount) returns (bool): amount 크기의 wei를 address로 전송. 실패시 false 반환.
- <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
Contract Related
- this: address로 명시적 변환이 가능한 현재 contract
- selfdestruct(address payable recipient):address에 자금을 보내고 contract를 파기하고 종료
- 받는 contract의 받는 함수는 실행되지 않음
- contract는 transaction의 끝날 때 파기됨
- revert는 파기한 것을 되돌릴 수 있음
Type Information
type(X)
: X에 대한 정보
- 아직은 기능이 제한적
contract type에 사용할 수 있는 속성
- type(C).name: contract의 이름
- type(C).creationCode
- type(C).runtimeCode
- type(I).interfaceId
integer type에 사용가능한 속성
- type(T).min
- type(T).max
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- postman
- 1차 인터뷰
- mysql
- Squash and merge
- 코딩테스트
- solidity
- Kotlin In Action
- pm.expect
- Python
- squash merge
- go 특징
- Basic Type
- github
- DGS Framework
- git
- pm.test
- python3
- 코틀린
- postman collection
- Kotlin
- java
- postman tests
- 주생성자
- 네이버 2022 공채
- 2차 인터뷰
- hashcode
- 확장 함수
- string
- downTo
- graphql
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함