728x90
반응형
Solidity는 에러를 제어하기 위해 다양한 함수를 제공하고, 일반적으로 에러가 발생하면 원래의 상태로 돌아갑니다.
에러를 컨트롤하기 위해서, 다음과 같은 메소드들이 있습니다.
● require(bool condition)
● require(bool condition, string memory message)
● assert(bool condition)
● revert()
● revert(string memory reason)
오늘은 위 메소드들 중 require를 자세하게 살펴보겠습니다.
1. require(bool condition) - In case condition is not met, this method call reverts to original state. This method is to be used for errors in inputs or external components.
2. require(bool condition, string memory message) - In case condition is not met, this method call reverts to original state. This method is to be used for errors in inputs or external components. It provides an option to provide a custom message.
1번과 2번의 차이는 error 발생 시, 커스텀 된 메시지 리턴 유무입니다.
저번 피드에서 스마트 계약의 배포자 주소를 얻는 방법에 대해 알아보았습니다.
2023.01.02 - [블록체인] - [블록체인] (Solidity) msg.sender 사용 - 공부하는 도비
msg.sender를 사용하여, 계약 배포자가 아닌 사람이 선언한 변수의 값을 변경하려고 할 때 오류를 발생시키는 코드를 짜보겠습니다.
pragma solidity ^0.8.1;
contract Practice {
uint256 private totalSupply;
address public owner;
constructor () public {
owner = msg.sender;
}
function setTotalSupply(uint _newSupply) public {
require(owner == msg.sender);
totalSupply = _newSupply;
}
function getTotalSupply() public view returns (uint256) {
return totalSupply;
}
}
변수 uint256 private totalSupply 와 address public owner가 선언되었습니다.
이 코드는 계약 배포자가 아니면, setTotalSupply함수를 사용할 수 없는 코드입니다.
즉, 코드 배포자가 아니라, 다른 주소를 가진 사용자가 이 함수에 접근하여 totalSupply 값을 바꾸려하면 오류가 나면서 원래의 값(상태)으로 되돌아갑니다.
계약을 실행하고, owner를 눌러 계약 배포자의 주소를 확인합니다.
owner의 주소는 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
getTotalSupply를 눌러보면 아직 셋팅된 값이 없기 때문에 0으로 보이는 걸 확인할 수 있습니다.
이제 setTotalSupply에 새로운 값(100000)을 주고, 다시 getTotalSupply를 눌러보겠습니다.
트랜잭션이 정상적으로 실행됩니다.
여기서 주소를 바꾸고(owner와 다른 주소), setTotalSupply를 실행시켜보겠습니다.
새로운 주소 : 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2f
위 새로운 주소(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2f)를 가진 사람이 setTotalSupply를 실행시키면면, 아래 처럼 오류가 발생합니다.
"The transaction has been reverted to the initial state."
또한, 오류 발생 후 초기의 값으로 돌아가기 때문에, getTotalSupply함수를 클릭하면 초기 값 100000를 리턴하는 것도 확인할 수 있습니다.
require(bool condition, string memory message)처럼 작성한 예제도 함께 보여드리겠습니다.
pragma solidity ^0.8.1;
contract Practice {
uint256 private totalSupply;
address public owner;
constructor () public {
owner = msg.sender;
}
function setTotalSupply(uint _newSupply) public {
//require(owner == msg.sender);
require(owner == msg.sender, "Not Owner, Only Owner Can Call This.");
totalSupply = _newSupply;
}
function getTotalSupply() public view returns (uint256) {
return totalSupply;
}
}
에러 발생시 리턴하는 메시지를 설정하였기 때문에, 에러 발생 시 특정 메시지가 출력되는 걸 확인할 수 있습니다.
'Blockchain > Solidity' 카테고리의 다른 글
Send Ether to the Smart Contract (1) 및 payable 개념 - 공부하는 도비 (0) | 2023.01.04 |
---|---|
delete element of array and mapping - 공부하는 도비 (0) | 2023.01.02 |
msg.sender 사용 - 공부하는 도비 (0) | 2023.01.02 |
<address>.balance(uint256) 사용 - 공부하는 도비 (0) | 2022.12.29 |
Ethereum Goerli Test Network로 테스트 이더 받기 - 공부하는 도비 (0) | 2022.12.20 |