여행글에 너무 많은 성원을 해주셔서 이더 글 쓰기가 살짝 무섭네요..ㅎㅎ
댓글 달아주시구 보팅해주신 분들 정말 진심으로 감사드립니다~~~ 얼릉 대댓글 쓸게요...글부터 써야할 거 같아서..죄송해요 ^^
추억만으로 살 수는 없으니 공부해야죠!!!
저번 글에 이어 이더리움의 계정(Account )에 대해서 알아보겠습니다.(계좌라고도 하고 계정이라고도 하는데 개인적으로 계정이 더 어울리는 거 같습니다)
이더리움의 계정에는 2가지 종류가 있습니다. 외부 소유 계정(External owned Account), EOA라고 불리는 것과 계약계정(Contract Account), CA라고 불리는 계정입니다. 이름에서도 살짝 유추할 수 있지만 외부소유계정은 누군가가 소유하고 있는, 지갑과 같은 계정이라고 생각하시면 됩니다. 두 가지 계정 중 외부소유 계정이 상위 계정이고 새로 생성되는 트랜잭션은 모두 이 외부소유계정에서 시작하게 됩니다. 외부소유계정에서 계약과 관련된 트랜잭션을 만들면 계약계정에서 받아서 처리하게 되죠.
이렇게만 말하면 이해하시기 어려울테니 조금이라도 친근한 비트코인과 비교해 보겠습니다.
비트코인에는 계정이라는 개념이 없습니다. 단순히 지갑이라는 형태로 존재하죠. 비트코인의 지갑은 비트코인의 거래를 담당합니다. UTXO(Unspent Transaction Output)라는 비트코인 가치 덩어리가 오고 가는 것이죠.
UTXO에 대해서 모르시는 분이 계실테니 간단하게 비유를 하자면,
이런 카드지갑의 칸마다 자신이 송금받은 수신내역을 넣어놓는다고 생각하시면 됩니다. 송금받은 금액 한 건씩 각 칸에 넣어놓는 거죠. 그래서 언제, 누구한테, 얼마나 받았는지 하나 하나를 알 수 있는 구조입니다. 비트코인의 지갑은 실제로 비트코인이 움직이는 것이 아니라 저렇게 금액을 적은 내역들이 옮겨다니는 것입니다.
그에 반해 이더리움의 외부소유계정(EOA)은 은행 계좌와 같습니다. 그냥 전체 돈으로 계산되지 이 돈을 누구한테 받았는지에 대한 정보같은 것은 없습니다. 그냥 은행 잔액조회 같은, 다 합친 잔고가 표시되는 개념이죠. 거래 내역을 조회하면 찾을 수 있겠지만 비트코인처럼 따로 저장되지는 않습니다.
비트코인 거래처럼 개인 대 개인 혹은 거래소에서 이더만 송금을 하는 경우, 이 외부소유계정은 비트코인 지갑과 같은 역할을 합니다. Value Transfer 라고 해서 외부소유계정에서 다른 외부소유계정으로 이더가 송금되는 과정이죠. 과정도 비슷해서 보내는 사람이 자신의 외부소유계정에서 개인키로 서명을 한 Transaction을 만들어 받는 사람의 외부소유계정으로 보내게 됩니다.
하지만 이더리움는 이렇게 지불수단으로써만 쓰이는 네트워크가 아니죠. 스마트 컨트랙트라는 기능이 있으니까요.
이런 계약을 실행하는 데 필요한 계정이 바로 계약계정(CA)입니다. 외부소유계정이 스마트 컨트랙트를 만들어 보내면 그것을 받아 자동적으로 처리해주는 계정이 바로 계약계정입니다.
이 계약계정은 코드화 된 계약에 의해서만 움직이고 외부소유계정의 소유자가 맘대로 변경할 수 없습니다. 강제실행이라는 말이 여기서 나오는 거죠.
그럼 외부소유계정과 계약계정에서 스마트 컨트랙트가 시행되는 간단한 예를 들어보겠습니다.
A가 B에게 10 이더를 보내면서, 이더가 천만원이 되면(제발...) 5이더는 B가 갖고 C에게 남은 5이더를 보내라 는 트랜잭션을 만든다고 생각해 봅니다.
트랜잭션1
우선 A는 자신의 외부소유계정으로 이 내용을 담은 트랜잭션을 만들어서 서명을 하고 블록에 포함시켜야 합니다.
A가 보낸 트랜잭션은 모든 노드들이 검증한 후 블록에 담겨 B에게 전송되죠. 이 트랜잭션에는 이더를 송금하는 것 외에 이더가 천만원이 되면 이라는 조건을 담은 메세지가 들어있으니 조건을 만족할 시 자동으로 실행되는 B의 계약계정으로 보내지게 됩니다.
트랜잭션2
이더가 천만원이 되는 날(가즈앗!!!), B의 계약계정은 A로부터 받은 계약을 자동으로 실행시킬 것입니다. 따라서 5이더를 자신의 외부소유계정으로 보내고, 남은 5이더를 C의 외부소유계정으로 보내게 됩니다. 더이상의 조건이 붙지 않으니 C의 계약계정으로 보낼 필요가 없습니다.
이렇게 하나의 흐름으로 조건이 맞으면 자동으로 실행되는 것이 스마트 컨트랙트이고 그 안에서 외부소유계정과 계약계정의 역할이 나뉘게 됩니다.
계약계정은 어떤 새로운 계약도 만들어낼 수 없습니다. 외부소유계정이 만든 계약을 실행시킬 뿐이죠. 모든 계약에는 이것이 참이라는 인증이라는 것이 들어가야하는데 이더리움 블록체인에서 그걸 담당하는 것은 개인키를 통한 서명이고 서명을 할 수 있는 것은 외부소유계정 뿐이니까요.
이전 글에서 트랜잭션 하나하나가 블록에 담기는 과정을 봤었습니다. 위 예로 들면 A가 B에게 보내는 트랜잭션1과 B가 C에게 보내는 트랜잭션2가 각각 담기게 되겠죠.
블록체인이라는 것은 이 블록들을 전체 노드가 공유하는 것이고 그 블록 안에 내용도 모두가 공유하고 승인하게 됩니다. 이렇게 A가 B에게 보내는 트랜잭션이 담긴 블록이 전파되고 그 계약을 모든 노드가 가지고 있는 상태를 이더리움에서는 State라고 합니다. 전체 노드에게 계약 내용이 전파되어 계약의 진행상황이나 지금의 상태를 모두가 알고 있다는 것이죠. State는 이더리움에서 자주 나오는 개념입니다. 스마트 계약을 상태변환함수라고 말하는 것도 바로 저 State란 개념을 쓰기 때문이죠. 조건이 맞게되면 계약이 실행되어 블록들이 가지고 있는 State를 변화시키니까요.
위의 예는 아주 단순화시켜 개인 대 개인의 거래만을 다뤘지만 이더리움 네트워크 안에서 쓰이는 Dapp의 경우, 저런 계약이 Dapp에 참가하는 많은 인원에게 적용될 수 있습니다. 계약 내용을 담은 트랜잭션이 블록에 담겨서 승인되고, 조건이 성립되었을 때 많은 사람들에게 똑같은 영향력을 발휘할 수 있는 단계를 state라는 개념을 통해 설명하는 것이죠.
이더리움의 트랜잭션도 송금을 하거나 계약을 실행시키기 위해 수수료를 내야합니다. 그리고 그 수수료는 트랜잭션 안에 담겨있습니다.
위에 트랜잭션의 구성요소를 적은 이유는 바로 GAS라는 이더리움의 수수료 체계의 특징때문입니다. 비트코인의 경우 송신자가 보낸 비트코인과 수신자가 받는 비트코인의 차이가 수수료로 알아서 빠지는 구조이죠. 그래서 어떤 추가적인 데이터를 필요로 하지 않고 송신자가 수수료를 설정할 수 있죠.
이더리움은 이렇게 금액 차이로 수수료를 계산하는 것이 아닌 트랜잭션안에서 수행되는 송금이나 계약 내용안에 코드의 종류와 개수로 수수료를 매깁니다.
이 수수료 지불 과정에서 송신자가 설정할 수 있는 2가지가 바로 저 gaslimit와 gasprice입니다. 그래서 저 2가지 데이터가 트랜잭션의 일부로 들어가게 되는 것이죠.
그럼 다음 포스팅에서 이더리움의 수수료 부가 체계와 gas에 대해서 알아보겠습니다.(힘들어요..ㅠㅠ)
재미없는 긴 글 읽어주셔서 감사드립니다~~ 제가 제대로 이해가 안되면 글이 어려워지던데 오늘 글은 확실히 좀 어렵겠네요..ㅎㅎ State 부분에서 제가 잘못 이해한 것이 있다면 꼭 지적해 주시면 감사하겠습니다~~~
참조 :
이더리움 작동원리의 이해(1) -땡글 블록체인 강의(동영상)
Medium, 이더리움 계정, 트랜잭션, 가스 그리고 블록 가스 한도- Yeji Park
Ourselves 캠페인
셀프보팅을 하지 않고 글을 올리시고
ourselves 테그를 달아 주시면
많은 분들이 관심 가져 줄꺼에요