스마트 계약(Smart Contract)

비트코인 트랜잭션 vs 스마트 계약 트랜잭션

비트코인은 암호 화폐의 전송만을 위해서 존재하지만,

Smart Contract-like는 암호 화폐 이외에 어떤 형태로도 이용 가능.

 

스마트 계약을 Smart하게 만드는 SCA(스마트 계약 어카운트) 내재 요소들

  • 이름, 주소
  • 암호화폐 잔액(암호화폐 송/수신 기능)
  • 데이터와 함수
  • 메시지 수신과 함수 호출 기능
  • 함수 실행을 위한 연산 능력

 

스마트 계약 설계를 위한 준비물


※ 스마트 계약 설계 원칙

설계 원칙 Ⅰ.

코딩하기 전에 철저히 설계를 하고, 배포하기 전에 철저히 테스트를 거친다.

트랜잭션은 한번 내뱉은 말과 같다. 절대 주워 담을 수 없기 때문이다.

 

설계 원칙 Ⅱ.

사용 범위(사용자, 용도, 경우)를 정의한다.

여기서 사용자(User)란 입력값을 발생시키고, System으로부터 출력값을 돌려받는 주체이다.

 

설계 원칙 Ⅲ.

블록체인 기반 컴포넌트의 속성인 데이터, 접속자, 접속자 역할, 규칙, 트랜잭션 등을 정의한다.

접속자는 통상적으로 DApp을 의미한다.

트랜잭션은 복수(Plural)가 될 수 있다.

 

설계 원칙 Ⅳ.

계약명, 데이터, 규칙, 함수를 정의하는 계약 다이어그램을 작성한다.

일반적으로 C++, Java처럼 우리가 알던 클래스(Class) 구조에 규칙이 생겼다고 보면 된다.

허나, 규칙 자체가 필수 요소는 아니다.


Solidity 예제: Counter.sol

세계 인구, 재고량, 주식 보유량 등을 계산할 때 쓸 수 있는 가장 기본적인 형태의 Counter 계약.

pragma solidity ^0.8.11;

contract Counter {
    uint value;
    
    function init (uint x) public {
    	value = x;
    }
    
    function get() view public returns (uint) {
    	return value;
    }
    
    function increment (uint n) public {
    	value += n;
        //return (optional)
    }
    
    function decrement (uint n) public {
    	value -= n;
    }
}

1. 보통의 범용 언어들이 64비트인 데에 반해 솔리디티는 256비트라는 훨씬 큰 범위.

1-1. int와 int256은 같은 별칭.

2. 생성자(Constructor) 함수를 정의하지 않았을 시 기본 생성자가 대신 작동.

3. public은 권한수정자로써 블록체인 상의 어떠한 앱과 어카운트도 함수를 호출할 수 있다는 의미.

4. returns는 명시적으로 반환값에 대해 정의하겠다는 의미.

5. 함수를 호출한다는 건 분산 장부에 트랜잭션으로 기록한다는 것.

5-1. 하지만 view 함수는 읽기 전용(read-only), 즉 변수를 건들지 않기에 트랜잭션으로 기록되지 않음.


Solidity 예제: Accounts.sol

pragma solidity ^0.8.11;

contract Accounts {
    address public whoDeposited;
    uint public depositAmount;
    uint public actBalance;
    
    function deposit() public payable {
    	whoDeposited = msg.sender;
        depositAmount = msg.value;
        actBalance = address(this).balance;
    }
}

1. payable은 금액 전송을 하겠다는 의미.

2. actBalance는 어카운트 잔액을 IDE 상에서 가시적으로 보기 위한 테스트 변수.

'Web 3.0 > Ethereum & Solidity' 카테고리의 다른 글

블록체인 및 이더리움 기초 개념  (0) 2022.01.16