An error will undo all changes made to the state during a transaction.
오류가 발생하면 트랜잭션 중에 상태가 변경된 내용이 모두 취소됩니다.
You can throw an error by calling require, revert or assert.
require, revert 또는 assert를 호출하여 오류를 발생시킬 수 있습니다.
Use custom error to save gas.
사용자 정의 오류를 사용하여 가스를 절약합니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
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는 다음과 같은 조건을 검증하는 데 사용되어야 한다.
// - 입력
// - 실행 전 조건
// - 호출에서 다른 기능으로 값 반환
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.
// Assert는 내부 오류를 테스트할 때만 사용해야 합니다.
// 그리고 불변량을 확인한다.
// Here we assert that num is always equal to 0
// since it is impossible to update the value of num
// 여기서 우리는 num이 항상 0과 같다고 주장한다.
// 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});
}
}
}
다음은 다른 예제다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
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
// balance - _amount does not underflow if balance >= _amount
require(balance >= _amount, "Underflow");
if (balance < _amount) {
revert("Underflow");
}
balance -= _amount;
assert(balance <= oldBalance);
}
}
Solidity - Events (0) | 2022.12.29 |
---|---|
Solidity - Function Modifier (0) | 2022.12.28 |
Solidity - View and Pure Functions (0) | 2022.12.27 |
Solidity - Fuction (0) | 2022.12.26 |
Solidity - Data Locations (0) | 2022.12.25 |