본문 바로가기
프로그래밍/solidity

크립토좀비로 솔리디티 기초 알기 - 챕터1 / sol 0.8.15버전으로 개선한 코드

by 한코코 2022. 5. 31.

컨트랙트(contract) 생성

이더리움 어플리케이션의 기본적인 구성요소로 솔리디티는 이걸 위해 만들어짐모든 변수와 함수는 반드시 어느 한 컨트랙트에 속해있음.

컨트랙트 내에서 상태변수를 선언할 수 있고, 이는 컨트랙트 저장소에 영구적으로 저장된다.

contract HelloWorld {
  pragma solidity ^0.8.15;
}

 

 

 

상태 변수

타입스크립트처럼 변수의 상태를 작성해줘야한다.

상태변수는 컨트랙트 저장소에 영구적으로 저장됨 = 이더리움 블록체인에 기록됨

uint thisIsNumber = 100;
uint dnaModulus = 10 ** thisIsNumber;
string thisIsStr = 'hello';

 

 

 

새 구조체(struct) 생성

복잡한 자료형 객체를 생성한다고 생각하면 된다.

Person 자료형을 사용할때는 반드시 uint형 age랑 string형 name이 들어가아한다.

struct Person{
    uint age;
    string name;
}

 

 

 

새 구조체 배열 생성

구조체를 사용해서 구조체 배열을 생성할 수 있고, 구조체 배열은 정적배열과 동적배열 두가지로 나뉜다.

배열에 몇개를 담을것인지 숫자를 고정하는 정적배열과 그렇지 않은 동적배열

uint[2] fixedArray; // 정적 배열
uint[] dynamicArray; // 동적 배열

// Person구조체를 사용해서 동적배열을 만들건데, 
// 함수 접근 제어자는 public을 쓸거고
// 이름은 people로 할게
Person[] public people;

Person sato = Person(172,'Sato') // 새 Person 구조체 sato를 선언
people.push(sato)

위와 같이 새 구조체를 생성해서 배열에 넣을때 코드 한 줄로 표현이 가능하다.

people.push(Person(16,'Vitalik'))

 

 

 

함수 생성하기

함수에 들어가는 인자들도 속성값을 명시해주는걸 잊지말자.

솔리디티에서는 함수와 인자값을 표현할때 암묵적으로 앞에 _를 붙인다.

function _eatHamburgers(string _name, uint _amount) {}
_eatHamburgers("vitalik", 100);

 

 

 

함수 접근 제어자 private / public

남들과 함께 사용하도록 공개모드로 놓는게 public.

컨트랙트 안에 있는 함수들만 해당 함수를 사용하도록 비밀모드로 놓는게 private.

함수 다음에 함수 접근 제어자를 작성한다. 

uint[] numbers;

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

 

 

 

반환값

반환값을 사용할 경우도 마찬가지로 반환값 속성을 작성해줘야한다.

다음은 반환값을 string으로 받는 public 함수다.

string greeting = "What's up dog";

function _sayHello() public returns (string) {
  return greeting;
}

 

 

 

함수제어자

- view : 데이터를 사용하긴하지만 변경하지 않음

- pure : 데이터에 접근조차 하지 않음

- 아무것도 없음 : 데이터를 사용도하고 변경도 함.

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

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

 

 

 

keccak256

SHA3의 한 버전인 keccak256은 string을 256비트 16진수로 매핑한다.

keccak256("aaaab")
//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5

// >> pragma solidity ^0.8.15;
keccak256(abi.encodePacked(_species))

 

 

 

형변환

자료형을 변환할때 사용한다.

uint8 a = 5;
uint b = 6;

// a * b가 uint8이 아닌 uint를 반환하기 때문에 에러 메시지가 난다:
uint8 c = a * b; 

// b를 uint8으로 형 변환해서 코드가 제대로 작동하도록 해야 한다:
uint8 c = a * uint8(b);

 

 

 

이벤트

컨트랙트가 블록체인 상에서 앱의 사용자 단에서 액션이 발생했을때 알려준다.

 

// 이벤트를 선언한다
event IntegersAdded(uint x, uint y, uint result);

function add(uint _x, uint _y) public {
  uint result = _x + _y;
  // 이벤트를 실행하여 앱에게 add 함수가 실행되었음을 알린다:
  IntegersAdded(_x, _y, result);
  return result;
}

댓글