[블록체인 기술] Solidity 문법_1

hskim_·2022년 5월 24일
0
post-thumbnail

Solidity

EVM에서 실행되는 스마트 컨트랙트 개발을 위해 설계된 정적 타입(static-typed)의 중괄호(curly-braces) 프로그래밍 언어.

정적타입과 동적타입은 무엇?

우선 타입이라는 것을 먼저 이해하자면, 직역하여 자료형 이라 일컫음. 자료형은 boolean, number, string, object 등이 있음.

  • 정적 타입
    위에서 말한 타입을 자료형이 컴파일 될 때 결정하는 언어일 경우 불리는 명칭. 이로인해 정적 타입이라 불리우는 언어들은 변수에 들어갈 값의 형태에 따라 자료형을 지정해줘야하는 특징을 지님. 만약 자료형에 맞지 않은 값을 넣고자한다면 컴파일 에러가 발생함.
  • 동적 타입
    정적 타입과 다르게 타입을 실행 시에 결정함. 때문에 변수를 선언할 때 따로 타입을 지정해줄 필요가 없음.

SPDX License Identifier

특이하게도 solidity는 스마트 컨트랙트에 대한 신뢰를 높이고, 저작권 등의 문제를 해소하기 위해 코드의 상단에 아래 라이센스 코드를 주석으로 항상 명시하게 되어있음. ( licenses list : https://spdx.org/licenses/ )

// SPDX-License-Identifier: MIT

Pragma

특정 컴파일러의 버전을 표기하기 위해서 사용함. 라이센스와 마찬가지로 코드의 최상단에 작성되어야 하며, 예시는 아래와 같음. 아래처럼 작성될 경우 컴파일 버전을 0.8.7로 사용하겠다는 말과 같음.

pragma solidity 0.8.7;

import

JavaScript와 동일한 방법으로 import 사용이 가능함.

상태 변수

스마트 컨트랙트에서의 상태 변수란 컨트랙트 스토리지에 영구적으로 저장되는 변수를 말함. 때문에 상태 변수를 선언할 때는 아래와 같은 형식으로 진행.

  1. 변수명으로 선언

    {데이터타입} {변수명};
    예시 : uint data;

  2. 변수 선언 및 초기화

    {데이터타입} {변수명} = {초기화할 값};
    예시 : uint data = 27;

Data Type (값 형)

  1. bool
bool data = true;
  1. int, uint
    부호(+,-)가ㅏ 있는 경우에는 int, 부호가 없으면서 0이상의 값에는 uint 사용.
    특이하게도 int와 uint의 뒤에는 8의 배수를 붙여주어 변수의 크기를 비트 단위로 할당할 수 있음.
    (예 : int8일 경우, -256 ~ 255)
int seoulTemp = -20
uint myAge = 30

고정 바이트 배열

아래 예시를 살펴보면, bytes 뒤에 숫자 3이 고정된 크기를 말해주고, 그 안에 3개의 알파벳 a,b,c가 선언 되었음을 확인할 수 있다. 때문에, 각각의 알파벳은 인덱스 값 0,1,2를 가진다.

bytes3 alphabets = 'abc'

alphabets[0] // 'a'
alphabets[1] // 'b'
alphabets[2] // 'c'

Address

주소는 0x로 시작하고 최대 40자리, 16진수로 구성되는 문자열을 값으로 가짐. (크기는 20바이트).
주소를 선언하는 형태는 아래와 같음.

address yourAddress = 0x10abb5efEcdc01234f7b2384912398798E089Ab2;

특이사항으로 스마트 컨트랙트에서는 해당 주소 값에 송금을 하기 위해서 필히 아래처럼 payable을 붙여주어야 함.
아래는 먼저 주소 변수를 선언해주고, 이를 송금 가능하도록 새로운 변수에 선언해주는 형태

address addr1;

address payable p_addr1 = payable(addr1);

송금을 받을 수 있는 컨트랙트로 만들기

위에선 주소를 송금이 가능하도록 변경해주는 작업이었다면 이번엔 컨트랙트 자체를 송금이 가능하도록 바꾸어주는 코드를 살펴본다. 아래를 보면 payable 코드가 붙음으로써 컨트랙트의 구조 자체를 송금이 가능하도록 바꾸어줄 수 있음을 참고한다.

contract C  {
	constructor () payable { }
} 

address payable addr = address(C);

Data Type (참조형)

참조형 변수란, 배열처럼 데이터를 연속하여 저장할 때, 해당 배열에 저장되어 있는 값의 첫번째 주소를 값으로 가지는 변수, 즉 첫번째 주소를 참조하는 변수를 말한다.

  • 메모리와 스토리지
    참조형 데이터 타입을 정리하기 전에 먼저 메모리와 스토리지에 대한 구분이 필요하다. 메모리는 프로그램이 동작하는 동안에만 값을 기억하지만, 스토리지는 블록체인에 영구적으로 기록되며 유지되는 데이터영역을 말한다.

참조형 변수를 선언할 때에는 메모리, 스토리지 중 어디에 저장할 지를 지정해주어야 한다.
아래 코드는 5개의 int32 fixedSlots 변수를 메모리에 저장한다.

function f() {
	int32[5] memory fixedSlots;
	fixedSlots[0] = 13;
}

배열

배열은 정적 배열과 동적배열 선언 둘로 나뉜다. 아래 코드(uint 타입의 배열)로 비교해본다.

  • 정적 배열 (배열의 크기를 미리 지정)
uint[4] {배열이름}
  • 동적 배열 (배열의 크기 미지정)
uint[] {배열이름}

문자열

JavaScript처럼 문자열의 길이와 push()메소드가 없다는 차이 외에는 같음. 선언 방식은 아래와 같다.

string name = 'hskim';

구조체

서로 다른 유형(타입)의 항목을 포함하는 집합. 코드로 보는게 이해가 빠름. 아래를 보면 struct를 이용해 UserInfo라는 구조체를 선언해주고 해당 객체 안에는 주소, 문자 각기 다른 유형(타입)의 변수가 공존하고 있음.

contract exmapleC {    
	struct UserInfo {
	    address account;
	    string lastName;
	    string firstName;
	}
}

구조체 사용법

구조체를 사용하고자 한다면, 아래처럼 각 항목에 대한 값을 객체 형태로 추가하여 사용함. 여기서는 account변수에 newAddress를 값으로 추가해준 것.

function newUser (address newAddress, string newLastName, string newFirstName){
	    UserInfo memory newOne = UserInfo({
        	account: newAddress, 
        	lastName: newLastName, 
        	firstName: newFirstName
        })
	}

매핑

스토리지 데이터 영역에서 키와 값 형태로 데이터를 저장할 때 사용하는 참조형

mapping({키 형식}=> {값 형식}) {변수명}

  • 코드 예시
mapping(address => int) public userAddress;
profile
열심히, 꾸준히, 그리고 정확히

0개의 댓글