[솔리디티] 크립토좀비 소개와 코스 1: 좀비 공장 만들기

가영·2021년 2월 26일
1

솔리디티

목록 보기
1/7
post-thumbnail

크립토좀비란?

크립토좀비는 이더리움 위에서 돌아가는 게임을 만드는 방법을 알려주는 무료, 오픈 소스인 인터랙티브 코딩 스쿨입니다. ...

여기에 들어가면 수준별로 코스 3가지가 있는데 초보자는 solidity Path의 좀비 게임 만들기 예제들로 솔리디티를 공부해볼 수 있다! 번역도 너무 잘 돼있다.

레슨 1에서는 간단한 예제들을 통해 솔리디티의 문법을 훑어볼 수 있었다. 까먹을만한 내용들을 다시 정리해보았다.


Solidity

솔리디티(Solidity)는 계약 지향 프로그래밍 언어로 다양한 블록체인 플랫폼의 Smart Contract 작성 및 구현에 사용된다.

정적타입의 프로그래밍 언어로, EVM(Ethereum Virtual Machine)상에서 작동하는 스마트계약을 개발하기 위해 설계됐다. 솔리디티는 EVM에서 작동가능하도록 바이트 코드로 컴파일해서 실행한다.

Contract

솔리디티 코드는 컨트랙트 안에 싸여있다. 컨트랙트는 이더리움 애플리케이션의 기본적인 구성요소로, 모든 변수와 함수는 어느 한 컨트랙트에 속하게 된다.

contract Helloworld {

}

Version Pragma

모든 솔리디티 소스코드는 "version pragma"로 시작해야하는데, 이는 해당 코드가 이용해야 하는 솔리디티 버전을 선언하는 것이다.

새로운 프로젝트를 시작할 때마다 이 형태를 제일 먼저 작성하면 된다.

pragma solidity ^0.4.19;
contract HelloWorld {

}

State Variables & Integers

상태변수

상태변수는 contract 저장공간에 영구적으로 저장된다. 이 말은, 상태변수는 이더리움 블록체인에 기록된다는 뜻이기도 하다. DB에 저장하는 거라고 생각하면 된다. 예시를 보자.

contract Example {
	//This will be stored permanently in the blockchain
	unit myUnsignedInteger = 100;
}

예시의 myUnsignedInteger는 블록체인에 영구적으로 저장되게 된다.

myUnsignedInteger의 자료형은 uint로 부호가 없는 정수를 다룰 때 사용한다.

Note: In solidity, unit is actually an alias for unit256, a 256-bit unsigned integer. You can declare uints with less bits (8, 16, 32 ....) But in gegeral you want to simply use uint except in specific cases, which we'll tack about in later lessons.


구조체

솔리디티는 좀 더 복잡한 자료형을 필요할 때 구조체를 사용할 수 있게 한다.

struct Person {
	uint age;
	string name;
}

배열

솔리디티에서는 배열이

  1. 정적 배열
  2. 동적 배열

이렇게 두가지로 나뉜다. 정적배열은 고정 길이의 배열이고, 동적 배열은 고정 크기가 없으며 계속 크기가 커질 수 있다.

uint[2] fixedArray;
string[5] stringArray;

uint[] dynamicArray;

이 때, public으로 배열을 선언할 경우, 솔리디티는 자동적으로 getter 메서드를 생성한다. 그러면 다른 컨트랙트들이 이 배열을 읽을 수 있게 된다. (쓰기는 불가)

이는 컨트랙트에 공개 데이터를 저장할 때 유용한 패턴이라고 한다! 🥰

Private / Public 함수

솔리디티에서 함수는 기본적으로 public으로 선언된다. 즉, 누구나 우리가 만든 컨트랙트의 함수를 호출할 수 있다는 의미다.

이는 항상 바람직한 구조는 아닐 뿐더러, 우리의 컨트랙트가 공격에 취약하게 만들 수도 있다. 그러니 우리는 기본적으로 함수를 private으로 선언하고, 공개할 함수만 public으로 선언하는 것이 좋다.

두 접근제어자는 함수명 다음에 적는다. 함수 파라미터의 이름과 마찬가지로 private 함수의 이름은 언더바(_)로 시작하는 것이 관례다.

ex)

uint[] numbers;

function _addToArray(uint _number) private {
	numbers.push(_number);
}

함수 제어자

view

다음은 sayHello()라는 함수다.

string greeting = "What's up dog";

function sayHello() public returns (string) {
	returns greeting;
}

이 함수는 솔리디티에서 상태를 변화시키지 않는다. 즉, 어떤 값을 변경하거나 새로운 무언가를 쓰지 않는다.

이런 경우에는 함수를 view 함수로 선언해야한다. 이렇게.

function sayHello() public view returns (string) {
	...
}

pure

솔리디티는 pure함수도 가지고 있는데, 이는 함수가 앱에서 어떤 데이터도 접근하지 않는 것을 의미한다. 다음 예시를 보자.

function _multiply(uint a, uint b) private pure returns (uint) {
	return a * b;
}

tip: 함수를 pureview로 표시하는 것이 번거로울 수 있지만 솔리디티 컴파일러가 어떤 제어자를 써야하는지 에러메시지를 통해 잘 알려준다.

이벤트

컨트랙트는 이벤트를 통해 클라이언트 단에게 액션이 발생했음을 전달한다.

event IntegersAdded(uint s, uint y, uint result);

function add(uint _x, uint _y) public {
	uint result = _x + _y;
	IntegersAdded(_x, _y, result);
	return result;
}

그러면 앱의 클라이언트 사이드에서는 해당 이벤트를 기다리고 있을 것이다. 자바스크립트로 이를 구현하면

YourContract.IntegersAdded((error, result) => {
  // 결과와 관련된 로직~
})

이렇게 된다.

레슨 1에서 새로운 내용은 여기까지~ 레슨 2도 작성해야지! 🙂

0개의 댓글