솔리디티 사용방법

nn·2022년 1월 25일
0
post-custom-banner

솔리디티란 블록체인을 거래하기위한 스마트 컨트렉트를 작성하기위한 언어입니다.

스마트 컨트렉트란 블록체인을 이용한 디지털 자산을 거래하기위한 계약서로 이 계약서를 작성하기위해선
솔리디티라는 프로그래밍 언어를 사용합니다.

솔리디티의 특징

* 객체지향언어로 상속, 캡슐화, 다형성등이 사용가능합니다.
* 정적타입언어 즉 컴파일 언어로 변수의 타입이 중요한 언어입니다. 

솔리디티를 알기위해선 이더리움을 먼저 알아야합니다.
이더리움은 블록체인 플랫폼중 하나로 이더라는 고유한 암호화폐를 가지고있습니다.

이 이더라는 화폐를 거래하기 위해선 위에서 말한 스마트 컨트렉트 즉 스마트 계약이 필요합니다.
이 스마트 계약을 통해 디지털 자산을 거래할 수 있고, 이 계약은 솔리디티라는 프로그래밍 언어로 개발해 사용할 수 있습니다.

EVM

EVM은 풀어서 설명하면 이더리움 가상머신입니다.
솔리디티 계약은 EVM에서 실행되며 완벽하게 격리되어 현재 실행하는 계약외의 다른 항목은 엑세스할수 없습니다.

솔리디티 언어의 기본 사항

pragma 지시문

pragma는 쉽게말해 무슨 버전의 솔리디티를 사용할 것인지를 지시하는 지시자입니다. 사용방법은 다음과 같습니다.

pragma solidity ^0.7.0;

변수

