이더리움 플랫폼에서 어카운트는 모든 트랜잭션의 실행 주체로 가장 기본적인 단위이다. 이더리움에서는 다음과 같이 2개의 어카운트 타입을 가지고 있다.
외부소유 어카운트 (EOA : Externally Owned Account)
컨트랙트 어카운트 (CA : Contract Account)
다음 그림과 같이 외부소유 어카운트간(EOA ↔︎ EOA)에는 이더의 전송에 해당하는 트랜잭션만 수행이 될수 있다.
외부소요 어카운트에서 컨트랙트 어카운트 간(EOA ↔︎ CA)에도 이더의 전송인 트랜잭션이 수행될수 있지만, 컨트랙트 어카운트간(CA ↔︎ CA)에는 메세지를 통한 스마트 컨트랙트 수행만이 동작될수 있다. 이러한 컨트랙트 어카운트간의 트랜잭션은 단독으로는 이루어질수 없고, 외부소유 어카운트나 컨트랙트 어카운트의 응답에 의해서만 실행될수 있다.
// Account is the Ethereum consensus representation of accounts.
// These objects are stored in the main account trie.
type Account struct {
Nonce uint64
Balance *big.Int
Root common.Hash // merkle root of the storage trie
CodeHash []byte
}
Nonce : 0부터 시작되는 값으로 EOA인 경우에는 해당 어카운트에서 수행된 트랜잭션의 수, CA인 경우에는 해당 어카운트에서 만들어진 컨트랙트의 수
Balance : 해당 어카운트의 이더 잔액(Wei 단위 기준)
Root : 해당 어카운트가 저장될 머클 패트리시아 트리의 루트
_*머클 패트리시아 트리 : 머클 패트리샤트리는 이더리움에서 사용하는 수정된 머클트리이며 효율적으로 정보를 관리하기 위한 자료구조.
CodeHash : 해당 어카운트의 스마트 컨트랙트 바이트 코드의 해시로 이 코드값이 nil 로 비어있으면 해당 어카운트는 CA가 아닌 EOA라는 의미.