SW/블록체인

블록체인 : 이더리움의 데이터 계층 : 어카운트, 트랜잭션, 트랜잭션 리시트의 구성 요소

얇은생각 2022. 1. 31. 07:30
반응형

계정 생성

어카운트를 식별하는 어카운트 주소가 어떻게 만들어지는지 설명하겠습니다. 이더리움 클라이언트에서 어카운트 생성 명령어를 통해서 계정을 생성하면 20바이트의 Hex 값이 생성됩니다. 이것이 바로 생성한 어카운트를 가리키는 주소입니다. 주소가 생성되는 과정은 다음과 같습니다.

 

블록체인 : 이더리움의 데이터 계층 : 어카운트, 트랜잭션, 트랜잭션 리시트의 구성 요소 1

 

우선 랜덤으로 32byte의 개인 키를 생성합니다. 그리고 생성된 개인 키를 가지고 ECDSA를 통하여 64byte의 공개키를 생성합니다. 이 공개키를 가지고 Keccak256 해시함수를 실행하면 32byte의 해시값이 생성됩니다. 마지막으로, 생성된 해시값에서 뒤의 20바이트를 추출한 것이 어카운트의 주소가 됩니다.

트랜잭션은 한 외부 소유 어카운트에서 다른 어카운트나 스마트 컨트랙트에 보내는 데이터 구조입니다. 보통 다른 어카운트로 이더(Ether)를 전송하거나, 스마트 컨트랙트의 함수를 호출할 때 트랜잭션을 사용합니다. 뿐만 아니라 외부 소유 어카운트가 스마트 컨트랙트를 생성하여 이더리움에 브로드캐스팅할 때도 트랜잭션을 사용합니다.

앞에서 언급한 트랜잭션은 모두 발신자의 개인 키를 사용하여 전자 서명된 트랜잭션입니다. 트랜잭션의 발신자가 해당 트랜잭션이 다른 노드들에게 검증될 때 정당하다는 것을 입증하기 위해서 전자서명이 필요합니다.

 

블록체인 : 이더리움의 데이터 계층 : 어카운트, 트랜잭션, 트랜잭션 리시트의 구성 요소 2

 

트랜잭션 데이터에는 몇 가지 필드들이 있는데, 이에 대해서 설명하겠습니다. AccountNonce는 발신자로부터 보내진 트랜잭션의 수를 (0부터 시작) 나타내는 것입니다. Price는 트랜잭션의 발신자가 실행단계마다 마이너(실행자)에게 지급하게 될 비용이며, 일종의 수수료입니다.

GasLimit은 발신자가 자신이 보내는 트랜잭션이 처리되기 위해서 지급 가능한 최대 범위를 의미합니다. 실제로 트랜잭션의 실행 비용은 Price x GasLimit으로 계산됩니다.

 

블록체인 : 이더리움의 데이터 계층 : 어카운트, 트랜잭션, 트랜잭션 리시트의 구성 요소 3

 

Recipient는 트랜잭션의 수신자 주소를 의미합니다. 만약에 Nil로 수신자가 지정되지 않았다면, 컨트랙트 생성을 위한 트랜잭션임을 의미합니다. Amount는 발신자가 수신자에게 전송할 이더 금액 양을 나타냅니다. Payload는 스마트 컨트랙트의 함수를 호출할 때 함께 전송되는 파라미터가 될 수도 있고, 컨트랙트 생성을 위한 트랜잭션에서 실제 컨트랙트 바이트코드가 담기는 필드입니다.

V, R, S는 트랜잭션 발신자의 ECDSA 전자서명과 관련된 값입니다. 해당 그림은 외부 소유 어카운트(Externally Owned Account)에서 트랜잭션을, 컨트랙트 어카운트에서 메시지를 생성하는 것을 보여줍니다. 여기서 트랜잭션은 외부 소유 어카운트에 의해서 작동되며, 메시지는 내부 트랜잭션으로도 불리고 컨트랙트 어카운트에 의해서만 작동됩니다.

