1.1 간단한 스마트 콘트랙트

간단한 예제로부터 스마트 콘트랙트를 살펴보자. 한번에 모든 것을 이해할 수는 없지만, 일단 살펴보는 것이 중요하다.

storage

programa solidity  ^ 0.4.0;

contract SimpleStorage{
    uint storedData;

    function set (uint x){
       storedData = x;
    }

    function get() constant returns (uint retVal){
        return storedData;
    }
}

첫 번째 라인은 소스코드가 솔리디티 0.4.0버전으로 작성되었다는 것을 의미하며, 이보다 후속 버전으로 컴파일 됨으로 인해 발생하는 오류를 방지한다. 이 줄로 인하여 새로운 컴파일러 버전에 의해서 코드가 다른 방식으로 동작하는 것을 막을 수 있다.

솔리디티의 측면에서 스마트 콘트렉트란 일련의 코드(함수)와 데이터(상태)가 이더리움 블록체인 상의 특정한 주소에 존재하는것이다. uint storedData; 라인은 storedData변수라는 이름의 상태가 uint 타잎(256비트 양수)으로 저장될 수 있음을 선언한다. 이것을 단순히 바라보면 데이터베이스의 한 칸으로써, 데이터베이스를 관리하는 함수에 의해 조회되거나 수정될 수 있는 것으로 파악할 수 있다. 이더륨의 경우 이것은 항상 소유 계약이다. 이 코드의 경우 get함수와 set함수를 통해 변수의 값을 조회하거나 수정할 수 있다.

상태 변수에 접근하기 위해 다른 언어에서 일반적으로 쓰이는 this키워드는 필요하지 않다.

이 콘트렉트 코드는 아직은 누가 발행 했는지에 관계없이 누구나 접근할 수 있고, 누구나 수정할 수 있다. 따라서 누구든지 set함수를 실행하여 값을 수정하여 우리가 설정한 값을 덮어쓸 수 있고, 이 변경내역은 이더리움의 블록체인 위에 영원히 기록된다. 후에 이 코드에 대한 접근 제한을 걸어 오직 코드를 작성한 사람만이 숫자를 변경할 수 있도록 만들것이다.

화폐발행 예제

아래의 콘트렉트는 가장 단순한 형태의 암호화화폐의 구현체이다. 코인은 무의 상태로부터 발행 될 수 있으나, 오직 콘트렉트를 생성한 사람만이 만들어 낼 수 잇다. (it is trival to implements a different issuence scheme). 더해서 누구든지 이더리움 주소만 가지고 있다면 비밀번호나 아이디 없이 코인을 전송할 수 있다.

pragma solidity ^0.4.0;

contract Coin{

  // public키워드는 이 변수들이 외부에서 읽을 수 있도록 만든다.
  address public minter;
  mapping (address => uint ) public balances;

  // 이벤트는 라이트 클라이언트가 값 변화에 효율적으로 반응할 수 있도록 만들어준다.
  event Sent (address from, address to, uint amount);

  // 이 줄은 코드의 생성자(constructor)로써 이 코드가 오직 생성된 후에야 실행될 수 있도록 한다.
  function Coin() {
    minter = msg.sender;
  }

  function mint (address reciever, uint amount){
    if (balances[msg.sender] < amount) return;
    balances[msg.sender] -= amount;
    balances[receiver] += amount;
    Sent(msg.sender, reciever, amount);
  }
}

이 콘트렉트는 새로운 개념들을 소개하고 있다. 하나하나씩 살펴보자.

address public minter; 줄은 주소 타잎의 누구든지 접속가능한 변수를 선언하고 있다. address타잎은 160비트의 값이며 산술 연산을 허용하지 않는다. 이 타잎의 변수는 콘트렉트 주소나 외부 사람이 소유하고 있는 이더리움 주소 를 저장하기에 적합하다. 예약어 public키워드는 자동으로 상태 변수의 현재 값에 대한 접근을 허용하는 함수를 생성한다. 이 키워드가 없다면, 다른 콘트렉트가 이 변수에 접근할 수 없고 오직 코드를 생성한 사람만이 값을 쓸 수 있다. public키워드가 만들어내는 함수는 다음과 같다.

