이 글을 이해하기 위해서 컴퓨터 공학 지식이 필요하지 않습니다.
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 은 큰 프로그램은 실행할 수 없습니다.