동아리, 스터디, 교육/블록체인

[20.07.15] 2주차 블록체인 - 외부 소유 어카운트(EOA), 컨트랙트 어카운트(CA)

pxatd 2020. 7. 16. 20:11
728x90

스터디는 일주일에 한 번, 2시간정도 진행되며 구글 북스에서 무료로 제공하는

https://play.google.com/store/books/details?id=WKLHDwAAQBAJ&rdid=book-WKLHDwAAQBAJ&rdot=1&source=gbs_vpt_read&pcampaignid=books_booksearch_viewport

코어 이더리움 프로그래밍 교재를 사용하며, 정해진 분량에 대해 공부하고 공부했던 부분을 스터디원들 앞에서 발표하는 형식으로 진행됩니다. 

 

저도 처음 다루는 부분이고 다른 블로그나 뉴스기사, 논문 책 등을 참고하여 작성하였으며 정확하지 않은 내용이 있을 수 도 있습니다. 댓글로 지적해주시면 수정하겠습니다.

 

블록체인과 이더리움의 개념과 추가적인 부분에 대해 제가 이해하기 쉽게 바꿔서 이해하였고 그 이해한 것을 바탕으로 티스토리에 업로드 합니다. 


이 주제 선정 계기

1주차 스마트 컨트랙트에 대해 조사하고 공부하다 보니 외부소유 어카운트와 컨트랙트 어카운트의 단어가 나오는데 제대로 이해하지 못했습니다. 2주차 내용일 읽어보니 이더리움의 플랫폼을 설명하는 내용 중 이와 관련된 내용이 있어서 더 공부해보았습니다.

저는 개인적으로 이 책의 나오는 단어들이 거의 영어라 앞의 내용을 이해하지 못하면 뒤에 내용도 하나도 이해하지 못했기 때문에 앞에서부터 개념을 공부하고 내 언어로 바꿔 습득하는 식의 스터디를 진행하였습니다. 자주 나오는 용어들의 개념을 확실히 하니 아직 뭐가 뭐다 라는식의 명확한 개념은 잡히지 않았지만 어느정도 이해할 수 있었습니다. 그래서 제가 이해한 내용을 스터디 부원들에게 설명하면 좋을 것 같아 발표하게 되었습니다.

 

이더리움의 목적

비트코인의 탈 중앙화

앞에서 설명했던 것처럼 이더리움은 비트코인과 같은 탈 중앙화 된 금융시스템을 위한 시스템을 넘어 탈 중앙화 된 어플리케이션 제작을 위한 프로토콜을 만드는 것입니다. 블록체인이라는 필수적이고 근본적인 기반을 제공함으로써 분산 어플리케이션에 유용한 개발 기법을 제공하고 다른 어플리케이션과 상호작용할 수 있는 생태계를 만들고자 하였습니다.

이러한 생태계를 만들기 위해서 다양한 상태 정보를 담을 수 있는 방법이 필요했으며, 이러한 역할을 수행하기 위해 만들어진 것이 바로 어카운트 오브젝트(account object)입니다.

 

 

이더리움의 상태

state

더리움의 상태는 어카운트 오브젝트들로 구성되어 있으며, 각 어카운트 오브젝트에는 20바이트의 주소와, 상태변화를 가지고 있습니다. 이러한 어카운트는 외부 소유 어카운트인 EOA(Externall Owned Accounts)컨트랙트 어카운트(Contract Account)로 구분할 수 있습니다. 외부 소유 어카운트와, 컨트랙트 어카운트에 대한 세부적인 설명을 하기 앞서 이더리움에서 상태라는 개념에 대해 조금 더 설명하겠습니다.

 

제네시스 스테이트

이더리움 프로토콜이 만들어지고 어떠한 트랜잭션이 한 번도 실행되지 않은 상태를 제네시스 스테이트(Genesis state) 라고 표현하며, 그 이후 트랜잭션이 실행되었을 경우 상태(state) 정보가 변합니다.

 

파이널 스테이트

트랜잭션이 실행되었다는 의미는 마이닝 과정을 통해서 트랜잭션에 대한 검증이 이루어지고, 블록에 담기어 전파되었다는 것을 뜻하며 이렇게 블록에 담기고 전파되었을 경우의 상태를 파이널 스테이트(Final state) 라고합니다. 그러면, 이더리움 프로토콜에 참여한 모든 사용자가 최종 상태 정보를 공유하게 되는 것입니다.

 

어카운트의 분류

이러한 어카운트는 사용하는 목적과, 특성에 따라서 다음과 같이 두가지로 분류될 수 있습니다

EOA(Externall Owned Accounts)는 외부 소유 어카운트로서 프라이빗 키에 의해 통제되는 계정 정보

CA(Contract Accounts)는 컨트랙트 어카운트로서 컨트랙트 코드에 의해 통제되는 계정 정보

 

외부 소유 어카운트에서 프라이빗 키가 필요한 이유는 이더리움이 탈 중앙화 된 프로토콜이기 때문입니다. 말 그대로 중앙에서 관리하는 주체가 없기 때문에 개인과 개인들이 정해진 규칙에 따라 거래가 원활하게 진행되려면 어떤 암호화폐의 주인이 누구의 소유인지 인증할 수 있어야 합니다. 비트코인의 경우를 예시로 들어보면 해당 비트코인의 소유권을 입증하기 위해 개인 키 정보를 이용하여 소유권을 증명하는 것과 같은 원리입니다.

저는 여기에서 외부 소유 어카운트(EOA)를 이더리움에 회원가입을 하면 생기는 계정이라고 이해했습니다. 회원가입 시 생성한 개인 키 정보를 토대로 공개 키 정보를 생성하고 나아가 주소(address)를 생성하는 것입니다.

 

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

앞서 언급한 것처럼 외부 소유 어카운트(Eternally Owned Account)는 사용자 계정입니다. 이것이 어떻게 생성되는지 말씀드리겠습니다.

 

EOA 계정 생성과정

코어 이더리움 프로그래밍 p 52참고

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

 

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

 

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

 

이건 코어 이더리움 프로그래밍 52페이지에 자세히 나와있으니 다들 이해하셨을 것 같아서 넘어가겠습니다.

 

EOA 계정과, CA 계정의 차이

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

CA(Contract Accounts)는 컨트랙트 어카운트로서 컨트랙트 코드에 의해 통제되는 계정 정보입니다.

 

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

 

 

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


이 그림이 제가 아까 1주차에서 설명했던 스마트 컨트랙트가 이루어지는 구조입니다. 1주차에서 이걸 먼저 알았더라면 이해가 쉬웠을텐데 반대로 나와있어 1주차를 이해하는게 좀 힘들었습니다. 그래도 이 그림을 딱 보는 순간 어 내가 공부했던건데 하면서 잘 이해할 수 있었고 뿌듯했습니다!

 

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

마지막으로 정말 쉽게 두문단으로 요약하자면 비트코인에서는 거래를 하기 위해 지갑 주소가 필요했고, 해당 지갑 주소를 관리하기 위해 private key가 필요했습니다. 이러한 지갑 주소를 계정이라고 생각하면 이해가 쉬울것 같습니다.

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

 


참고

블로그: https://steemit.com/kr/@yahweh87/dapp-account

https://steemit.com/kr/@yahweh87/eoa

 

이더리움 백서

코어 이더리움 프로그래밍

https://play.google.com/store/books/details?id=WKLHDwAAQBAJ&rdid=book-WKLHDwAAQBAJ&rdot=1&source=gbs_vpt_read&pcampaignid=books_booksearch_viewport

728x90