[Blockchain] 스마트 컨트랙트 (Solidity)

공효은·2022년 2월 22일
0
post-thumbnail

오늘의 목표

  • 스마트 컨트랙트가 무엇인지 살펴보기!
  • 스마트 컨트랙트 간단한 예시 살펴보기

스마트컨트랙트

스마트 컨트랙트란 어떤 조건을 만족하면 어떤 행동을 하라는 코드를 거래에 추가한 것이다.

스마트 컨트랙트를 블록체인에 올리면 어떤일이 벌어 질까?

  1. 블록체인에 기록되면 그 내용을 누구도 위조할 수 없기 때문에 이 계약의 진위성과 실행을 보장할 수 있다.

  2. 블록체인 내부에 기록된 코드에 의해 특정 조건을 만족할 경우, 정해진 행동이 자동으로 실행된다.

실제 문서 상으로 이루어지는 계약은 사람이 직접 실행하고, 법에의해 강제화 되지만 스마트 컨트랙트는 블록체인이 유효성을 보증하고 컴퓨터가 자동으로 실행한다.

비트코인 블록체인에는 거래안에 코드를 담는 것이 매우 제한 적이지만, 이더리움은 기능에 제한이 없는 자체 프로그래밍 언어를 개발했다. 이 프로그래밍 언어로 스마트 컨트랙트를 써서 거래에 포함시키면, 블록체인 내부에 영구히 저정된다.

👍Good example👍

A가 B와 중고거래를 한다고 한다. 스마트 컨트랙트가 구현되는 방식은 다음과 같다.

  1. A가 받는 주소 없이 1이더를 전송한다. 받는 주소가 없는 대신 거래안에 '스마트 컨트랙트를 만들어라', '스마트 컨트랙트가 발동되는 조건은 A가 약속한 물건을 받았다고 인증했을 때 조건이 만족되면 B에게 1이더를 보낸다.'라는 코드를 작성해서 전송한다. 이를 컨트랙트 생성이라고 한다.

  2. 블록체인에 거래가 기록되면, 모든 참여자들이 안에 담긴 코드를 실행한다. 이더리움 블록체인 상에서 코드에 의해 운영되는 컨트랙트 계정(contarct account) 생긴다. 1이더가 컨트랙트 계정에 보관된다.

이더리움 내의 계정은 사용자가 통제하는 외부 소유 계정(Externally owned account)과 내부 코드에 의해서 통제되는 컨트랙트 계정(contract account) 이 있다.

  1. B는 1 이더가 담긴 컨트랙트 계정과 담겨있는 코드의 내용('조건이 만족되면 B에게 돈을준다')을 보고 물건을 택배로 보내준다.

  2. 물건을 택배로 받은 A는 컨트랙트 계정을 받는 사람으로 해서 소량의 이더(수수료)를 보낸다. 그 거래 안에는 'x조건이 만족 되었음' 이라는 코드를 써서 보낸다.

  3. 이 거래가 블록체인에 기록되고 실행되면, 컨트랙트는 주어진 조건에 반응하게 되고, 정해진 대로 B에게 돈을 전송한다.

이 과정을 통해 제 3자의 개입 없이 안전한 거래를 할 수 있게 되며, 이 과정은 모두 블록체인에 기록 된다.

정리하면 스마트 컨트랙트는 제 3의 개입없이 어떠한 조건에 만족에 따라서 거래 당사자간 거래가 자동으로 이루어 지도록 한다. => ex(돈에 조건을 걸 수 있다.)

출처: https://brunch.co.kr/@bumgeunsong/47#comment

솔리디티와 Klaytn

솔리디티는 이더리움 플랫폼의 스마트 컨트랙트를 구현하기 위한 언어로, 고수준이고 정적인 컨트랙트 지향 언어이다.
솔리디티는 원래 이더리움을 위해 설계되었지만 스마트 컨트랙트 작성을 위한 일반적인 언어로도 적합하다.
따라서 클레이튼과 같은 블록체인 플랫폼에서도 사용할 수 있다.

클레이튼은 London Ethereum Virtual Machine (EVM)과 공식 호환 가능하다.
다른 EVM 버전들과 하위 호환성은 보장되지 않는다.
따라서 Istanbul 타겟 옵션과 함께 솔리디티 코드를 컴파일하는것을 권장한다.

또한 클레이튼의 스마트 컨트랙트를 개발할 때 Remix(브라우저 기반 IDE)와 Truffle(개발 프레임워크)을 활용할 수 있다.

스마트 컨트랙트 작성하기

require : 솔리디티 파일에서 필수로 포함되어야 하는 부분
optional: 항상필요한 것이 아님

L01: pragma solidity 0.5.6; // (require) 버전 pragma
L02: 
L03: import "filename"; //(optional) 다른 소스 파일을 임포트
L04:
L05: // (optional) 스마트 컨트랙트 정의
L06: contract UserStorage {
L07:	mapping(address => uint) userData; //상태 변수
L08:    
L09:    function set(uint x) public {
L10:    	userData[msg.sender] = x;
L11:    }
L12:
L13:    function get() public view returns (uint){
L14:    	return userDate[msg.sender];
L15:    }
L16:   	
L17:	function getUserData(address user) public view 	returns (uint){
L18:    	return userData[user];
L19:     }
L20:    }
  • 이중 슬래시(//) 로 시작하는 부분은 코드가 아니라 주석이다. 코드의 특정 부분에 주석을 달아 설명을 첨부하는 데에 사용된다. 컴파일러는 이러한 주석을 무시한다.

  • L01의 pragma는 최소 컴파일러 버전을 나타낸다.

  • L03의 import 는 "filename"으로부터 모든 전역 심볼을 임포트 한다.

  • L05-L20은 UserStorage라는 스마트 컨트랙트를 정의하는 부분이다.
    contract 키워드는 컨트랙트의 이름 앞에 위치하여 이 코드가 스마트 컨트랙트 임을 나타낸다. 솔리디티의 컨트랙트는 객체 지향 언어의 클래스와 유사하다. 컨트랜트는 상태변수, 함수, 함수 변경자(modifier), 이벤트, 구조체 자료형, 열거식 자료형에 대한 선언을 포함할 수 있다. 또한 컨트랙트는 다른 컨트랙트로 부터 상속 될 수도 있다.

  • L07 userData는 맵핑 자료형의 상태 변수 이다. 상태 변수는 컨트랙트 스토리지에 영구적으로 저장된다. 상태 변수 userData는 address와 uint 값을 맵핑한다. address 자료형은 20바이트 길이의 주소이다(클레이튼은 이더리움과 같이 20바이트 길이의 주소를 사용한다.)

  • L09 에서는 x를 메세지 발신자의 userData에 저장하는 퍼블릭 함수 set 을 정의한다. msg.sender 변수는 솔리디티에서 정의된 특별한 변수로 메세지(즉 current call) 발신자의 주소를 나타낸다. public키워드는 이 함수가 컨트랙트 인터페이스의 일부이며 내외부적으로(externally or internally) 호출될 수 있음을 나타낸다.

  • L13의 get함수와 L17의 getUserData 함수는 view로 선언되었다. 이는 이 함수들의 상태변수가 수정되면 안된다는 것을 의미한다. 이 함수들의 선언 부에는 return (uint)가 있다. 이는 함수가 반환하는 값의 자료형이 uint임을 의미한다.

profile
잼나게 코딩하면서 살고 싶어요 ^O^/

0개의 댓글