이더리움 회원가입!? EOA 계정에 관한 개념정리.

in #kr7 years ago (edited)


piggy-2889042_640.jpg


안녕하세요. 어미새입니다.


지난 포스팅에서는 DApp에 대한 개념정리와, 이더리움의 어카운트 정보에 관한 내용을 다뤘습니다. 이번 포스팅의 목표는 외부 소유 어카운트(EOA)와, 컨트랙트 어카운트(CA)에 대한 개념정리를 하고 싶었습니다만, 컨트랙트 어카운트 계정의 필요성과, 목적에 대한 설명을 하기 위해서는 Smart Contract에 대한 개념정리가 먼저 필요했습니다. 그러다 보니 포스팅이 계속 미루어지고, 개념정리만 계속 해나가는 느낌을 지울 수 가 없었습니다.

역시 배움에는 지름길이 없나봅니다. 천천히 꾸준히 학습하는것이 가장 좋은 학습방법인것 같습니다. 계속 포스팅을 미루다보면 저 역시 지칠것 같아서 오늘은 조금 개념정리가 끝난 외부 소유 어카운트에 대한 이야기를 조금 해보도록 하겠습니다. 부족한 부분이 있다면 댓글로 알려주시면 정말 감사하겠습니다.


어렵게 생각하지말자!


탈 중앙화된 프로토콜은, 말 그대로 중앙에서 관리하는 주체가 없습니다. 즉, 내가 어떤 DApp에 가입신청을 하고, 관리자가 승인하는 구조가 아니라 시스템적으로 개인이 자유롭게 가입을 하고, 개인과 개인들이 정해진 규칙에 의해 거래가 원활하게 진행될 수 있어야합니다. 그렇다면 탈 중앙화된 시스템에서는 어떤 암호화폐의 주인이 누구의 소유인지 어떻게 인증할 수 있을까요?


비트코인의 경우를 생각해보겠습니다. 비트코인에서 해당 비트코인의 소유권을 입증하기 위해 어떤 방법을 사용했을까요? 네 맞습니다. 바로 개인 키 정보를 이용하여 소유권을 증명하였습니다.


비트코인 뿐만 아니라 대다수의 암호화폐 프로토콜에서는 소유권을 입증하기 위한 수단으로 개인 키를 사용하고 있으며, 개인 키를 활용하여 공개 키 를 생성하고, 나아가 지갑 주소 정보를 생성할 수 있었습니다(공개 키 정보가 주소로 사용될수도 있습니다.)


개인 키를 생성하고, 생성한 개인 키 정보를 통해 공개 키를 생성하고, 나아가 Address를 생성하는 과정이 탈 중앙화된 시스템에서는 회원가입 절차라고 생각하시면 조금 더 쉽게 이해하실 수 있을것 같다고 생각했습니다.(제가 이해한 바로는 이러한 행위가 꼭 회원가입의 유형과 비슷하다고 생각했으니간요!)


이더리움 회원가입

이더리움 프로토콜을 사용하기 위해서는 당연히 이더리움 계정 정보가 필요합니다. 즉, 회원가입부터 해야겠죠? 그리고 회원 가입을 하기 위해서는 앞서 언급한 내용처럼 개인 키정보를 생성하고, 생성한 개인 키 정보를 토대로 공개 키 정보를 생성하고, 나아가 Address를 생성하면 회원가입이 완료된다고 생각하시면 좋을것 같습니다.

이더리움에서는 이러한 과정을 통해 생성된 계정을 사용자 계정이라고 표현하며, 사용자 계정을 외부 소유 어카운트(EOA) 계정이라고 합니다.

지갑 프로그램을 통해 개인 키를 생성하고, 생성된 개인 키를 통해 공개 키를 만들고, 주소를 생성하는 행위 자체가 계정을 생성하는 과정이며, 이러한 계정을 EOA라고 하는것이죠!



외부 소유 어카운트(Eternally Owned Account)


앞서 언급한것 처럼, EOA 계정은 사용자 계정입니다.

EOA 계정이 어떻게 생성되는지, 지금부터 천천히 하나식 살펴보도록 하겠습니다.


EOA 계정 생성과정.


62_0.png

(1) 지갑 프로그램을 통해 개인 키를 생성하는 과정은 랜덤한 256 bit 데이터를 생성하고, 생성된 256 bit의 데이터를 64자리의 Hex 열로 인코딩한 결과 값입니다. (256/8=32바이트, 16진수로 64자리로 표현)