솔리디티는 컴파일 언어기때문에 변수의 타입이 중요합니다.

	pragma solidity >0.7.0 <0.8.0;
	contract Marketplace {
    	uint price; // State variable

위 코드는 0에서 2256-1까지 범위에서 양수까지만을 저장하는 unit타입을 사용하여 price라는 변수를 정의하는 코드입니다.

또한 파라메터의 식별자를 사용하여 접근 권한을 구별합니다.

  • public (공개) : 외부에서 함수에 직접 접근할 수 있음

  • internal (내부) : 현재의 계약 및 이 계약을 상속한 계약에서만 사용할 수 있고 외부에서 접근할 수 없음

  • private (비공개) : 이걸 선언한 계약에서만 사용할 수 있음. 파생계약등에 사용불가.

  • external (외부) : 외부에서 접근할 수 있지만 내부에서는 접근할 수 없음.

  • constant(읽기 전용) : 블록체인 상태를 수정할 수 없음. 상태변수를 읽고 반환은 할 수 있지만 변수 수정, 이벤트 호출등 불가

  • view(뷰) : constant 함수의 별칭임

  • pure : pure 함수는 읽고 쓰지 못함, 상태변수에 접근이 불가능함. 즉 함수가 현재 상태와 거래변수에 접근을 못하게 하려면 이 식별자를 사용

  • payable(지불) : payable 키워드가 붙으면 호출자로부터 이더를 받을 수 있음, 송금자가 이더를 제공하지 않는 경우 호출은 실패함

Function

실행가능한 코드 단위들입니다.

	pragma solidity >0.7.0 <0.8.0;
	contract Marketplace {
		function buy(uint price) public returns (uint) {
			// ...
		}
	}

위 코드는 솔리디티의 버전을 지정한 후,
buy라는 퍼블릭 함수에 price라는 파라메터를 정의하고 정수 타입을 반환하는 함수를 정의한 코드입니다.

이로서 위 코드는 외부 혹은 내부에서 호출하여 사용할 수 있습니다.

한정자

한정자를 사용하면 함수가 특정 조건에서만 동작 할 수 있도록 정의할 수 있습니다.

modifier 키워드를 사용하여 한정자를 정의할 수 있습니다.
이로서 listitem함수는 판매자로 지정된 사용자인 경우에만 실행됩니다.
또한 위에서 설명한 view를 사용함으로서 상태수정은 허용하지않습니다.

	 pragma solidity >0.7.0 <0.8.0;

	contract Marketplace {
		address public seller;

		modifier onlySeller() {
			require(
				msg.sender == seller,
				"Only seller can put an item up for sale."
			);
			_;
		}

		function listItem() public view onlySeller {
			// ...
		}
	}

이벤트

이벤트는 계약내에서 수행되는 작업입니다.
함수와 마찬가지로 이벤트가 호출 시 파라메터를 지정할 수 있습니다.
이벤트는 emit키워드를 사용해야합니다.

	contract Marketplace {
		event PurchasedItem(address buyer, uint price);

		function buy() public {
			// ...
			emit PurchasedItem(msg.sender, msg.value);
		}
	}

이벤트는 블록체인 네트워크에 특정한 값을 기록하는 행위로
위 함수는 buy() 함수가 실행되면 PurchasedItem 이벤트가 발생해 구매한 아이템이 블록체인 네트워크 상에 로그로 남게됩니다.

이 로그는 계약의 주소와 연결되고 계속 유지가되어 접근 수정이 불가능합니다.
또한 이 블록안에 저장된 이벤트 데이터는 언제든지 들고 와서 사용할 수 있습니다.

데이터 타입

솔리디티에 사용되는 데이터 타입은 위에서 사용한 unit외에 여러가지가 있습니다.

  1. 정수형
    8비트에서 256비트 범위의 정수를 저장할 수 있으며 디폴트는 256비트입니다.
    unit : 양수만을 포함합니다.
    int : 음수와 양수모두를 포합합니다.

    예를들어 0에서 255사이의 값은 unit8, 범위가 -128~127까지인 값은 int8을 사용해야합니다.

    정수형은 비교연산, 비트연산, 산술연산, 지수, 부정, 후위증가(number++), 전위증가(++number)가 가능합니다.

  2. 논리형 boolean
    true 또는 false 값을 가지고 있습니다.

  3. 문자열
    string과 byte 배열이있습니다.
    bytes배열은 여러개의 byte를 담아 동적배열로 사용해 string과 유사하게 작동합니다.
    bytes는 문자열 하나하나를 조작할 수 있으나 string은 불가능합니다.

  4. 주소 address
    사용자 계정을 나타내는 20바이트의 값 형식입니다.
    기본주소형식과, 외부소유계정주소등을 담을 수 있는 지급주소형식이있습니다.

	address payable public seller; // account for the seller
	address payable public buyer; // account for the user

	function transfer(address buyer, uint price) {
		buyer.transfer(price); // the transfer member transfers the price of the item
	}

5. 열겨형 enum 사용자 정의 형식을 만들어 기본타입외의 원하는 형식을 지정해 사용할 수 있습니다.

참조타입

call by value 라고 값 참조와
call by references라는 주소참조가 있듯이 솔리디티도 주소를 참조할 수 있습니다.

  1. 참조방법

    • memory
      함수 인수가 저장되는 위치.
      수명이 외부 함수 호출로 제한됩니다.
    • storage
      상태 변수가 저장되는 위치.
      수명이 계약 수명으로 제한됩니다.
    • calldata
      함수 인수가 저장되는 위치.
      외부 함수의 매개 변수에 필요하지만 다른 변수에도 사용할 수 있습니다.
      수명이 외부 함수 호출로 제한됩니다.

    참조 형식은 항상 독립적인 데이터 복사본을 만듭니다.

		contract C {

			uint[] x;
			// the data location of values is memory
			function buy(uint[] memory values) public {
				x = value; // copies array to storage
				uint[] storage y = x; //data location of y is storage
				g(x); // calls g, handing over reference to x
				h(x); // calls h, and creates a temporary copy in memory
			}

			function g(uint[] storage) internal pure {}
			function h(uint[] memory) public pure {}
		}
  1. 구조체 struct
    구조체는 사용자가 실제 개체를 나타내기 위해 정의할 수 있는 사용자 지정 형식입니다.
    구조체는 일반적으로 스키마로 사용되거나 레코드를 나타내는 데 사용됩니다.
	struct Items_Schema {
		uint256 _id;
		uint256 _price;
		string _name;
		string _description;
	}
  1. 배열
    배열의 크기는 동적과 정적이 모두 가능합니다.
    배열의 요소는 매핑 또는 구초체를 포함한 모든 형식이 가능합니다.

  2. 매핑
    키와 값으로 이루어진 쌍입니다.

	contract Items {
		uint256 item_id = 0;

		mapping(uint256 => Items_Schema) public items;

		struct Items_Schema {
			uint256 _id:
			uint256 _price:
			string _name;
		}

		function listItem(uint 256 memory _price, string memory _name) public {
			item_id += 1;
			item[vehicle_id] = Items_Schema(item_id, _price, _name);
		}
	}

위코드는 키가 부호가 없는 정수형식이고 Items_Schema 라는 struct가 값임을 알 수 있습니다.

profile
내가 될 거라고 했잖아
post-custom-banner

0개의 댓글