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) : 서명하는 과정
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’ ]
이를 해석하면
- nonce : 논스
- gasPrice : 가스 수수료
- gas : 가스 리밋
- to : 수신자
- value : 이더량
- data : 추가적으로 트랜잭션에 실어 보내는 데이터
- v : 서명과 관련된 값
- r: 서명과 관련된 값
- s: 서명과 관련된 값
하나 하나의 값들이 모두 rawTransaction에 포함되어 있는 재밌는 사실을 알 수 있다.
‘0xf86c028501dcd6500082520894fe001e973e1cfce58e4c9ef073ca10a7dbbbaa7488c5f6453c3870846e801ba026948f5dd25456ada3c9df777455d695aee77bf1554b377aa3e2a6fb0d4084c1a07e92a2b0b131f1f1631bfcd0d534c25d6bb57008d5d9465fa7e3784ca8ce96be’
rawTransaction => keccak256
rawTransaction을 keccak256으로 돌려주면 나오는 값이 트랜잭션 해시 값이다.
rawTransaction을 굳이 이더리움 체인에 전송하지 않아도 트랜잭션해시값이 어떻게 나올지 미리 알 수 있다.
위에서 말한 web3.eth.signTransaction을 사용하면 반환되는 데이터에 rawTransaction이 나온다.
다음 글에서 vrs와 관련된 서명에 관해 정리를 해보자.
'블록체인 backEnd > backend' 카테고리의 다른 글
트랜잭션 서명 이해하기 (1) | 2023.01.15 |
---|
댓글