(2) 개인 키를 통해 ECDSA(타원곡선전자서명 알고리즘)을 이용하여 공개키를 생성합니다.

(3) 생성된 공개 키를 Kecak256 Hash 값으로 변환, 256bit의 바이너리 데이터가 생성되며, 생성된 바이너리 데이터의 앞쪽 96bit(12바이트) 데이터를 제거한 후 남아있는 160bit의 바이너리 데이터를 Hex열 값으로 인코딩한 결과 값이 바로 Address 정보입니다. (160bit를 16진수로 변환, 20byte의 데이터이며, 16진수로는 40개 문자열을 표현할 수 있음)


EOA 계정과, CA 계정의 차이점!

지난시간에서 어카운트 오브젝트에 대한 설명을 하면서 어카운트 오브젝트는 다음과 같이 두가지로 분류될 수 있다고 설명해드렸습니다.


  • EOA(Externall Owned Accounts)는 외부 소유 어카운트로서 개인 키에 의해 통제되는 계정 정보입니다.
  • CA(Contract Accounts)는 컨트랙트 어카운트로서 컨트랙트 코드에 의해 통제되는 계정 정보입니다.


EOA 계정은 사용자 계정이며, 개인 키(Private Key) 정보를 가지고 있습니다, 하지만 컨트랙트 어카운트(CA) 계정은 개인 키 정보를 가지고 있지 않습니다. 트랜잭션을 생성하기 위해서는 전자 서명 정보가 필요하며, 전자 서명을 하기 위해서는 반드시 개인 키 정보가 필요합니다.


즉, EOA 계정은 자체적으로 트랜잭션을 생성할 수 있지만, CA 계정은 자체적으로 새로운 트랜잭션을 생성할 수 없으며, 타 계정으로 부터 받은 메시지에 대한 응답으로 내부 트랜잭션을 실행할 수 있습니다.



62_1.png


위의 그림과 같이 외부 소유 계정으로 부터 모든 상태 변환이 시작되며, 외부 소유 계정이 다른 외부 소유 계정에게 이더를 전송하기 위하여 트랜잭션을 생성하거나, 특정 계약을 수행하기 위해 컨트랙트 계정에게 트랜잭션을 발송하여 계약이 발동될 수 있도록 할 수 있는것입니다.

컨트랙트 계정은 이렇게 외부 소유 계정에 의해 전달받은 메시지에 대한 응답으로 자신의 컨트랙트를 수행하고, 수행하는 과정에서 또 다른 컨트랙트 계정에게 메시지를 전달할 수 있습니다.


너무 복잡하게 생각하지 마시고, 아래와 같이 개념정리를 먼저하시면 좋을것 같습니다.

(1) 이더리움에서는 보다 다양한 상태 정보를 관리하기 위해 어카운트라는 오브젝트를 통해 관리하고 있으며, 외부 소유 어카운트와, 컨트랙트 어카운트로 나누어진다.

(2) 외부 소유 어카운트는 사용자가 개인 키를 통해 관리하는 사용자 계정이며, 자체적으로 트랜잭션을 생성할 수 있으며, 다른 외부 소유 어카운트에 이더를 전송하거나, 메시지를 통해 컨트랙트 계정을 실행시킬 수 있다.

(3) 컨트랙트 계정은 오직 외부 소유 어카운트에의해 실행될 수 있으며, 자체적으로 트랜잭션을 생성할 수 없다. 컨트랙트 계정은 조건에 따라 또 다른 컨트랙트 계정을 참조하기 위하여 Internal Transaction을 생성할 수 있다.


Account

이더리움의 상태(State)는 어카운트(account)라고 하는 오브젝트(object)들로 구성되어 있으며, 각 어카운트 오브젝트에 20바이트의 주소와, 상태변화(state transition)을 가지고 있다고 설명해드렸습니다.

Account는 총 4가지(Nonce, Balance, storageRoot, codeHash) 정보로 구성되며, 각 계정의 종류에 따라 어떤 역할을 수행하는지 간략하게 정리해보도록 하겠습니다.


EOA
  • Nonce : Account에서 전송된 트랜잭션의 수
  • Balance : Account가 소유한 잔고 정보로써, wei 단위로 표시
  • storageRoot : Merkle Paticia Tree의 Root Hash(추후 자세히 언급하겠습니다.)
  • codeHash : 빈 문자열의 Hash 정보
