Modifier, Interface, Event

김진경·2022년 5월 2일
0

Solidity

목록 보기
1/2

modifier

Modifier는 함수의 동작을 변화시키기 위해 사용된다. 이는 Modifier를 사용하면 함수를 실행시키기 전과 실행시킨 후에 특정한 기능을 할 수 있도록 만들 수가 있다는 것이다. 예를들면, 함수를 실행하기 전에, 스마트 컨트랙트를 배포한 사람의 계정과 실행하는 사람의 계정이 동일한 지 확인 할 수도 있다.

Modifier를 사용하면 사전에 어떤 조건에 부합되는지 확인이 가능하다. Modifier는 스마트컨트랙트의 상속이 가능, overriding 해서 사용이 가능하다.

Modifier 사용예시

pragma solidity ^0.5.7;
contract joker {
	uint public data = 0;
    
    modifier check {
    	data ++;
        _;
    }
    
    function getWithCheck() check public {
    	...
    }

Modifier _; (underscore)

Modifier를 작성할때 _; 를 사용하게 된다. _; 는 함수 실행하는 시점을 나타내는 것이다.
함수의 작동을 변화시키려는 어떤 코드를 추가하기 원한다면 modifier안에 _; 를 기준으로 작성하면 된다.

pragma solidity ^0.5.7;
contract joker {
	uint public mutex = 0;
  	uint public exeCnt = 0;
    
    modifier check {
		mutex ++;
        _;
      	mutex --;
    }
    
    function getWithCheck() check public {
    	if(mutex == 1) exeCnt = exeCnt + 1;
    }
}

getWithCheck 함수가 check modifier를 사용하고 있다. 이 함수가 호출될 때, 함수와 modifier의 처리는 _; 를 기준으로 아래 그림처럼 동작한다.

check는 함수를 호출시키기 전에 mutex 값을 1 증가 시키고, 호출 완료된 후에는 mutex 값을 1 감소시키는 modifier이다.




이벤트

이벤트(Event)는 컨트랙트 내부에서 일어난 일을 클라이언트 쪽에 전달하기 위해 사용한다. 스마트 컨트랙트가 Event를 send하면 프론트엔드 코드에서 listen하는 식으로 동작한다.

// 이벤트 선언.
event IntegersAdded(uint x, uint y, uint result);

// 함수 선언
function add(uint _x, uint _y) public {
    uint result = _x + _y;
    // 이벤트를 실행하여 앱에게 add 함수가 실행되었음을 알린다:
    IntegersAdded(_x, _y, result);
    return result;
}

// 클라이언트
YourContract.IntegersAdded(function(error, result) {
    // 결과와 관련된 행동을 취한다
})

선언한 IntegersAdded는 자신을 사용하는 함수(add)의 실행 여부를 클라이언트에 전달한다. 컨트랙트 내부에서 함수 'add'가 실행되면 포함된 이벤트가 실행되고, 이를 클라이언트도 감지한다.

이벤트를 정의할 때, parameter에는 프론트엔드에 전달할 데이터들을 정의한다. 아래의 예시를 보자. kitty를 사냥하면 경험치를 주는 dApp을 만들려고 한다. 이 경우 프론트엔드에 kittyId와 exp를 전달한다.

스마트 컨트랙트 코드) i. 이벤트 정의: “Kitty 사냥 성공” 이벤트

// 이벤트 선언
event HuntedKitty(uint kittyId, uint exp);

스마트 컨트랙트 코드) ii. 이벤트 발생: “Kitty 사냥 성공" 발생!

// 이벤트를 발생시키는 함수
function huntKitty(uint kittyId, uint exp) {
  HuntedKitty(kittyId, exp); // 이벤트 발생! 프론트엔드 코드로 이벤트 전달
  delete kitties[kittyId]; // kitties 배열에서 사냥당한 kitty 삭제
}

프론트엔드 코드) iii. 이벤트 처리: “Kitty 사냥 성공" 이벤트 수신 및 처리

// huntKitty로부터 발생한 이벤트 HuntedKitty를 감지하여 결과를 프론트에서 출력.
MyContract.HuntedKitty((error, result) => {
  showHuntedKittyWithExp(result.kittyId, result.exp); // 사냥한 Kitty와 얻은 경험치를 보여줌.
}



인터페이스

https://www.youtube.com/watch?v=7H9eb_6QRAk
https://cryptozombies.io/ko/lesson/2/chapter/10
https://goodgid.github.io/Ethereum-Basic-Solidity-(8)/

profile
Maktub.

0개의 댓글