728x90

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 함수를 호출할 때 사용한 함수 서명을 나타냅니다.
728x90

+ Recent posts