간단 블록체인 정리2

Blackpepper·2024년 8월 15일

솔리디티 : 이더리움 블록체인에서 스마트 계약을 작성하기 위한 언어.

객체지향을 지원하고, 연산에 가스가 필요하기 때문에 최대한 효율적인 코드를 작성해 가스 비용을 절감해야 한다. (계약서 내에서 사용자 id에 따라 필요한 기록만 뽑으려고 for문을 돌렸더니 터짐)

솔리디티에는 데이터를 저장하는 3가지 방식이 존재하는데,

스토리지(블록체인에 저장되는 영구적 저장공간), 메모리와 스택(함수 호출 시 사용되는 일시적인 저장공간, 배열이나 값 저장)이다.

함수 바깥에 존재하는 모든 변수는 스토리지에 저장되며, 스토리지에 존재하는 값을 조회하는 것은 가스가 들지 않고, 스토리지에 존재하는 값을 바꾸면 트랜젝션이 생성되면서 가스가 소모된다.

계약서 내용 예시 :

// SPDX-License-Identifier: MIT

// 코드에 사용한 솔리디티 버전이 0.7.0부터 0.9.0 사이라는 뜻
pragma solidity >=0.7.0 <0.9.0;
// ABIEndcoderV2를 사용해 더 복잡한 구조체를 컴파일 할 수 있음
pragma experimental ABIEncoderV2;

contract Tournament {

	struct match_data {
	    uint left_player_id;
	    uint right_player_id;
	    uint left_player_score;
	    uint right_player_score;
	}
	
	struct time_data {
	    uint year;
	    uint month;
	    uint day;
	    uint hour;
	    uint minute;
	    uint second;
	}
	
	struct tournament {
	    string game_id;
	    bool reverse_mode;
	    uint[4] players_id;
	    time_data start_date;
	
	    match_data m1;
	    match_data m2;
	    match_data f;
	}
	
	tournament[] tournament_array;
	
	function addTournament(
	    string memory id,
	    bool mode,
	    uint[4] memory p_name,
	    time_data memory t_data,
	    match_data memory _m1,
	    match_data memory _m2,
	    match_data memory _f
	)
	    public
	{
	    tournament memory newTournament = tournament(id, mode, p_name, t_data, _m1, _m2, _f);
	    tournament_array.push(newTournament);
	}
	
	function getTournament() public view returns (tournament[] memory) {
	    return tournament_array;
	}

}
  • 토너먼트 구조체를 선언해 배열에 저장
  • uint의 범위는  0 ~ 2^256 - 1다.
  • 함수에 수식어 view나 pure가 붙으면 스토리지에 있는 변수를 수정하지 않겠다는 뜻이기 때문에 호출해도 가스가 발생하지 않는다.(하지만 트랜젝션을 통해 함수를 호출하면 가스를 소모한다.)

사용한 블록체인 모듈 :

ganache - 이더리움 블록체인의 로컬 테스트넷 환경을 제공하는 툴.

실제 이더리움 네트워크에 배포하기 전 스마트 계약과 Dapp을 테스트하고 디버깅할 수 있다. (메인넷 X, 테스트넷 X)

web3.py - 파이썬에서 이더리움 블록체인과 상호 작용하기 위해 사용되는 라이브러리. 스마트 계약 배포, 블록체인 데이터 조회, 트랜잭션 생성 등 다양한 기능을 제공한다.

solxc - 파이썬용 계약서 컴파일 모듈

계약서 배포에 필요한 요소들을 산출한다.(abi, bytecode)

profile
까만 연미복의 남자

0개의 댓글