Crypto Zombie로 Solidity 처음부터 공부하기 [Lesson 1]

Sungmin Oh·2021년 3월 14일
1

Version Pragma / 컨트랙트 생성하기

모든 솔리디티 코드는 Version Pragma로 시작해야 하는데, Version Pragma는 우리의 코드가 이용해야 하는 솔리디티 버전을 선언하는 것이다. 아래와 같은 방법으로 사용하면 된다.

pragma solidity ^사용할 버전;


솔리디티의 버전을 선언하고나면 컨트랙트를 생성해야한다. 컨트랙트란 이더리움 애플리케이션의 기본적인 구성 요소로, 모든 함수와 변수는 어느 한 컨트랙트에 속한다고 말할 수 있다. 컨트랙트는 아래와 같은 방법으로 생성한다.

contract 컨트랙트의 이름 {
             ...
       컨트랙트의 내용
       컨트랙트의 내용
       컨트랙트의 내용
             ...
    }

  • 예시
pragma solidity ^0.4.19;

contract HelloWorld {

}

위 예시에서 우리는 솔리디티의 0.4.19 버전을 사용할 것이라고 선언했고, HelloWorld라는 이름의 빈 컨트랙트를 선언했다. 솔리디티로 코드를 작성할 때 내가 가장 먼저 작성하는 것은 항상 위의 형식이 될 것이다.

구조체

내가 초등학교 교사라고 해보자. 나는 자리 배치 프로그램을 만들기 위해 우리 반 학생들의 이름과 키를 변수에 저장해야 한다. 나는 아래와 같은 코드를 작성했다.

string name1 = "James"
string name2 = "Chales"
string name3 = "Alice"

int tall1 = 147
int tall2 = 151
int tall3 = 142

이렇게 코드를 작성했더니 각 학생의 이름과 키를 따로 관리해야했고 나는 상당한 번거로움을 느꼈다. 이를 해결하기 위해 웹서핑을 하던 나는 구조체를 알게 되었고, 코드를 아래와 같이 개선했다.

struct student {
    string name;
    uint tall;
}

student James = ("James", 147);
student Chales = ("Chales", 151);
student Alice = ("Alice", 142);

구조체 "student"에 학생들의 이름과 키를 한 번에 저장하니 이후에 변수를 관리하는 것이 아주 편리했다. 이와 같이 구조체는 연관이 있는 다양한 자료형의 여러 변수들을 하나로 묶어서 관리할 수 있게 만들어주는 기능이다. "여러개의 자료형을 하나로 묶어 만든 새로운 자료형"이라고 이해해도 될 것 같다.

구조체는 다음과 같은 방법으로 사용한다.

struct 구조체의 이름 {
    자료형 변수이름;
    자료형 변수이름;
    ...
}

구조체에 데이터를 저장할 때는 아래와 같이 한다.

구조체의이름 변수이름 = 구조체의이름(변수, 변수, ...);
  • 예시
struct friend {
    string name;
    int tall;
}

friend Kim = friend("KimBeomSu", 173);
friend Park1 = friend("ParkMoEon", 172);
friend Park2 = friend("ParkJeongGen", 165);

배열

어떤 것의 모임이 필요할 때, 우리는 배열을 사용할 수 있다. 솔리디티에는 두 가지 종류의 배열이 존재한다.

  • 동적 배열
    담을 수 있는 원소의 개수가 미리 정해지지 않은 배열, 크기가 계속 커질 수 있다.
  • 정적 배열
    담을 수 있는 원소의 개수가 미리 정해져있는 배열

배열은 아래와 같은 방법으로 사용한다.

자료형[원소의 개수] 배열의 이름;

정적 배열을 선언하려면 [ ] 안에 원소의 개수를 넣어주면 되고, 동적 배열을 선언하려면 [ ] 안을 비워두면 된다. 또한, 자료형 자리에 구조체의 이름을 적어주면 구조체 자체의 배열을 만들 수도 있다.

배열을 만들었으면 배열에 아래와 같은 방법으로 원소를 추가할 수 있다.

배열의 이름.push(원소);
  • 예시
int[5] numbers; // 정수를 최대 5개까지 담을 수 있는 numbers라는 이름의 정적 배열
string[] Hello; // 문자열을 원하는만큼 담을 수 있는 Hello라는 이름의 동적 배열
student[] students; // 위에서 만든 student 구조체를 원하는만큼 담을 수 있는 students라는 이름의 동적 배열

numbers.push(3);
numbers.push(10);
numbers.push(15);
numbers.push(1);
// numbers 배열은 [3, 10, 15, 1]이 되었다.

Hello.push("I LOVE YOU");

students.push(James); // 위에서 생성한 구조체 James를 배열에 추가했다.
students.push(student("Emma", 145)); // 이렇게 student 구조체를 생성함과 동시에 배열에 추가할 수도 있다.

함수

함수 선언과 호출

솔리디티에서 함수 선언은 아래와 같은 방법으로 한다.

function 함수의 이름(자료형 _인자명, 자료형 _인자명, ... ) {

}

함수 인자명 앞에 언더바를 넣는 건 전역 변수와 구분하기 위한 관례일 뿐 필수적인 것은 아니다.

  • 예시
function addIntegers(uint _a, uint _b) {
    uint result = _a + _b;
}
// addIntegers라는 함수를 선언했다. 이 함수는 두 개의 정수 a,b를 인자로 전달받는다.

addIntegers(3, 5); // 위 함수를 이렇게 호출할 수 있다.

반환값

함수에서 어떤 값을 반환받으려면 함수를 아래와 같이 선언한다.

function 함수의 이름(자료형 _인자명, ...) returns (자료형) {
    return 변수명;
}

함수 제어자

솔리디티에는 함수 제어자가 있다. 함수 제어자를 사용해 함수를 선언할 때는 아래와 같은 방법을 사용한다.

function 함수의 이름(자로형 _인자명, ...) 함수 제어자 {

}

레슨 1에서 배우는 함수 제어자에는 두 가지 종류가 있다.

  • view
    view 함수는 블록체인에서 데이터를 읽기만 하고 수정하지 못한다.
    gas를 사용하지 않는다.
  • pure
    pure 함수는 블록체인에서 데이터를 읽지도, 수정하지도 못한다.

접근 제어자

아래 방법으로 접근 제어자를 사용해 함수를 선언할 수 있다. 따로 접근 제어자를 설정하지 않을 경우에, 함수는 기본적으로 public으로 선언된다.

function 함수의 이름(자로형 _인자명, ...) 접근 제어자 {

}

레슨 1에서 배우는 접근 제어자에는 두 가지 종류가 있다.

  • public
    누구나 (어느 컨트랙트라도) public 함수를 호출하고 코드를 실행할 수 있다.
  • private
    컨트랙트 내의 다른 함수들만이 private 함수를 호출할 수 있다.

keccak256

이더리움은 keccak256을 내장 해시 함수로 가지고 있다.
keccak256 함수는 전달받은 문자열을 랜덤 256비트 16진수로 매핑한다. 스트링에 작은 변화만 있어도 해시 값은 크게 달라진다.

  • 예시
keccak256("aaaab");
//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5

이벤트

(무슨 말인지 잘 모르겠네요. 향후 더 공부해서 추가할 예정입니다.)

이 내용은 정보를 공유하기 위함이 아닌 저의 개인적인 공부 기록을 남기기 위함입니다. 따라서 틀린 정보가 있을 수 있으니 유의해서 봐주시면 감사하겠습니다.

profile
ambitious person

0개의 댓글