Solidity Docs를 보면서 공부하는데 생소한 문법들이 많이보인다. 아래 2가지정도를 위주로 공부하였다
함수제어자(접근제어,상태제어,사용자 정의제어,payable제어자)
예외처리
함수제어자(function modifier)
위 test함수 뒤에 있는
external , view , customModifier payable 은 모두 함수제어자이다.
1.접근제어자 (visibility modifier)
해당 함수가 언제,어디서 호출될 수 있는지 제어한다.
접근제어자는 함수를 정의할때 (param) 뒤에 쓰이기도 하고 변수 앞에 쓰이기도 하는데
보통은 (param)뒤에 쓴다.
이 접근제어자는 함수나 변수에 대한 접근을 제한하는 역할을 한다.
접근제어자는 기본적으로 public , private, internal, external 등이 있다.
public : 변수나 함수가 어디에서든 접근 가능
private : 오직 private이 정의된 Contract 에서만 사용이 가능(private로 정의된 Contract에 get , set함수를 만들어야 접근가능 )
internal : 오직 internal이 정의된 contract 안에서, 상속받은 자식 smart contract 에서 접근 가능하다. private과 유사하나 상속받은 자식 contract에서 접근이 가능하다는것이 추가되었다고 보면 된다.
external : 오직밖에서만 접근이 가능하다. public과 유사하나 , external이 정의된 contract내에서는 사용이 불가능
2. 상태 제어자(state modifier)
블록체인과 상호작용 하는 방법에 대한 것이다.
view, constant : 해당 함수를 실행해도 어떤 데이터도 저장/변경되지 않음
pure : 해당함수가 어떤 데이터도 블록체인에 저장하지 않을뿐만아니라, 블록체인으로부터 어떤 데이터도 읽지않는다.
3. 사용자 정의 제어자
직접 원하는 논리대로 제어자를 정의하여 함수에 적용할 수 있다.
// 메시지를 보낸 사람이 owner와 같은지 확인하는 제어자 정의
modifier onlyOwner () {
require(msg.sender == owner);
_; // _;와 항상 함께 쓰인다.
}
require 는 예외처리이다. 예외처리는 아래와 같다.
require : 조건이 false 에러를 발생하고 gas를 환불해줌
revert : 조건없이 에러를 발생시키고 gas를 환불
assert : gas를 다소비한 후 조건이 false일때 에러를 발생
4. payable 제어자
함수 호출을 통해 이더리움을 받을 수있는 특별한 함수 유형을 정의한다.
함수가 실행되는 동시에 컨트랙트 계정(CA)에 돈을 지불할 수 있다 . payable을 작성하지 않은 함수에서는 이더를 보낼 수 없다.
contract OnlineStore {
function buySomething() external payable {
require(msg.value == 0.001 ether);
transferThing(msg.sender);
}
}
위 코드를 정리해 보면
1. OnlineStore라는 Contract를 정의하고
2. buySomething()라는 함수를 정의하고 함수제어자로 external(external로 정의된 함수 밖에서만 접근가능)이고
payable라는 함수제어자가 있다.
3. buySomething()는 msg.value(이 함수를 호출할 떄 보낸 wei(이더)의 양을 나타낸다) 가 0.001이더가 아닐 경우 종료한다. 참일경우(value == 0.001eth) 이더를 전송한다.
msg 는 솔리디티에서 제공하는 전역변수로서 현재 함수호출에 대한 정보를 담고있다.
msg.sender
현재 함수를 호출한 주소를 나타냅니다.
msg.value
이더리움 네트워크에서, 이 함수를 호출할 때 보낸 wei의 양을 나타냅니다.
msg.data
함수를 호출할 때 보낸 데이터를 나타냅니다.
msg.gas
함수를 호출할 때 사용할 수 있는 가스의 양을 나타냅니다. (v0.4.21 이후로는 더 이상 사용되지 않습니다.)
msg.sig
함수를 호출할 때 사용한 함수 서명을 나타냅니다.