본문 바로가기
학교 공부/블록체인

[Ethereum] Transaction이란?

by 그적 2021. 6. 3.

Transaction이란?

: 일반적인 데이터에 transaction 생성자의 전자서명이 담긴 메시지라고 생각하면 쉽게 이해할 수 있다. EOA에 의해서 생성되기 때문에 private key를 가지지 않는 smart contract에서는 transaction을 만들지 못한다.

 

 

Transaction 구조

- Nonce : replay attack을 막기 위한 용도로, 하나의 account가 있을 때 몇 개의 transaction을 전송했는지 의미함.

- Gas price : 가스 하나의 가격(wei 단위)

- Gas limit : 최대 가스 소모량

- Recipient : target account

- Value : 얼마의 이더를 송금할 것인가?

- Data : contract 코드의 실행을 위한 필드

- v, r, s : 전자서명 서명 값(ECDSA 알고리즘)

 

 

Nonce란?

: 하나의 account에서 몇 개의 transaction을 전송했는지를 알 수 있으며, 성공된 transaction 개수만 카운트된다. (wallet에서 관리)

 

** nonce에 관한 이슈가 존재한다. 첫 번째로, 하나의 account를 하나의 wallet에서만 관리한다면?

짧은 시간에 여러 개의 transaction이 생성될 때 nonce 2번에서 문제가 발생할 경우, 정상적인 transaction 3, 4, 5 또한 처리되지 않고 보류 상태를 가지게 된다. 심각한 문제를 일으킬 정도는 아니나, 불편함을 가질 수 있다.

 

** 두 번째는, 하나의 account를 여러 개의 wallet에서 관리한다면?

주로 거래소 wallet들이 이러한 케이스일 수 있다. 하지만 동시에 transaction이 만들어지다 보면 중복되거나 차이가 발생하는 nonce가 생길 수도 있다. 현재는 하루 단위로 account를 rebalancing 하는 간헐적 방식을 취하고 있다.

 

 

Recipient란?

: target account로, 따로 체크하는 방법은 존재하지 않는다. 악의적인 사용자가 고의로 존재하지 않는 계정으로 target을 잡으면 ether를 burning 하게 되고, 방해하는 목적을 가지기도 한다.

 

Value와 Data란?

- value만 가질 경우 : EOA간의 ether를 전송하는 transction

  (case 1) EOA -> EOA , 새로 생긴 transaction이거나 state가 변경되었다는 내용의 transaction

  (case 2) EOA -> contract address, function 함수를 실행하거나 빈 callback함수를 실행하는 transaction

- data만 가질 경우 :  smart contract

                            대부분의 경우 contract adress 값이 들어가지만, 특정한 EOA address가 들어갈 수 있다.

                            payload 구성은 Function selector + Function arguments로 구성된다.

       ** function selector : 어떤 function을 호출하는지

       ** function arguments : withdraw_amount들이 인코딩 되어 맨 뒤 serialized 된 hex값이 나옴.

- value와 data 모두 가질 경우 : transaction과 smart contract이 동시에 이뤄짐.

- value와 data 모두 가지지 않을 경우 : 가능은 함.

 

 

 

** transaction에서 전자서명을 하는 이유 : 본인 인증 용도

 타원 곡선 상의 전자서명 알고리즘 중 하나인 ECDSA 알고리즘을 사용하는데 간단하게 과정을 이야기하면, 생성한 transaction에 대해 rip encoding을 한 다음, keccak256 hash를 돌리고 해시 값 자체에 대해 ECDSA 서명을 해준다.

이 과정 중에 chainID가 필요한데, chainID는 testnet에서 쓰인 transaction이 mainnet에서 사용되는 reply attack을 막기 위해서임.

댓글