본문 바로가기
블록체인 및 경제/솔리디티

11. 솔리디티 암호화폐 지불(호텔룸 예약하기 프로그램)

by kimsfamily 2020. 11. 12.

1. 스마트 계약의 시작, 리믹스 도구 사용해보기

2. 솔리디티 개발환경 구성

3. 스마트컨트랙트 작성 후 배포하기

4. openzeppelin 사용하여 ERC20 토큰 만들기

5. Ropsten 테스트넷에 ERC20토큰 배포하기

6. web3.js 와 자바스크립트를 활용한 간단한 예제

7. 솔리디티 기초, 리믹스로 컨트랙트 작성하기

8. 솔리디티 기본문법 (변수, 데이터타입, 구조체)

9. 솔리디티 배열, 맵핑

10. 솔리디티 조건문, 반복문(if, else, for)

11. 솔리디티 암호화폐 지불(호텔룸 예약하기 프로그램)

12. 솔리디티 상속

13. 리믹스 솔리디티 6.0 버전 ERC20토큰 만들기

14. web3.js 와 자바스크립트를 활용하여 (이더잔액조회) 지갑 만들기

15. 솔리디티 컨트랙트 Web.js 활용하여 웹으로 보여주기




 

이번시간에는 암호화폐를 지불하고, 호텔 예약을 할 수 있는 스마트컨트랙트를 간단하게 작성해보겠습니다. 전체코드는 아래와 같습니다.

 

하나씩 코드를 작성하면서 설명을 하도록 하겠습니다.

 

1) payable 키워드

 payable 키워드는 계약계정에 이더를 사용(이더 송금, 수신 등)할 수 있도록 해줍니다.

이더를 사용하여 호텔 예약을 할 예정이므로 payable 식별자를 위와 같이 지정해줍니다.

book() 함수의 transfer() 함수는 이더의 수량만큼 전송하게 해줍니다.

자, 기본적으로 위와 같은 구성을 한뒤 필요한 걸 하나씩 추가하겠습니다.

 

2) enum(열거형)

호텔예약이 되었는지 안되었는지에 대한 상태 변수를 enum을 사용해서 아래와 같이 추가했습니다.

enum은 미리 정의된 상수들의 목록입니다. 값에 의해서 전달이 되며 각각 자체 값을 쥬이합니다. 함수 내에서는 선언이 불가하며, 계약의 전역 이름공간에 선언할 수 있습니다.

아래 예에서는 Vacant에는 정수값 0이, Occupied에는 정수값 1이 셋팅이 됩니다. (자동으로 0,1,2,3 순서임..)

3) require() 함수

 예약을 위해서 두가지를 체크해줍니다. 가격과 방이 비어있는지에 대한 여부입니다.

 이를 확인하기 위해서 require()함수를 사용하면 쉽게 적용할 수 있습니다.

 아래 예에서 require 함수의 첫번째 값이 true이면 아래코드가 실행이 되고, false이면 오른쪽에 메세지가 출력이 되고 아래 코드는 실행되지 않습니다.

 

4) modifier(수정자)

 위 작성된 코드를 수정자를 사용하여 함수를 세분화합니다.

 일반적인 프로그래밍 언어에서 수정자는 실행중인 코드의 행위를 변경하는 구조체를 가르킵니다. 솔리디티에서는 수정자가 항상 함수와 연관성을 가집니다. 즉 솔리디티에서 수정자를 사용하면 연관된 함수의 행위를 변경할 수 있습니다. 위의 예에서 실행순서를 보면 modifier onlywhilevacant, modifier costs 수정자가 먼저 실행이 되고, 그 이후에 아래의 함수가 실행이 됩니다. 

 일반적으로 솔리디티에서는 이 수정자를 사용하여 현재 계약의 상태, 상태변수, 이더값등 실행이 가능한지 여부를 사전에 체크한 이후에 실제 필요한 함수를 수행하는데 사용이 됩니다. (즉 유효성 검증, 진위확인여부 등을 위해서 이러한 수정자를 사용하는것이 코드를 읽고 이해하는데 큰 도움이 됩니다. 향후에 에러나 다양한 상황에도 쉽게 대처할 수 있죠~)

 

5) Event(이벤트)

 이벤트는 아래와 같이 사용합니다.

이벤트는 특정 이벤트가 발생하는 경우 해당 이벤트를 처리하는 코드를 실행할 수 있습니다. 솔리디티의 이벤트는 EVM의 로깅환경을 이용하여 애플리케이션의 현재 계약상태에 대한 정보를 알려주는데 주로 사용됩니다. 계약에 변화가 있을 경우 이벤트가 사용되며 다양하게 적용할 수 있습니다.

 

이벤트 선언은 위와 같이 선업합니다. (파라미터 변수를 명시적으로 제공하지 않아도 됩니다.)

사용은 아래에 emit Occupy처럼 사용합니다.

 

6) receive() 함수

 

마지막으로 book() 함수를 아래와 같이 receive() external로 변경해줍니다.

receive() 함수는 메타마스크등과 같이 연결된 지갑을 통해서 결제 할 수 있도록 해줍니다.

 

7) 실행

 컴파일, Deploy후 실행해봅니다.

 owner의 주소를 확인합니다.

 

 

다른계정을 선택하고, 1이더를 송금해봅니다.

아래에 Transact 클릭하면, 오른쪽에 Not enough Ether provided를 확인할 수 있습니다.

이제 정상적으로 2이더를 송금해봅니다.

정상적으로 송금이 되었으면, 아래와 같이 스마트컨트랙트가 보내진걸 확인할 수 있습니다.

다른 계정으로 한번 더 이더를 보내면, 아래와 같이 Currently occupied라고 뜨면서 더 이상 예약 할 수 없는걸 확인할 수 있습니다.

 

 

 

소스코드

gist.github.com/gwmccubbin/e8c3107cbc07417aa941b42c8f7fa04c

 

아래 사이트 참고하여 재작성된 강의안입니다.

www.dappuniversity.com/articles/solidity

 

반응형

댓글0