그림의 첫 번째는 EOA에서 다른 EOA로 보내는 트랜잭션입니다. 이 트랜잭션은 보내는 어카운트의 서명을 포함하고 있고, ETH를 전송하는 역할을 합니다. 두 번째와 세 번째 그림에서 EOA에서 CA로 보내는 트랜잭션은 EOA에 의해서 CA의 스마트 컨트랙트의 코드를 실행하는 역할을 합니다.

컨트랙트 어카운트에서 다른 컨트랙트 어카운트의 코드를 실행하기 위해서 메시지를 호출할 수 있습니다. 이때 토큰 전송, 새로운 토큰 발행, 새로운 컨트랙트 생성 등을 수행할 수 있습니다. 또한, CA에서 EOA로 메시지 호출을 하여 컨트랙트 어카운트에서 다른 어카운트로 송금하는 것도 가능합니다.

메시지 호출의 경우에는 서명이 필요하지 않습니다. 리시트는 트랜잭션 실행의 결과입니다. 이더리움은 트랜잭션을 처리하며 발생하는 로그를 리시트에 저장합니다. 마치 일상생활에서 거래 후 발생하는 영수증과 같은 용도입니다. 그래서 리시트에는 블록 내에 정상적으로 포함된 모든 트랜잭션에 대한 정보들이 저장됩니다.

리시트에 포함되는 필드들에 대해서 설명하겠습니다. PostState는 트랜잭션의 처리 후 상태 정보를 나타냅니다. Failed는 트랜잭션의 처리 후 실패 여부를 나타내며, 0x01이면 이상이 없다는 것을, 0x00이면 이상이 있음을 의미합니다. CumulativeGasUsed는 해당 리시트와 상응하는 트랜잭션을 포함하는 블록에서 현재까지 사용한 누적 가스 비용을 나타냅니다.

Bloom은 Logs에 저장된 로그들을 빠르게 검색하기 위한 블룸 필터입니다. Logs는 트랜잭션을 실행하면서 생성된 각종 로그들입니다. TxHash는 해당 리시트를 발생시킨 트랜잭션의 해시값입니다. 이 해시값은 트랜잭션을 식별하기 위해서 사용됩니다. ContractAddress는 만약 트랜잭션이 스마트 컨트랙트로부터 생성되었을 경우에 해당 스마트 컨트랙트의 주소를 의미합니다.

뿐만 아니라 외부 소유 어카운트에서 스마트 컨트랙트를 생성하기 위해서 발생시킨 트랜잭션인 경우에는 생성된 스마트 컨트랙트의 주소가 저장되어 있으며, 이것으로 해당 스마트 컨트랙트의 주소가 처음 보여지게 됩니다. GasUsed는 해당 트랜잭션을 처리하기 위해서 사용된 가스 비용입니다.

이더리움에서 각 어카운트가 상태 전이를 일으키는 트랜잭션들은 블록에 포함되어서 결과적으로 블록체인이라는 공유 원장에 저장되게 됩니다. 이더리움에서 블록체인은 비트코인과 상당히 흡사하며 블록들이 생성된 시간 순서대로 체인처럼 연결되어 있는 것을 말합니다.

여기서는 이더리움에서 블록을 구성하는 내용들에 대해 설명하겠습니다. 블록은 블록 헤더, 엉클 블록, 트랜잭션, 난이도 총합 등으로 구성되어 있습니다. 실제로 주요 정보들은 대부분 블록 헤더에 저장되어 있기 때문에 여기서는 블록 헤더에 구조체에 대해서 안의 필드를 살펴보겠습니다.

 

블록체인 : 이더리움의 데이터 계층 : 어카운트, 트랜잭션, 트랜잭션 리시트의 구성 요소 4

 

보시는 테이블은 블록헤더의 필드들을 나타낸 것입니다. 각 필드들의 설명을 읽어보시기를 바랍니다.

 

 

 

참조

http://www.kmooc.kr/courses/course-v1:POSTECHk+CSED490U1+2021_T1/about

 

블록체인 입문

블록체인과 암호화폐 기술을 깊이 배우기에 앞서, 비 전공자들도 이해를 할 수 있는 수준으로 블록체인과 암화화폐에 대한 high-level 설명 및 응용 예시를 제공하고 실제 상황에 적용할 수 있다.

www.kmooc.kr

반응형