EOS를 통한 가상 통화 어플리케이션 구현하기 (Implementing a Hypothetical Currency Application on EOS의 번역)

in #eos7 years ago

개인적인 번역입니다. 이해를 위해 의역이 많이 섞여 오역이 있을 수 있습니다. 참고 부탁드립니다 :)

원본의 링크는 https://steemit.com/eos/@eosio/implementing-a-hypothetical-currency-application-on-eos 입니다.

EOS가 공개되기 앞서, 처음으로 어떻게 EOS의 동작원리와 eos를 통한 어플리케이션 구현 방법을 소개되서 기쁩니다.

간단한 소개

EOS는 사람과 봇(시스템)으로 구성되어 있습니다. 각각은 이메일 계정에 메일을 보내듯이 이메일을 보낼 수 있습니다.

이메일과 같이 보내는사람(송신자)는 받는사람(수신사)에게 참조(? Potentially a couple of account)를 넣어서 메세지를 보낼 수 있습니다.
메세지를 보내기를 위해 받는사람이 수락을 해야되는 것 처럼 단지 보냈다고 받는 사람에게 메세지가 가지 않습니다. 메세지를 받은 사람이 메세지를 받아서 추가적인 처리(processing it according to receivers code)를 해주어야 됩니다.

이메일과 다른점이라면 수신사자나 참조된 사람들은 이메일 수령을 거부 할 수 있다는 점입니다.

EOS blockchain은 투명하게 그리고 영원히 수신자들이 메세지를 잘 수령 했는지를 기록 합니다. 물론 봇들이 서로 주고 받는 메시지도 다 기록을 하게 됩니다.

Binary가 아닌 소스 코드 배포

'봇'은 blockchain에 배포된 자동적으로 수행되는 source code를 말합니다. 각각의 계정(account)은 메세지를 처리하는것들로 이루어져 있으며 메세지의 상태(state)를 읽고, 저장 하거나 새로 메세지를 만들어서 다른 계정에서 비동기로 보낼 수 있습니다. 각각의 메세지 처리는 계정 각각이 개인적으로(private)하게 처리함으로 병렬적으로 처리 될 수 있습니다.

어플리케이션의 구조

각각의 계정(어플리케이션)은 각자 데이터 베이스를 가지고 있습니다. 이 데이터 베이스에 계정의 상태(state)를 저장하게 되는데 이를 저장하는 테이블을 생성하고, 각각의 테이블에 인덱스를 걸어 놓을 수 있습니다. 이를 통해 필요한 용도에 맞는 smart contract의 상태는 설계 될 수 있습니다.

각각의 계정은 타입을 정의 할 수 있습니다. 이 타입은 struct라고도 합니다. 각 type은 serialization을 정의해야 되고, 이를 통해 각각의 type은 사람이 읽을 수 있는 json 형식으로 표현 될 수 있습니다.

마지막으로 각각의 계정은 action을 정의 할 수 있습니다. 이를 통해 메세지가 다른 계정에 전달 되었을 때 하게 될 행위를 정의 할 수 있습니다. 가령 예를 들면 송금의 경우, 메세지를 수령한 사람에게 입금을 하게 하도록 action을 정의하게 되겠지요.

통화 어플리케이션 예제

이를 설명하기 좋은 간단한 예제는 통화 어플리케이션입니다. 다음 예를 통해 어떻게 통화 어플리케이션을 EOS를 통해 구축 할 수 있는지 알아 보겠습니다.

주의(Desclaimer)

아래의 내용은 개념을 설명하기 위한 예제입니다. 실제 구현과는 다를 수 있습니다.

일반 통화 계약 예제

통화 관련 어플리케이션을 만들기 위해서 개발시 가장 먼저 선행되는 건, 각각의 계정들이 어떤 행위를 서로 할 것인가 이게 될것 입니다. 어떻게 서로 활동을 할 것인지를 정의하게 되면 이에 맞게 데이터베이스의 테이블을 설계하고 적절한 인덱스를 설정 하게됩니다. 또한 각각의 액션이 발생 하였을 때 상태를 변경을 처기 하기 위한 로직을 개발 하게 됩니다. 추가적으로 각각 메세지를 처리하는 것(handler)의 권한도 설정 하게 됩니다.

간단한(simple high-level) 통화 어플리케이션 예제를 살펴 보겠습니다. 돈은 소유자에게 속하는걸로 테이블 구조를 구성 할 수 있습니다. 각각의 계정은 초기에 최대로 가질 수 있는 돈을 가지고 있습니다. 돈은 다른 사람에게 보낼 수 있습니다. 물론 돈을 자신이 가지고 있는것 이상으로 보낼 수 없고, 본인에게 보낼 수 도 없습니다. 잔고에 관련한 내용은 잔고가 있는 경우 존재하고, 잔고가 0 인 경우에는 해당 계정에 관련된 잔고 내용은 삭제 되게 됩니다.


struct Transfer
  to      AccountName
  from    AccountName
  amount  UInt64

struct Init

table Balance
  owner   AccountName
  balance UInt64

on Init action
   precondition:
     eos.requireAuthority( eos.thisAccount() )
     eos.require( !Balance.find( eos.thisAccount() ) ) /// only call once

   apply:
     self         = Balance.new()
     self.owner   = eos.thisAccount()
     self.balance = 100000  /// maximum currency supply
     Balance.save(self)


on Transfer action
   validate:
     // static validation, verifies action is internally consistent
     // no access to database tables
     eos.require( action.amount > 0 ) 
     eos.require( action.to != action.from ) 
     eos.requireNotify( action.to ) 

   precondition:
     // identify possible precondition check that can 
     // be executed with readonly access
     eos.require( Balance[action.from].balance >= action.amount )
     eos.requireAuthority( action.from )

   apply:
     // assuming all prior steps pass, perform the state transition
     // that updates balances and/or creates a new account for receiver
     var from = Balance[message.from]
     var to   = Balance.find( action.to )

     if( !to ) {
        to         = Balance.new()
        to.owner   = action.to
     }

     from.balance = from.balance - action.amount
     to.balance   = to.balance   + action.amount

    Balance.save(to)

    if( from.balance > 0 )
        Balance.save(from)
    else if( from != eos.thisAccount() ) 
        Balance.delete(from)

주의 할점

handler의 구조는 validate, precondition, apply로 나누어져 있습니다. 이 나누어진 3가지는 각각 서로 다른 phase에서 수행 되고 이를 통해 성능의 최적화와 병렬 처리를 할 수 있게 됩니다. 예를 들면 validate과 precondtion은 각각 read only의 수행이기에 병렬적으로 수행 될 수 있습니다.

apply만이 데이터베이스의 state를 재생성하는 부분입니다. apply는 이전에 확인된 action들의 기록을 통해 state를 재생성하게 됩니다. apply보다 validate이나 precondition이 계산 비용이 저렴하다는 점이 중요합니다. validate은 block이 deemed되어 수행 하지 않거나, precondition이 다시 실행 되진 않아도 apply는 blockchain이 동기화 될 때마다 수행되어야 합니다.

Stay Tuned

EOS의 decentralized 어플리케이션의 새로운 소식을 기달려 주세요. 물론 EOS의 mailing list에도 가입해주시고요 http://eos.io.

Coin Marketplace

STEEM 0.28
TRX 0.12
JST 0.032
BTC 66167.71
ETH 3014.78
USDT 1.00
SBD 3.73