function minter() returns (address) { return minter; }

물론, 위의 함수를 바로 넣는다고 정확히 원하는 데로 동작하지는 않을 것이다. 왜냐하면 우리는 함수와 상태 변수를 정확하게 같은 이름으로 선언해야 되기 때문이다. 그렇지만 이 코드로부터 아이디어는 얻을 수 있다. (컴파일러가 결과를 알려줄 것이다.)

다음줄인 mapping (address => uint ) public balances; 또한 공개적인 상태 변수를 만들어 내지만, 조금 더 복잡한 타잎이다. 이 타잎은 주소와 양의 정수를 매핑한다. 여기서 매핑은 마치 존재하는 모든 키 집합이 값이 0인 바이트 값에 짝지어진 해시테이블로 여겨질 수 있다. 이 비유를 너무 확장하여 모든 매핑된 키 집합을 얻을 수 있다거나 모든 값 집합을 얻을 수 있다고 여기면 안된다. 따라서 매핑에 포함된 것을 기억해야 하고 (혹은 더 낫게는 조금 더 확장된 형태의 리스트로) 전체에 대한 조회가 필요 없는 이와 같은 예제에서만 사용해야 한다는 것이다. 여기서 public예약어가 만들어내는 함수는 조금 더 복잡하며, 개략적으로 다음과 같다.

function balances(address _account ) returns (uint balance) {
    return balances[_account]
}

보다시피, 이 함수는 하나의 계정의 잔액을 조회하는데 매우 유용하다.

event Sent (address from, address to, uint amount);라인은 소위 “이벤트”라 불리며, send함수의 마지막 부분에서 호출된다. 유저 인터페이스 (서버쪽 어플리케이션을 포함한)는 이러한 이벤트를 큰 비용 없이 블록체인 위에서 실행한다. 일단 이것이 실행되면 리스너는 from, to, amount 매개변수를 전달받고 이것은 트랜젝션(transactions)를 손쉽게 추적할 수 있도록 만든다. 이러한 이벤트를 대기하기 위해서 아래와 같은 자바스크립트 코드가 필요하다.

Coin.Sent().watch({}, ‘’, function(error, result){
  if(!error){
    console.log(“Coin transfer: ” + result.args.amount + 
      “coin were sent from ”+ result.args.from + 
      “ to ” + result.args.to + “.”);
    console.log(“Balances now : \n” + 
      “Sender : ” + Coin.balances.call(result.args.from) + 
      “Reciever: ” + Coin.balance.call(result.args.to));
  }
});

여기서 유저 인터페이스에서 balance가 어떻게 호출되는지 주목할 필요가 있다.

특별한 함수인 Coin은 콘트렉트가 생성되는 과정에서 만들어지는 생성자로써 일단 콘트렉트가 생성되면 실행되지 않는다. 이 코드는 이 콘트렉트를 만드는 사람의 주소를 영원히 저장한다. msg (tx와 block과 더불어)는 매직 전역 변수로써 블록체인의 일부 특성에 접근할 수 있다. msg.sender는 항상 이 함수의 호출이 외부에 어떤 주소로부터 시작되었는지를 알려준다.

마지막으로, 결국 유저 혹은 콘트렉트 같은 것으로부터 호출되는 함수들은 mint와 send다. 만약 mint함수가 이 콘트렉트를 만든 사람만 호출 할 수 있다면 아무일도 일어나지 않을 것이다. 반면에 send함수는 (이 코인을 가지고 있다면) 누구나 호출해서 누구에게나 보낼 수 있다. 명심할 것은 만약 이 콘트렉트를 통해서 특정 주소로 코인을 보냈을 경우 블록체인 탐색기 상에는 아무런 변화가 없을 것이라는 점이다. 왜냐하면 코인을 전송하고 잔액이 변동되는 것은 이 특정한 코인 콘트렉트 상의 데이터가 바뀌는 것일 뿐이다. 그렇지만 이벤트를 이용하면 상대적으로 쉽게 새롭게 만들어낸 코인의 “블록체인 탐색기”를 이용해서 트랜젝션내역과 잔액을 추적할 수 있을 것이다.

results matching ""

    No results matching ""