본문 바로가기
Develop/Solidity

[Solidity] 5. 예외처리 (require와 assert)

by Tarra 2023. 2. 14.

 

 


개인 공부 후 자료를 남겨놓기 위한 목적이므로,
생략되거나 오류가 있을 수 있음을 알립니다.

 

[Solidity] 1. 변수

[Solidity] 2. 간단한 송금 시스템 만들어보기 + 계정에 대한 이론

[Solidity] 3. 스마트 컨트랙트 시작, 중단, 정지하기

[Solidity] 4. mapping

[Solidity] 5. 예외처리 (require와 assert)

[Solidity] 6. 생성자, 대비책 함수 (view / pure / getter)

[Solidity] 7. 제어자, 상속, file import

[Solidity] 8. 이벤트 및 반환 변수

 

 


- 참고했던 document

▶ Become Ethereum Blockchain Developer

https://ethereum-blockchain-developer.com/000-learn-ethereum/

 

Overview and Pricing - Become Ethereum Blockchain Developer

Learn Blockchain Development - Become Web3 Expert Ethereum-blockchain-developer.com is offering web developers, enterprise developers and software development professionals self-paced video courses with interactive labs to become successful Ethereum Blockc

ethereum-blockchain-developer.com

 

▶ Solidity_doc

https://docs.soliditylang.org/en/v0.8.16/

 

Solidity — Solidity 0.8.16 documentation

1. Understand the Smart Contract Basics If you are new to the concept of smart contracts we recommend you to get started by digging into the “Introduction to Smart Contracts” section, which covers: 2. Get to Know Solidity Once you are accustomed to the

docs.soliditylang.org

 

▶ 솔리디티_doc

https://solidity-kr.readthedocs.io/ko/latest/

 

Solidity — Solidity 0.5.10 documentation

Solidity는 스마트 컨트랙트를 구현하기 위한 컨트랙트 기반의 고급 프로그래밍 언어입니다. Solidity는 C++, Python, 그리고 JavaScript의 영향을 받아 만들어졌습니다. 그리고 Ethereum Virtual Machine(EVM)에서

solidity-kr.readthedocs.io

 


이더리움의 특징은 원자성을 가지고 있다는 것이다.

 

이는 트랜잭션을 진행하다 오류가 발생하면 단계 복귀를 한다는 의미이다.

 

따라서 State를 업데이트할 때마다 오류가 발생한다면 revert , assert, require 가

 

촉발되게 되고, 그전에 일어났던 일들이 모두 없던 일로 돌아가게 된다.

 

 

 


 

다음의 코드를 보면 무엇이 잘못되었는지 캐치할 수 있을 것이다.

 

 

이 스마트 컨트랙트를 배포해보면, 
스마트 컨트랙트에 1이더를 넣고, 다른 계정에 10이더를 송금할 시, 
트랜잭션은 통과되나 오류메세지도 안뜨고, 아무일도 일어나지 않는다.
(제일 중요한건 사용자에게 피드백도 주지 않는 것.)


따라서 이러한 문제를 해결하기 위해서는 `require` . 즉 요구문을 사용하면 좋다.

 

 

 


 

1. require

if 문을 require 문으로 바꿔보도록 하자.

 

 

예외처리는 require 뿐이 아니다.

 

cert

cert 는 입력 유효성 검사에 사용된다.

(금액을 가져다가 사용자가 실제로 그만큼의 돈이 있는지 확인하는 것.)

 

 

 


 

2. assert

`assert` 는 내부 변수 상태, 즉 불변량 확인을 위해 사용된다.

다음과 같이 코드를 수정해보도록 하자.

 

 

가스 비용을 절약하기 위해 uint를 uint64로 줄여 주었다.

전체적인 int의 크기가 줄었기 때문에 이 정도의 양에서는 18이더 정도를 보관할 수 있게 되는데,

AC에 10 이더를 2번을 송금하게 되면, uint가 20이더를 보관할 수 없으므로 정확하지 않은 이더를 소유하게 된다.

 

이러한 문제를 해결하기 위해 스마트 컨트랙트 개발자들은 Assert 체크를 사용해 내부 상태가 훼손되지 않도록 한다.

 

 

assert를 사용하면 해당 상황에서는 예외처리가 가능하다.

 

 

 

 

💡require와 assert의 차이점

require와 assert 모두 트랜잭션을 종료하는 것은 동일하나,
그 이면에서는 더 많은 일이 벌어지고 있다.

require는 사용하지 않은 남은 가스는 사용자에게 반환하지만,
assert는 스마스 컨트랙트로 보내진 모든 가스를 전부 소비해버리고 반환하지 않는다.
따라서 assert는 스마트 컨트랙트에서 예상치 못한 일이 발생했을 경우에만 사용해야 한다.

결론!
- 입력 유효성 검사에는 보통 require 를 사용한다.
- 내부 상태나 불변량 검사를 할 때는 assert 를 사용한다.