2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

솔리디티에서 'require'와 'assert'의 차이는 무엇인가요?

_____
Q: 솔리디티에서 `require`와 `assert`의 차이는 무엇인가요?

A: `require`와 `assert`는 모두 조건 검증을 위해 쓰이며, 조건이 충족되지 않을 때 트랜잭션을 중단시키지만, 용도와 동작 방식에 차이가 있습니다.

---

1. 목적과 사용 용도

- `require`
- 함수 입력값 검증, 외부 호출 조건, 유효한 상태인지 확인 등 유효성 검사(validation) 에 사용합니다.
- 보통 사용자가 잘못된 입력을 제공했거나, 특정 조건이 맞지 않을 때 실행을 중단시킵니다.
- 예: `require(msg.sender == owner, "Caller is not owner");`

- `assert`
- 코드 내부 논리적 오류나 상태가 절대 발생하지 않아야 하는 경우의 검증에 쓰입니다.
- 스마트 컨트랙트 내부 불변식(invariant) 또는 가정이 깨졌을 때 사용하며, 버그가 있을 가능성이 있는 경우 활용됩니다.
- 예: `assert(totalSupply == balancesSum);`

---

2. 가스 사용 및 동작 방식 차이

- `require`
- 조건이 실패하면 상태 변경을 모두 되돌리고, 남은 가스를 호출자에게 반환합니다.
- 오류 메시지(string)를 전달할 수 있어 디버깅에 용이합니다.
- `assert`
- 조건이 실패하면 모든 상태 변경을 되돌리지만, 남은 가스를 소진합니다 .
- 오류 메시지를 제공하지 않으며, EVM의 내부 오류로 간주되어 심각한 이상 상태임을 나타냅니다.

---

3. 실제 권장 사항

- 일반적인 입력값 검증이나 외부 조건 검증에는 `require`를 사용하세요.
- 논리적 오류나 절대적으로 발생하면 안 되는 상황 점검에는 `assert`를 사용해야 하며, `assert`가 실패하면 보안 이슈나 컨트랙트 버그가 있다는 신호입니다.

---

요약 표

| 특징 | require | assert |
|-----------------|----------------------------------------------|-------------------------------------------|
| 사용 목적 | 입력값 및 외부 조건 검증 | 내부 오류, 불변 조건 검증 |
| 가스 처리 | 실패 시 남은 가스 반환 | 실패 시 가스 전부 소진 |
| 오류 메시지 지원| 지원 (`require(condition, "Error message")`) | 비지원 |
| 의미 | 잘못된 입력, 사용자 오류 | 컨트랙트 버그, 심각한 내부 오류 |

---

결론:
- 개발 시, 외부 입력 조건 검증에는 `require`를
- 내부 논리적 무결성 확인에는 `assert`를 사용하여 스마트 컨트랙트의 안정성과 보안성을 강화하세요.
Solidity에서 `require`와 `assert`는 모두 조건을 검사하고, 조건이 충족되지 않을 경우 트랜잭션을 실패시키는 데 사용되는 함수입니다.

그러나 이 두 함수는 사용 목적과 동작 방식에서 중요한 차이점이 있습니다.

아래에서 이 두 함수의 차이점과 각각의 사용 사례에 대해 자세히 설명하겠습니다.

1. `require` - 목적 : `require`는 주로 입력값 검증, 상태 조건 확인, 외부 호출의 성공 여부 등을 확인하는 데 사용됩니다.

예를 들어, 함수의 인자가 유효한지, 특정 조건이 충족되는지 등을 검사할 때 사용합니다.

- 사용 예 : ```solidity function transfer(address to, uint256 amount) public { require(to != address(0), "Invalid address"); require(balance[msg.sender] >= amount, "Insufficient balance"); balance[msg.sender] -= amount; balance[to] += amount; } ``` - 가스 반환 : `require`가 실패하면, 해당 트랜잭션은 revert되고, 사용자가 지불한 가스의 일부가 반환됩니다.

이는 사용자가 잘못된 입력을 제공했을 때, 가스 비용을 절약할 수 있게 해줍니다.

- 에러 메시지 : `require`는 실패 시 사용자 정의 에러 메시지를 제공할 수 있어, 어떤 조건이 실패했는지 쉽게 파악할 수 있습니다.



2. `assert` - 목적 : `assert`는 코드의 불변 조건을 검사하는 데 사용됩니다.

즉, 프로그램의 논리적 오류를 확인하는 데 적합합니다.

예를 들어, 상태 변수가 특정 값이어야 하거나, 함수가 호출된 후에 어떤 조건이 항상 참이어야 할 때 사용합니다.

- 사용 예 : ```solidity function withdraw(uint256 amount) public { uint256 previousBalance = balance[msg.sender]; balance[msg.sender] -= amount; assert(balance[msg.sender] == previousBalance - amount); } ``` - 가스 반환 : `assert`가 실패하면, 해당 트랜잭션은 revert되고, 사용자가 지불한 가스는 반환되지 않습니다.

이는 `assert`가 코드의 심각한 오류를 나타내기 때문에, 이러한 오류가 발생했을 경우에는 가스 비용을 반환하지 않는 것이 일반적입니다.

- 에러 메시지 : `assert`는 사용자 정의 에러 메시지를 제공하지 않으며, 실패 시 기본적인 오류 메시지만 반환합니다.

이는 디버깅을 어렵게 만들 수 있습니다.

요약 - 사용 목적 : - `require`: 입력값 검증 및 외부 조건 확인에 사용. - `assert`: 코드의 불변 조건 및 논리적 오류 확인에 사용. - 가스 처리 : - `require`: 실패 시 가스 일부 반환. - `assert`: 실패 시 가스 반환 없음. - 에러 메시지 : - `require`: 사용자 정의 메시지 제공 가능.

- `assert`: 기본 오류 메시지만 제공. 결론 `require`와 `assert`는 Solidity에서 조건을 검사하는 데 중요한 역할을 합니다.

`require`는 주로 사용자 입력이나 외부 조건을 검증하는 데 사용되며, `assert`는 코드의 논리적 오류를 확인하는 데 사용됩니다.

이 두 가지를 적절히 사용함으로써, 스마트 계약의 안정성과 신뢰성을 높일 수 있습니다.

작성자: 김지훈 [비회원] | 작성일자: 1년 전 2024-11-22 19:32:05
조회수: 142 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.