🔑 코인 투자 추천 링크 🔑
[NEW] 누구나 쉽게 따라하는 솔리디티 강의(솔리디티 버전 0.8.13)
5. 배열, 열거형(enum), 구조체(calldata,memory)
8. 이벤트(events), 생성자(constructor), 상속
10. 인터페이스(interface), payable, 이더전송,받기 관련
11. Fallback, Call, Delegate(솔리디티 업그레이드 기법)
12. 함수 선택자(function selector), 다른 컨트랙트 사용 및 생성기법
13. Try Catch, Import(임포트), Library(라이브러리)
14. ABI 디코드, hash 함수, 서명검증, 가스최적화
* 블록체인 전문가들도 놓치기 쉬운 비트코인, 이더리움의 핵심가치 강의
1. 에러(error)
- 에러가 발생하면 트랜잭션 중에 발생하는 모든 상태변화를 취소(undo) 합니다.
- require, revert, assert 를 사용할 수 있음
- require : 실행 전에 조건과 입력값을 확인하는데(검증하는데) 사용됨
- revert : require와 유사함, 예제코드에서 확인, 가스비가 더 발생 (좀 더 엄격한 상황에서 사용)
- assert : 코드가 절대로 false가 되어서는 안되는 상황을 체크, assert 결과가 실패이면 코드에 아마도 버그가 있음을 의미
1.1 require()
- 입력값
- 실행 전 조건 체크
- 다른 함수의 호출에 대한 값 반환
1.2 revert()
- 조건이 복잡한 경우에 유용하게 사용할 수 있음 (여러 조건의 상황)
1.3 assert()
- assert는 내부 오류 테스트를 위해서 사용 (추가적으로 불변량을 체크하기 위해서 사용)
- 아래 예제에서 num은 항상 0이어야 하는 상황에서 assert로 검증가능
1.4 사용자 정의 에러
- 아래 예제와 같이 사용자 정의 에러를 만들 수 있음.
전체소스파일
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Error {
function testRequire(uint _i) public pure {
// Require should be used to validate conditions such as:
// - inputs
// - conditions before execution
// - return values from calls to other functions
require(_i > 10, "Input must be greater than 10");
}
function testRevert(uint _i) public pure {
// Revert is useful when the condition to check is complex.
// This code does the exact same thing as the example above
if (_i <= 10) {
revert("Input must be greater than 10");
}
}
uint public num;
function testAssert() public view {
// Assert should only be used to test for internal errors,
// and to check invariants.
// Here we assert that num is always equal to 0
// since it is impossible to update the value of num
assert(num == 0);
}
// custom error
error InsufficientBalance(uint balance, uint withdrawAmount);
function testCustomError(uint _withdrawAmount) public view {
uint bal = address(this).balance;
if (bal < _withdrawAmount) {
revert InsufficientBalance({balance: bal, withdrawAmount: _withdrawAmount});
}
}
}
1.5 Deposit와 withdraw 예제
소스파일
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Account {
uint public balance;
uint public constant MAX_UINT = 2**256 - 1;
function deposit(uint _amount) public {
uint oldBalance = balance;
uint newBalance = balance + _amount;
// balance + _amount does not overflow if balance + _amount >= balance
require(newBalance >= oldBalance, "Overflow");
balance = newBalance;
assert(balance >= oldBalance);
}
function withdraw(uint _amount) public {
uint oldBalance = balance;
// balance - _amount does not underflow if balance >= _amount
require(balance >= _amount, "Underflow");
if (balance < _amount) {
revert("Underflow");
}
balance -= _amount;
assert(balance <= oldBalance);
}
}
2. 함수 수정자(function modifier)
- 수정자는 함수 호출 전후에 실행할 수 있는 코드
- 수정자를 사용하여, 엑세스 제한, 유효한 입력값 확인, 재진입 해킹으로부터 보호 가능
- owner, x, locked 상태변수 설정. 그리고 오너의 주소를 생성자를 통해서 저장.
- 수정자(modifier)를 사용하여 owner만 사용, 유효한 주소에 대해서 체크.
- 수정자(modifier)의 경우에 문법 마지막에 _; 를 사용. (솔리디티에서의 수정자 문법)
- 위 수정자 정의 후, 아래의 함수 실행시 owner 변경에 대해서 사전 체크함.
- 수정자는 함수가 사용되기 전, 후에 호출될 수 있음
- 이 수정자는 함수가 실행되는 동안 호출되는것을 방지함.
- 재진입 해킹으로부터의 보호. (decrement에서 실행)
소스출처 : https://solidity-by-example.org/
블록체인 교육 문의는 아래 링크 참고 바랍니다.
댓글