반응형

이더리움 플랫폼의 소스 코드에 있는 구성요소를 살펴보면 다양하게 서로를 호출하고 있음을 알 수 있다.


그러한 코드를 그림으로 도식화 하면 다음과 같이 나타난다.



데이터 계층


데이터 계층은 이더리움에서 다루는 각종 데이터 구조를 정의하고 관련 데이터를 관리한다.

데이터 구조에는 어카운트와 트랜잭션, 메시지, 리셉트(receipt)이 있고 이러한 데이터의 집합인 블록과 블록체인 등이 존재한다.

이러한 데이터 모델은 ethdb 패키지를 통해 구글이 만들어낸 데이터베이스인 LevelDB에 바이너리 형태로 저장된다.



어카운트


이더리움 플랫폼에서 account는 모든 트랜잭션의 실행 주체이자 기본 단위이고 모든 것이 어카운트에서 시작한다.

이러한 어카운트에는 두가지 어카운트 타입이 존재한다.


외부 소유 어카운트(EOA, Externally Owned Account)

우리가 흔히 말하는 이더리움 사용자 어카운트가 외부 소유 어카운트이다.

사람이 직접 개인 키를 관리해야하고 키를 분실하면 어카운트도 분실한 것과 동일하게 된다. 

EOA는 개인 키를 사용하여 서명된 트랜잭션을 생성하고 실행함으로써 다른 EOA나 컨트랙트 어카운트(CA)에 메시지를 보낼 수 있다.


보통 우리가 말하는 EOA끼리의 메시지 전송은 Ether을 전송하는 의미와 같다.

하지만 컨트랙트 어카운트(CA)에 메시지를 보내게 되면 다양한 코드를 실행시킬 수 있고 다양한 결과물을 도출해낼 수 있다.


컨트랙트 어카운트(CA, Contract Account)

스마트 컨트랙트의 정식 용어가 컨트랙트 어카운트(CA)이다.

컨트랙트 어카운트는 EOA나 다른 CA의 메시지를 받은 후 내부 코드를 실행한 후 새로운 컨트랙트를 생성하거나 다른 메시지를 읽거나 데이터를 내부 저장 공간에 저장하는 역할을 한다.

하지만 CA는 직접 운영체제를 조작하거나 랜덤 넘버를 생성하는 API는 호출이 불가능하고 오직 EOA나 다른 CA에 의해 실행된다.


즉, CA는 자기 자신이 직접 새로운 트랜잭션을 생성할 수는 없다.




Account 구조체


Account 구조체에서 Address 필드는 20바이트로 고정된 배열이고, URL은 해당 주소의 위치를 나타낸다.


- 어카운트 주소

1
2
3
4
5
6
7
8
9
// 패키지 : accounts, 파일명 : accounts.go
type Account struct {
    Adress common.Address    `json:"address"`
    URL    URL           `json:"url"`
}
 
// 패키지명 : Common, 파일명 : Types.go
const AddressLength = 20
type Address [AddressLength]byte
cs




- 어카운트 정보

1
2
3
4
5
6
7
// 패키지 : core/state, 파일명 : state_object.go
type Account struct {
    Nonce    uint64
    Balance  *big.Int
    Root     common.Hash // 머클 패트리시아 트리의 루트 해시
    CodeHash []byte
}
cs


Nonce :: 넌스는 해당 어카운트로부터 보내진 트랜잭션의 수를 의미하고 0으로 시작한다.

만약 어카운트가 CA이면 넌스는 어카운트에 의해 생성된 컨트랙트의 수가 된다.


Balance :: 해당 어카운트의 이더 잔액을 표기한다. 기준은 Wei이다.


Root :: 루트는 해당 어카운트가 저장될 머클 패트리시아 트리의 루트 노드다.

실제 어카운트의 저장소는 머클 패트리시아 트리에 저장되는데, 이 트리의 루트 노드를 암호 해시한 것이 root이다.

이때 암호화 과정에서 해시는 Keccak256 암호 해시를 사용한다.


CodeHash :: 코드 해시는 해당 어카운트의 스마트 컨트랙트 바이트 코드의 해시를 의미한다.

여기서 코드해시 부분이 비어있으면 EOA, 그렇지 않으면 CA이다.



합의 계층


합의 계층은 어카운트에 의해 생성된 트랜잭션과 그와 관련된 데이터들이 모여있는 블록의 유효성을 검증하는 합의 엔진, 이 과정을 수행하는 마이닝과 난이도 시스템, 그리고 마이너들에게 지급할 수수료인 가스, ether 등의 처리를 담당한다.



실행 계층


실행 계층은 이더리움 블록체인에서 구동 가능한 스마트 컨트랙트와 스마트 컨트랙트를 이더리움 노드 상에서 실행 시킬 EVM(Ethereum Virtual Machine)의 처리를 담당한다.



공통 계층


공통 계층은 이더리움에서 공통적으로 사용하는 기능(암호화 함수, rpc, params, event 등등)을 제공한다.


노드간 연결 및 동기화를 위한 P2P 네트워크 프로토콜을 비롯하여 암호 해시, 전자 서명, 다양한 인코딩, 공통 저장소 등 모든 계층에서 공통적으로 이용할 기능들을 담당한다.



응용 계층


응용 계층에서는 다양한 탈 중앙화 방식의 서비스 및 탈중화된 앱인 DApp의 환경을 제공해주고 블록체인에서 구동 가능한 스마트 컨트랙트, 분산 파일 시스템 Swarm, 분산 메시징 시스템 Whisper 등등을 제공한다.





반응형