CA
  • Nonce : Account에서 생성된 Contract 수
  • Balance : Account가 소유한 잔고 정보로써, wei 단위로 표시
  • storageRoot : Merkle Paticia Tree의 Root Hash(추후 자세히 언급하겠습니다.)
  • codeHash : Account에 포함된 이더리움 버츄얼 머신(EVM) code의 Hash


마무리


비트코인 이후 학습을 진행하다가 갑자기 계정이라는 개념이 튀어나오고, 계정은 또 EOA와 CA로 구분되며, 각 차이점에 대해 알아가다보니 스마트 컨트랙트 개념까지 더해지면서 머리가 복잡해졌던것 같습니다.

어렵게 생각하지 않고 심플하게 생각해보면, 비트코인에서는 거래를 하기 위해 지갑 주소가 필요했고, 해당 지갑 주소를 관리하기 위해 private key가 필요했습니다. 이러한 지갑 주소를 계정이라고 생각하면 이해가 쉬울것 같습니다. 그리고 지갑 잔고 정보를 관리하기 위해서 UTXO라는 개념이 필요했던것이구요!

마찬가지로 이더리움에서도 거래를 진행하기 위해서 지갑 프로그램을 통해 private key를 발급하고, 주소를 발급하는 행위가 계정을 생성하는 행위이며, 이렇게 생성된 계정이 EOA 계정이었던것입니다.

UTXO보다 더 많은 상태 정보를 관리하기 위해 Account Object를 활용했으며, 여기에 Smart Contract라는 개념이 더해지면서 컨트랙트 계정이 추가되었구나 정도로 우선 개념정리를 하시면 좋을것 같습니다.


다음 시간에는 이런 관점에서 비트코인의 UTXO와 이더리움의 Account가 어떻게 차이점이 있는지에 대해 살펴보는 시간을 갖도록 하겠습니다.


부족한 설명이지만, 끝까지 읽어주셔서 감사합니다!


[참고문헌]


https://steemit.com/kr/@feyee95/5lzztc

https://www.ddengle.com/develop/3392079

https://steemit.com/coinkorea/@etainclub/smart-contract-6-dapp

https://blog.theloop.co.kr/2017/03/28/%EC%8A%A4%EB%A7%88%ED%8A%B8-%EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8smart-contract-%EA%B0%9C%EC%9A%94-1/

https://blog.theloop.co.kr/2017/04/04/%EC%8A%A4%EB%A7%88%ED%8A%B8-%EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8smart-contract-%EA%B0%9C%EC%9A%94-2/

https://steemit.com/coinkorea/@etainclub/smart-contract-7-1

Sort:  

system 체계를 머릿속에서 형상화하여 이해하려니 알듯알듯 잘 안넘어가지네요~~ ㅠㅠ 언급하신대로 천천히 보다보면 어느날 무릎 탁 치는 날이 올것 같습니다. 이렇게 하나하나 설명해주심에 너무나 감사합니다^^

맞아요~ 천천히 꾸준히 하나식 용어 정리하면서, 알아가다보면 언젠가는 이해할 수 있겠죠!? 저도 지금 그렇게 공부하고 있답니다~:)

Congratulations @yahweh87! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the total payout received

Click on any badge to view your own Board of Honor on SteemitBoard.

To support your work, I also upvoted your post!
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

Upvote this notification to help all Steemit users. Learn why here!

일교차가 큰 날씨에요 감기조심하세요^^
오늘은 바람이 많이 부네요^^

크어 어려운 거 하시는군요.. 이게 이해는 되도 설명하기가 어렵던데..글로 풀어내긴 더 어렵구...수고하셨어요~~~ 잘 보고 가요^^

맞아요 이해는 진작에 했는대 말로 풀어서 또 설명하려니 어렵더라구요 ㅎㅎ;;

늘 응원해주셔서 감사합니다 ^^;

정리해주신 그림 진짜 명쾌하네요..항상 볼 때 마다 감탄하고 갑니다!
Nonce가 비트코인 넌스랑은 좀 다르네요.
아직은 같은 PoW라서 연산찾는 녀석인 줄 알았는데, 거래 횟수였다니...ㅎㅎ
매번 이더스캔에서 봤음에도 불구하고 잘 몰랐네요 ㅠ 드디어 알고 감니다 !

Coin Marketplace

STEEM 0.25
TRX 0.25
JST 0.038
BTC 96978.69
ETH 3375.51
USDT 1.00
SBD 3.54