관리 메뉴

개발이야기

[스마트컨트랙트] Smart Contract 개발 - solidity 기초 2 문법 본문

블록체인 /스마트컨트랙트

[스마트컨트랙트] Smart Contract 개발 - solidity 기초 2 문법

안성주지몬 2018. 8. 14. 19:31

안녕하세요. 이번 포스팅에서는 저번 포스팅에 이어서 solidity 기초를 진행하도록 하겠습니다.

저번 포스팅에서는 solidity 개발 툴인 Remix에서 기본적인 환경설정을 해보았습니다.

이번 포스팅에서는 solidity의 기초 문법에 대해서 자세히 설명해보겠습니다.



1. Visibility 


먼저 visibility, 가시성에 대해서 살펴보겠습니다. 가시성은 함수에 접근 권한에 대해 명시합니다.


- external 


1) external은 외부 컨트랙트만 호출이 가능합니다


2) 상태 변수 (ex uint)는 external 사용 불가 => 상태변수에 external 만 사용할 수 없습니다.




위의 예시처럼 external로 선언된 testing 함수를 같은 contract 내에 isRight 함수내에서 호출을 하면 에러가 발생합니다.




- internal


1) external은 외부 컨트랙트만 호출이 가능합니다.


2) 상속받은 컨트랙트에서도 호출이 가능합니다.


3) external을 사용할 수 없던 상태변수는 default 로 internal 이 선택됩니다.



internal 로 선언된 testing 함수는 같은 컨트랙트 내에서 사용할 수 있습니다.





- public


function 은 기본적으로 public 으로 선언됩니다. 하지만 명시하지 않으면 warning message 를 전달하므로 명시해주는 것이 좋습니다.


1) public은 내부 컨트랙트에서 호출 가능합니다.


2) 상속받은 컨트랙트에서도 호출 가능하죠


3) 물론 외부 컨트랙트에서도 호출 가능합니다.



- private


1) 내부 컨트랙트에서만 호출이 가능합니다. 


private과 internal 이 같은 기능을 한다고 헷갈릴 수 있습니다. 하지만 internal은 private 과는 다르게 상속받은 컨트랙트에서도 호출이 가능합니다. 헷갈릴 수 있으니 꼭 기억하세요 !! 



2. Function 


이번엔 함수를 선언할 때 같이 선언되어 함수에 대한 접근 권한에 대해 명시하는 함수 접근 제어자에 대해서 알아보겠스습니다.


- view


1) 오직 데이터를 읽을 수만 있습니다.


2) 가스가 소모되지 않습니다.



위 예시처럼 view로 선언된 함수는 오직 데이터를 읽고 반환만 할 수 있습니다. view 로 선언된 함수 내에서 상태변수 값을 변경시면 에러가 발생합니다. 


- pure 


1) view 와 다르게 데이터를 읽는 것이 아니라 인자로 전달 받은 값을 활용해서 반환 합니다.


2) 가스가 소모되지 않습니다. 



pure는 인자로 전달받은 값만을 이용해서 값을 return 하게 됩니다. 즉 블록체인에 저장된 데이터를 불러와서 활용하지 않고 오직 인자로 전달받은 값만을 활용합니다.


- constant


0.4.17 버전 이전에는 view 와 pure 대신 사용되었지만 이제는 constant 대신 view 와 pure를 사용합니다.



- payable


1) 함수내에서 ETH를 거래할 수 있게 합니다.


2) 가스가 소모되지 않습니다. 



3.  Value Type


상태변수에 type 종류에 대해서 알아보겠습니다. 


- bool 형


true / fasle


- int 형


크기 : 8bit ~ 256bit, 크기를 선언하지 않은 int 는 int256과 같다.


- uint 형


크기 : 8bit ~ 256bit, 크기를 선언하지 않은 uint 는 uint256과 같다.

 => int형보다 더 큰 범위의 정수를 선언할 수 있다.


- address 형


20byte로 크기가 고정되어 있는데 이는 이더리움 계정의 주소 크기에 맞게 설정되어 있는것이다.

address 는 두 개의 멤버를 소유하고 있다 : balance, transfer




간단한 address형과 두 개의 멤버를 사용한 예시입니다. 
balance는 주소가 보유한 이더의 양을 나타내고 transfer는 해당 주소에 이더를 보낼 수 있게합니다.

- bytes 형


크기 : 1byte ~ 32byte , 기본값 byte는 bytes1과 같습니다.


가스 소모량은 동적 타입인 string이 bytes 형보다 큽니다. 따라서 정확한 크기를 알면 byte의 크기를 명시해주는 것이 가스 소모량을 줄이는데 좋습니다.



- 배열


1) 동적 배열

사이즈가 정해져 있지 않은 배열. ex) uint[] array;


2) 정적 배열 

사이즈가 고정되어 있는 배열. ex) uint[5] array;


- 구조체 


struct : 필요한 자료형들을 가지고 새롭게 정의하는 사용자 정의 타입



- 매핑 (mapping)  


key와 value 값으로 구성되어 있습니다. 파이썬의 딕셔너리, c++의 vector와 유사합니다. ex) mapping(key => value)


key 값은 동적 배열, 열거형, 구조체 매핑 타입을 제외한 다른 타입들은 다 가능합니다.


value 값은 매핑 포함 다른 타입 모두 다 가능합니다.


매핑은 솔리디티에서 유용하게 쓰이므로 꼭 알고 계셔야합니다!!





4.  Storage


블록체인 상에 데이터가 저장되는 위치에 대해 알아보도록 하겠습니다.


- storage


1) 변수를 블록체인에 영구히 저장합니다. 하드디스크 역할을 하는 거죠.


2) 상태변수는 기본적으로 storage로 선언됩니다.


- Memory


1) 컨트랙트가 종료되면 같이 사라집니다.


2) 임시로 변수를 저장하는 장소입니다. RAM과 유사합니다


3) 매개변수나 리턴값은 기본적으로 memory로 선언됩니다.



"


이번 포스팅에서는 solidity 기초 문법에 대해서 살펴보았습니다.

처음 solidity를 시작하시는 분 , solidity로 프로그래밍을 하면서 문법에 대해 헷갈리셨던 분들 등등 

많은 분들에게 도움이 되는 포스팅이면 좋겠습니다! 



"

Comments