Transactions
트랜잭션은 account로부터 sign된 암호화된 명령어이다.
계좌는 이더리움 네트워크의 상태를 update하기 위해 transaction을 발생시킨다.
즉 계좌이체를 하거나, 계좌로 contract account에 있는 스마트 컨트랙트를 실행하여 네트워크의 상태를 변경시키위해 transcaction을 발생시키는 데, 이는 암호화되었다는 뜻
가장 간단한 transaction은 한 계좌에서 다른 계좌로 ETH를 전송하는 것이다.
이더리움 트랜잭션은 externally-owned account(즉 컴퓨터가 아닌 사람이 관리하는 계정)에 의하여 발생한다. A가 B에게 1ETH를 보내는 트랜잭션의 경우, A에서 1ETH를 차감하고, B에게 1ETH를 증가시키는 행동은 트랜잭션 내부에서 일어난다.
트랜잭션으로 인하여, EVM의 상태가 변화하며, 이러한 변화는 전체 네트워크로 뿌려져야 한다.
특정 노드가 EVM에 의하여 실행되어 지길 바라는 트랜잭션에 대한 요청을 뿌리면, 이를 받은 validator는 transaction을 실행하여 상태변화를 반영시키고, 네트워크에 뿌린다.
# 참고로 여기서 validator란 비트코인에서 miner의 역할
즉 트랜잭션은 validated block(검증된 블럭)에 포함되어야 의미를 갖는다.
트랜잭션이 가져야할 정보
- from: sender의 주소, 이는 즉 EOA의 주소
- recipient: 받는 사람 주소, 참고로 주소가 EOA이면 value를 전송하며, contract account이면 contract code를 실행한다.
- signature: sender가 이 트랜잭션에 private key로 서명한 것이며, 이는 즉 sender에게 권한이 있음을 의미한다.
- nonce: 계좌의 트랜잭션 숫자를 의미
- value: sender가 recipient에게 보낼 금액 wei로 명시된다.
- input data: 데이터(코드 매개변수등)를 포함하기 위한 optinal한 필드이다.
- gasLimit: 트랜잭션에 의해 소모될 수있는 최대 gas 양을 의미. 참고로 EVM은 각 computational step마다 요구하는 gas를 명시해놨다.
- maxPrioirityFeePerGas: validator에게 줄 팁의 최대 양, 이를 통해 validator는 자신의 블록에 트랜잭션을 포함할 지 결정한다.
- maxFeePerGas:사용자가 지불할 수 있는 최대 gas량(baseFeePerGas와 maxPriorityFeePerGas를 포함한다.) 예를 들어 maxFeePerGas = baseFeePerGas * 2 + maxPriorityFeePerGas 등으로 계산된다. 이건 지불할 의사가 있는 최대 가스당 수수료이기 때문에, *2를 한 이유는 이렇게 적어도, 사용하고 남은 부분은 환불되기 때문에 넉넉히 적는 것이다.
# 참고로 baseFeePerGas라는 것도 있는데, 이는 gas당 기본적으로 소모되는 비용, 이는 누구한테도 전달되지 않고, 그냥 소모되는 금액, 또한 이 비용은 네트워크 혼잡도 알고리즘에 통해 결정된다.
참고로 여기서 gas란, 모든 transaction은 computation을 발생시키고, 이거에 대한 비용이 gas이다. 또한 gas는 비트코인과 다른 단위를 사용하며, 다른 단위를 사용하는 이유는 transaction비용에 대한 안정성을 확보하기 위해서 이다.
만약 user가 명시한 gas의 최대치 이하로 사용되었다면, 나머지는 환불된다.
참고로 여기서 gasLimit는 모든 비용을 포함하여 최대로 사용될 수 있는 gas의 양을 의미한다.
Ethereum Gas and Payment
만약 트랜잭션이 허용하는 최대 가스를 넘어갔다면(out of gas), 진행되던 프로세스는 종료되고, 변경되던 state는 변경되기 이전으로 돌아간다. 사용된 가스는 refund되지 않는다.
참고로 storage에 대한 fee도 존재한다. 이는 32byte의 정수비에 따라 fee가 청구된다.
이렇게 gas를 설정해 놓는 이유
- 전체 네트워크는 computation과 storage에 대한 부담을 가져야하므로, 특정 유저가 network를 과도하게 소모하는 것을 막아야 한다.
- 또한 Ethereum은 turing complete하므로 halting problem을 내제한다. 따라서 gas를 설정함으로써 무한루프를 방지할 수 있다.
Gas 계산
만약 특정 트랜잭션이 21000 units을 필요로 하며, baseFeePerGas는 190gwei이고, maxPriorityFeePerGas는 10gwei일 경우
(190 + 10) * 21000 = 4200000 gwei 가 총 소모되는 gas 비용이며
이 중 190 * 21000는 사라지는 비용
10 * 21000은 validator한테 가는 금액이다.
Ehereum Transactions and Messages
이더리움에는 두가지 종류의 transaction이 있다.
- message calls: 기존의 스마트 컨트랙트를 invoke하는 transaction
- contract creations: 이더리움 블록체인에 새로운 스마트 컨트랙트를 올리고 싶을 때
또한 eoa가 특정 스마트 컨트랙트를 transaction으로 깨웠을 때, 스마트 컨트랙트는 internal transaction을 통해 다른 스마트 컨트랙트를 깨울 수 있다.
Contract related transaction(스마트컨트랙트와 관련된 transaction)
여기에는 두 가지 방법의 transaction이 존재한다.
- contract deployment transactions: 즉 새로운 스마트 컨트랙트를 만들겠다는 trnasaction이고, 즉 목적지가 없으므로 to는 헥사 0을 기입한다.
- execution of a contract: 이는 스마트 컨트랙트를 실행하겠다는 트랜잭션이므로 to필드에 컨트랙트 주소를 기입한다.Transaction lifecycle트랜잭션이 제출된다면 아래와 같은 과정을 거친다
- transaction hash가 발생된다. 이는 트랜잭션에 대한 고유한 식별자로 사용된다.
- 트랜잭션은 네트워크로 뿌려져서, 대기중인 트랜잭션의 집합인 transaction pool에 추가된다.
- 여러 노드중에 선택된 노드(validator)는 여러 트랜잭션 중 자신이 만드는 block에 포함될 transaction을 선택하여, 블록에 추가한다.
- 이렇게 블록에 포함된 트랜잭션들은 블록체인에 포함되기 전에 실행되며, 이 과정에서 상태를 변경시키거나, 계산을 실행한다.
- 새롭게 생성된 블록은 블록체인에 포함되며 시간이 지날 수록 블록은 justified되며 finalized된다. 즉 transaction이 성공적으로 실행되었고, 그로 인한 결과가 반영되었다는 뜻Blocks블럭은 여러 transaction을 포함하며, 블록체인 이전 블럭에 대한 hash값을 가지고 있어, 누군가가 악의적으로 데이터를 변경시킨다해도, 그럼 hash값이 바뀌어 사기를 알아낼 수 있다.
블럭의 특징
- 블록을 사용함으로써 그 안에 있는 여러 트랜잭션을 묶어, 여러 노드들이 타당한 트랜잭션에 대한 판단을 원활하게 한다.
- 또한 블록은 간격을 두어(12초에 한번씩) 생성되게 함으로써 노드들이 합의에 도달하는 시간을 확보한다.How Blocks Works?
- 트랜잭션의 history를 보존하기 위해서는 블록의 순서가 유지되어야 하며, 블록안의 transaction의 순서도 유지되어야 한다.
- 만약 랜덤하게 선택된 validator에 의하여 block이 블록체인에 포함된다면 모든 노드들은 기존 블록체인에 새로운 블록을 포함시키고, 새롭게 선택된 validator는 다음 블럭을 생성한다.
- 이렇게 블럭을 구성하고, commitment/consensus하는 process에 관해서는 이더리움의 proof-of-stake protocol에 기재되어 있다.
Proof of Stake protocol
- validater가 되기 위해서는 deposit contract로 32 ETHER를 보내야 한다. 이는 혹시라도 validater가 나쁜 행동을 했을 경우, 32 ETHER중 일부 혹은 전부를 압수하여, 나쁜 행동을 하지 못하도록 하기 위해서 이다.
- 매 slot(12초)마다 한 명의 validator가 block proposer로 선정되어, 블록을 생성한다. 그럼 block proposer는 transaction을 묶으며, 그것들을 실행시켜 새로운 state를 결정한다. 이렇게 만들어진 정보를 block에 포함시켜 주변 validator에게 뿌린다.
- validator들이 새로운 노드에 대해 알게 된다면, transaction들을 실행시켜서 새로운 state가 맞는 지 판단하며, 맞다고 판단되면 validator는 자신의 database에 block을 포함시킨다.
- 만약 validator가 두개의 충돌하는 block에 대해 알게 된다면 다수의 의견을 따르는 fork-choice algorithm을 사용하여 결정한다.
Block's Structure
가장 높은 layer에서 블럭은 아래와 같이 구성되어 있다.
- slot: 그 블록이 해당되는 슬롯
- proposer_index: 블록을 제안한 proposer의 id
- parent_root: 앞에 있는 block에 대한 hash값
- state_root: state object의 root 해시값(머클 패트리샤 트리의 root 해시값)
- body: 여러 정보가 들어 있다.
block body가 포함하는 field
이 중에서 몇 개만 설명하자면
- attestations: 어떤 블록이 타당한지 투표하게 하는 것(즉 충돌하는 블럭들중 어떤 블록이 타당한지를 validator가 투표해서 결정한다.)
- porposer_slashings: 벌칙을 받은 validator 리스트Block Timeblock time이란 블록들을 12초 단위 slot으로 나눈 것
때때로 선택받은 validator가 offline 상태일 수도 있다. 이럴 경우에는 추가되는 블럭이 없다.
비트코인에서 proof-of-work는 난도 조절을 통해, 블록이 생성되는 주기가 확률적으로 결정되었지만, 이더리움에서 proof-of-stake는 정확히 12초 간격으로 생성된다.
Block size
각각의 블럭 사이즈는 제한되어 있다. 다만 물리적인 트랜잭션의 크기로 제한하는 것이 아니다.
즉 이더리움에서 블럭은 15 million gas 사이즈로 제한을 두며, 네트워크의 요구에 따라 30 million gas까지 늘어나고 줄어들 수 있다.
즉 블록에 포함된 트랜잭션의 전체 gas amount는 block gas limit보다 작아야 한다.
이렇게 정한 이유는 블록이 너무 크면 컴퓨팅 파워가 낮은 노드들은 네트워크를 따라갈 수 없기에.
'블록체인' 카테고리의 다른 글
[블록체인] 이더리움-consensus (1) | 2023.12.17 |
---|---|
[블록체인] 이더리움, smart contract와 탈중앙화 애플리케이션 (1) | 2023.12.17 |
[블록체인] 이더리움-account (0) | 2023.12.17 |
[블록체인] 이더리움이란? (1) | 2023.12.17 |
[블록체인] 라이트닝 네트워크와 비트코인 비교 (1) | 2023.12.17 |