본문 바로가기
블록체인 backEnd/backend

transaction 이해하기

by gun_poo 2023. 1. 15.

 

1. 트랜잭션 해시란

 Transaction Hash, TXID 는 해당 트랜잭션의 고유 ID 값을 의미한다. 

 

다른 블로그에서 거래소 예시를 드는것을 참조하자면 이렇다.

 

고객 A가 거래소의 지갑으로 100ETH를 보냈는데 거래소에서 반영이 안될 시 고객 A는 거래소에 전화해

자신이 보낸 트랜잭션 고유 ID를 말해주며  문의를한다. 거래소 측에서는 마찬가지로 트랜잭션의 고유 ID가 실제 네트워크에 존재하는지

확인하고 confrimation 횟수를 확인하여 언제쯤 입금처리가 되는지에 대해 말해 줄수 있다.

 

  • 고객이 트랜잭션 ID를 제시한다
  • 거래소가 트랜잭션 ID를 블록체인 네트워크에서 확인한다
  • 해당 트랜잭션의 confrimation 횟수를 확인 한 후 고객에게 답변해준다.
    • confrimation이 40을 넘겼을때 입금처리를 하기 때문에 조금 더 기다려야한다 라는 답변을 돌려준다

그렇다면 트랜잭션은 어떤 형태를 띄고 있는가? 

{ 
 from: "트랜잭션을 날리는 사람의 주소",
 to: "수신자",
 value: "보낼 금액",
 gasPrice: "지정 가스 가격",
 gasLimit: "가스 한도",
 data: "첨부할 데이터"
}

일종의 거래 영수증이라고 볼 수 있겠다. 모든 정보들이 담겨있다. 이러한 정보들을 고유 ID 값으로 만든 것이 트랜잭션 해시이다.

 

2. 트랜잭션 해시가 만들어지는 원리

 트랜잭션 해시가 만들어지는 원리는 두가지의 재료가 필요하다.

  • 트랜잭션 정보
  • 프라이빗 키

트랜잭션 정보는 위의 트랜잭션 형태가 정보이다. 

프라이빗 키가 필요한 이유는 트랜잭션 정보에 서명이란 것을 해야하기 때문인데, 서명을 할때 프라이빗 키가 필요하다.

 

why? 왜 서명을 하는가?

트랜잭션 정보의 from 란에 아무주소나 쓸수 있다면 다른 사람의 지갑에서 내지갑으로 코인을 보내버릴수 있는 대참사가 일어난다.

그러한 것을 방지하기 위해 " 이 트랜잭션은 내가 보낸 것이다 " 라는 보증을 해주는데 프라이빗 키를 사용한다.

 

프라이빗 키를 통해 트랜잭션 서명이 끝났다면 트랜잭션 정보와 서명을 블록체인 네트워크에 전송 할 수 있다.

 

web3.js에 글을 참조해보자면

const sign = web3.eth.signTransaction(tx, privateKey) : 서명하는 과정

signTransaction log data, 안에 rawTransaction, 트랜잭션해시값이 있다.

const rawTransaction = web3.eth.sendSignedTransaction(sign.rawTransaction) : 정보와 서명을 한 영수증을 네트워크에 전송

 

rawTransaction 은 트랜잭션 정보와 서명을 합친 것이다.

 

이 트랜잭션 정보와 서명을 합친 정보를 블록체인 네트워크를 구성하는 node에서 받게 되면 해당 트랜잭션의 고유 값, 트랜잭션 해시를 반환한다. 트랜잭션을 보낸 사람은 트랜잭션 해시를 이용해 블록체인 네트워크에서 해당 트랜잭션 상태를 볼 수 있다.

 

트랜잭션 정보와 서명을 합친(encoding) 것을 rawTransacion 이라고 부른다. 

대충 "0xf86c028501dcd6500082520894fe001e973e1cfce58e4c9ef073ca10a7dbbbaa7488c5f6453c3870846e801ba026948f5dd25456ada3c9df777455d695aee77bf1554b377aa3e2a6fb0d4084c1a07e92a2b0b131f1f1631bfcd0d534c25d6bb57008d5d9465fa7e3784ca8ce96be" 이렇게 생겼다.

 

이렇게 0x로 시작하는 16진수 기반의 값을 hex 값이라고 하는데 컴퓨터는 이 rawTransaction을 decode, 해석 해서 트랜잭션 정보가 무엇인지 서명이 어떤 것인지 알아낸다.

 

rawTransaction decode =>

[ ‘0x02’,

‘0x01dcd65000’,

‘0x5208’,

‘0xfe001e973e1cfce58e4c9ef073ca10a7dbbbaa74’,

‘0xc5f6453c3870846e’,

‘0x’,

‘0x1b’,

‘0x26948f5dd25456ada3c9df777455d695aee77bf1554b377aa3e2a6fb0d4084c1’,

‘0x7e92a2b0b131f1f1631bfcd0d534c25d6bb57008d5d9465fa7e3784ca8ce96be’ ]

이를 해석하면 

  1. nonce : 논스
  2. gasPrice : 가스 수수료
  3. gas : 가스 리밋
  4. to :  수신자
  5. value : 이더량
  6. data : 추가적으로 트랜잭션에 실어 보내는 데이터
  7. v : 서명과 관련된 값
  8. r: 서명과 관련된 값
  9. s: 서명과 관련된 값

하나 하나의 값들이 모두 rawTransaction에 포함되어 있는 재밌는 사실을 알 수 있다.

‘0xf86c028501dcd6500082520894fe001e973e1cfce58e4c9ef073ca10a7dbbbaa7488c5f6453c3870846e801ba026948f5dd25456ada3c9df777455d695aee77bf1554b377aa3e2a6fb0d4084c1a07e92a2b0b131f1f1631bfcd0d534c25d6bb57008d5d9465fa7e3784ca8ce96be

 

rawTransaction => keccak256

rawTransaction을 keccak256으로 돌려주면 나오는 값이 트랜잭션 해시 값이다.

rawTransaction을 굳이 이더리움 체인에 전송하지 않아도 트랜잭션해시값이 어떻게 나올지 미리 알 수 있다.

 

위에서 말한 web3.eth.signTransaction을 사용하면 반환되는 데이터에 rawTransaction이 나온다.

 

다음 글에서 vrs와 관련된 서명에 관해 정리를 해보자.

'블록체인 backEnd > backend' 카테고리의 다른 글

트랜잭션 서명 이해하기  (1) 2023.01.15

댓글