관리 메뉴

평행우주 : world 1

[블록체인이론] 이더리움 데이터 계층 : 어카운트 구조와 생성 본문

텃밭 1 : BlockChain/이론

[블록체인이론] 이더리움 데이터 계층 : 어카운트 구조와 생성

parallelworlds 2022. 3. 30. 04:42

 

 

이더리움 플랫폼 데이터 계층 : 어카운트

 

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

이더리움은 두 가지 어카운트 타입을 갖는다

 

어카운트

외부소유 어카운트 EOA

일반적으로 말하는 이더리움 사용자 어카운트

사람이 직접 개인키로 관리

스마트 컨트랙트 실행 코드를 가지고 있지 않다

개인 키를 분실하면 해당 어카운트도 분실한 것과 마찬가지이다

EOA는 개인 키를 사용하여 전자 서명된 트랜잭션을 생성 및 실행함으로써

다른 EOA나 컨트랙트 어카운트에 메시지를 보낸다

보통, EOA 간의 메시지는 이더를 전송하는 것

또는 EOA가 컨트랙트 어카운트에 메시지를 보내 해당 코드를 실행시켜 다양한 결과를 만들 수 있다

 

컨트랙트 어카운트 CA

일반적으로 말하는 스마트 컨트랙트

컨트랙트 어카운트는 외부 소유 어카운트나 다른 컨트랙트 어카운트의 메시지를 받은 후

내부의 스마트 컨트랙트 코드를 실행한 후,

새로운 컨트랙트를 생성하거나 다른 메시지를 읽거나 보낸다

또한, 필요하면 내부 저장 공간에 데이터를 저장할 수도 있다

그러나 랜덤 넘버를 생성하거나 직접 운영체제를 조작하는 API를 호출하는 작업 등은 할 수 없다

오직 EOA나 다른 컨트랙트 보드에 의해서만 작동된다

즉 자기 자신이 직접 새로운 트랜잭션을 실행할 수는 없다

 

 

 

외부 소유 어카운트와 컨트랙트 어카운트

 


어카운트 구조

type Account struct {
	Nonce	uint64
    Balance	*big.Int
    Root	common.Hash
    CodeHash	[]byte //머클 패트리시아 트리의 루트 해시
}

어카운트 정보는 4개의 필드로 구성되어 있다

 

넌스

해당 어카운트로부터 보내진 트랜잭션의 수를 의미

0으로 시작한다

트랜잭션을 오직 한 번만 실행되게 할 때 사용할 수 있는 카운터

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

 

잔액

해당 어카운트의 이더 잔고

 

루트

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

참고로, 실제 어카운트의 저장소는 머클 패트리시아 트리에 저장된다

이 트리의 루트 노드를 암호 해시한 것이 바로 루트

암호 해시는 Keccak256 암호 해시를 사용한다

 

코드해시

해당 어카운트의 스마트 컨트랙트 바이트 코드의 해시

코드 해시값이 비어 있으면 해당 어카운트는 EOA이다

 

 


어카운트 생성

모든 이더리움 어카운트는 개인 키와 공개 키의 쌍으로 정의된다

개인 키와 공개 키를 비대칭 키라고 한다

이더리움은 비대칭 암호화 알고리즘으로 256비트 ECDSA를 사용한다

이더리움은 C언어로 작성된 비트코인의 ECDSA 라이브러리인 secp256k1을 GO언어로 래핑하여 사용한다

ECDSA 서명 암호화를 통해 얻은 256비트 공개 키를

다시 암호 해시 알고리즘 Keccak256을 사용하여 암호화하여 32바이트의 고정값을 생성하고

이 중 20바이트를 절삭하여 어카운트 주솟값으로 사용한다

 

ECDSA : 비대칭 암호 키의 생성 알고리즘

Keccak256 : 임의의 값을 암호화 한 후 고정 크기 값을 생성해 내는 암호 해시 함수

 

>> 어카운트 주소 = Keccak256(공개키(ECDSA(개인키)))

 

 

어카운트 주소생성

 

 

 


Account 패키지 : 어카운트 생성

일반적으로 말하는 이더리움 사용자 어카운트

사람이 직접 개인키로 관리

 

코드분석 👇🏻

 

2022.03.30 - [텃밭 1 : BlockChain/Go] - [Go] 이더리움 Account 패키지 : 어카운트 생성 코드 분석

 

[Go] 이더리움 Account 패키지 : 어카운트 생성 코드 분석

이더리움 Account 패키지 : 어카운트 생성 코드 분석 GitHub - potterpeter/core-ethereum-book-code-review: core ethereum book code review core ethereum book code review. Contribute to potterpete..

1parallelworlds.tistory.com

 

 

 

 


어카운트 상태

어카운트들이 모인 것을 이더리움에서는 상태라고 하고

이를 stateObject 구조체로 표현한다

어카운트에 접근하여 상태를 변경하려면 stateObject를 통해 접근한 후 상태를 변경할 수 있다

변경된 어카운트는 CommitTrie() 함수를 호출하여

변경된 Trie를 ethdb 패키지를 통해 levelDB에 업데이트한다

 

//go-ethereum/core/state/state_object.go / 66

type stateObject struct {
	address  common.Address
	addrHash common.Hash // hash of ethereum address of the account
	data     types.StateAccount
	db       *StateDB

	// DB error.
	// State objects are used by the consensus core and VM which are
	// unable to deal with database-level errors. Any error that occurs
	// during a database read is memoized here and will eventually be returned
	// by StateDB.Commit.
	dbErr error

	// Write caches.
	trie Trie // storage trie, which becomes non-nil on first access
	code Code // contract bytecode, which gets set when code is loaded

	originStorage  Storage // Storage cache of original entries to dedup rewrites, reset for every transaction
	pendingStorage Storage // Storage entries that need to be flushed to disk, at the end of an entire block
	dirtyStorage   Storage // Storage entries that have been modified in the current transaction execution
	fakeStorage    Storage // Fake storage which constructed by caller for debugging purpose.

	// Cache flags.
	// When an object is marked suicided it will be delete from the trie
	// during the "update" phase of the state transition.
	dirtyCode bool // true if the code was updated
	suicided  bool
	deleted   bool
}
Comments