Qaupot Blog
Software Engineering, Trip

이 글을 이해하기 위해서 컴퓨터 공학 지식이 필요하지 않습니다.

Smart Contract

Bitcoin 에서는 Script 라는 간단한 프로그램을 작성 할 수 있었지만, 제한적인 목적과 기능을 위해서만 사용할 수 있었습니다.

Ethereum 에서 도입된 Smart Contract 는 범용적인 프로그래밍 언어 (Solidity, Vyper) 를 사용하여 프로그램을 작성할 수 있게 만들었습니다.

  • 한번 Ethereum 에 Deploy (Upload) 된 Contract 는 변경할 수 없습니다. 단어 뜻 그대로 '계약' 이기 때문입니다.
    • Upgradable Contract 라는 방법이 있지만, 한 쪽에서 계약을 바꿔 버릴 수 있다는 것은 신뢰 문제가 될 수 있습니다.
  • Contract 는 독립적인 Account 로 취급 됩니다. 다른 Contract 를 만들거나, 호출할 수 있습니다.
  • 어떠한 Account 로부터 만들어지는 하위 Contract 의 주소는 일정한 규칙을 가지고 만들어 집니다.

Ethereum Account

Ethereum 은 Address (20 byte) 와 State Transition Storage 를 가지는 Account 를 사용합니다.

  • Nonce : 매 Transaction 마다 증가하는 값입니다. Transaction 의 실행 순서 보장을 위해 사용됩니다.
  • Balance : Account 가 보유하고 있는 Ether Balance 입니다.
  • Contract Code : Account 는 Contract Code 를 가질 수 있습니다.
  • Storage : Contract 실행에 따른 상태를 저장합니다.

Bitcoin 이 "$30 수표와 $70 수표를 소비할 수 있는 Address A" 방식이라면, Ethereum 은 "Account A 는 $100을 가지고 있음" 방식에 가깝다고 할 수 있습니다.

Ethereum Virtual Machine

Ethereum 에서 Smart Contract 는 Ethereum Virtual Machine (EVM) 를 통해 동작합니다.

EVM 을 통해 실행 된 모든 입력과 결과, 그리고 Contract Code 는 Ethereum 에 기록되고, 공개 됩니다.

  • EVM 실행은 비싸며, 한정적인 자원입니다. 큰 프로그램 혹은 일괄 처리를 하는 프로그램은 작성하기 어렵습니다.
  • 난수 생성을 할 때는, 난수가 예측 가능하다는 점에 유의하여야 합니다.
  • Overflow, Re-entry 등 다양한 문제점들을 Contract 작성 시에 주의하여야 합니다.
  • 최종적으로 EVM 은 Miner 에 의해 실행되어 Block 에 결과가 기록됩니다.
    • 종종 Transaction 이 없는 Block 을 발견할 수 있는데, EVM 을 실행하는 비용을 아껴서, 다른 Miner 보다 먼저 Block 을 만드는 전략을 택하는 경우입니다.

Ethereum Gas

EVM 을 실행하는 대가로써, Gas 를 지불하여야 합니다. Transaction Fee 라고도 부를 수 있습니다.

Gas 소비량은 얼마나 프로그램 코드를 실행 시켰는가를 의미하며, 각각의 Op Code (명령어)는 그 실행 부담에 따라 다른 Gas 소비량이 책정되어 있습니다.

  • Read 는 저렴하지만, State 를 Write 하는 비용은 매우 비쌉니다.
  • 반복적으로 참조가 발생할 경우, 비용 절감을 위해서는 일단 Memory 로 읽어 온 다음 작업을 수행하는게 좋습니다.

Gas 는 Ether 와 다른 단위로써, Gas Price 는 Transaction 을 발생 시킬 때 입찰합니다. 높은 Gas Price 를 제시할 경우, Miner 는 해당 Transaction 을 우선적으로 선택하기 때문에, 보다 빠르게 처리될 수 있습니다.

  • Fee = Gas Price * Gas

1 개의 Block 에는 소비할 수 있는 Gas 량이 정해져 있으므로, Gas Price 는 수요와 공급에 의해 결정됩니다.

또한, Halting Problem 이라고 불리우는, 어떠한 프로그램이 언젠가 끝나는지 아닌지 알기 위해서는 실제 실행시켜 볼 수 밖에 없다는 문제로 인해, EVM 을 실행하는데 필요한 Gas 소모량은 정확하게 예측할 수 없습니다.

Transaction 을 발생 시킬 때, Gas Limit 을 지정하며, 해당 Gas Limit 을 초과할 경우 EVM 실행은 실패하게 됩니다. Gas Limit 은 예상 한 Gas 소모량을 초과하여, 너무 많은 비용이 청구되는 것을 방지합니다.

Block 의 Gas 제한 및 Gas Limit 으로 인해, EVM 은 큰 프로그램은 실행할 수 없습니다.

Reference

이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.