[Blockchain] Transaction

장성호·2022년 7월 3일
4

[Blockchain]

목록 보기
5/7

위 그림은 이더리움에서 거래가 이루어지기까지의 과정을 요약한 것이다. 이걸 모두 이해하는 걸 목표로 하자.

되돌아가기란 없다.

위 그림을 잘 살펴보면 화살표가 모두 단방향이어서, 뒤로 되돌아갈 수 없다. 정확히는 모든 경우의 수를 다 검증해야 하기 때문에, 되돌아가기가 굉장히 어렵다. 블록체인에서의 거래는 모든 정보가 공개되지만, 이 정보를 가지고 개인의 정보를 아는 것이 불가능에 가깝다. 이를 통해서 블록체인의 진실성을 보증하는 것이다. 각 단계에서 되돌아가는 것을 어떻게 방지했는지, 위 그림에서 순서대로 살펴보자.

트랜잭션

https://web3js.readthedocs.io/en/v1.7.4/web3-eth.html#signtransaction

주소는 web3js라는 이더리움 네트워크에서 계획에 따라 트랜잭션을 다룰 수 있는 라이브러리의 공식 문서 중, signtransaction에 대한 내용이다. web3-hss, web3-eth와 같은 라이브러리도 존재한다. 해당 문서에 접속해보면 다음과 같은 설명이 있을 것이다.

Document

위 문서에서 web.eth.signTransaction()을 누르면 transactionObject라는 것에 포함된 정보들에 대해서 더 자세히 알 수 있다. 다양한 정보들이 나올텐데, 관심있게 볼 것은 다음과 같다.

from : 이더리움을 보낸 사람의 지갑 주소(공개키)
to : 이더리움을 받은 사람의 지갑 주소(공개키)
value : 이더리움의 양
gas : 트랜잭션 수수료로 사용된 가스
gasPrice : 가스의 개당 가격 (wei / gas)
data : 스마트 계약을 위한 ABI Byte string
nonce : Replay attack을 피하기 위한 정수, 트랜잭션 발생 시마다 증가

이러한 정보들을 포함하여 transactionObject를 만들고 signTransaction을 사용하면 다음과 같은 출력이 나올 것이다. 여기서 v, r, s라는 출력은 중요하므로 기억하자. 이 세 파라미터를 통해 악성 트랜잭션이 아님을 증명한다.

Example

web3.eth.signTransaction({
    from: "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0",
    gasPrice: "20000000000",
    gas: "21000",
    to: '0x3535353535353535353535353535353535353535',
    value: "1000000000000000000",
    data: ""
}).then(console.log);
> {
    raw: '0xf86c808504a817c800825208943535353535353535353535353535353535353535880de0b6b3a76400008025a04f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88da07e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0',
    tx: {
        nonce: '0x0',
        gasPrice: '0x4a817c800',
        gas: '0x5208',
        to: '0x3535353535353535353535353535353535353535',
        value: '0xde0b6b3a7640000',
        input: '0x',
        v: '0x25',
        r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d',
        s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0',
        hash: '0xda3be87732110de6c1354c83770aae630ede9ac308d9f7b399ecfba23d923384'
    }
}

서명

다음 사진은 테스트 이더리움을 보내면서 생성한 트랜잭션이다.

여기서 From, To, Value가 블록체인의 진정성 검증에 중요하게 작용한다. 그렇다면 블록체인은 생성된 트랜잭션이 악성인지 아닌지를 어떻게 판단할까? 'From'이라는 지갑에서 'To'라는 지갑으로 'Value'만큼의 이더리움을 보내는 것이 어떻게 허용되는 것일까? 제일 처음에 보았던 그림과 이 트랜잭션을 연결지어서 다시 그려보자.

먼저 Private Key - Public Key - Ethereum Account 간의 관계부터 살펴보자. 블록체인 노드 어딘가에 보관되어 있을 Private key가 있고, 타원곡선 디지털서명 알고리즘(ECDSA; Elliptic Curve Digital Signature Algorithm)을 통해 Public key를 만들어낸다. 잠깐 간단히 소개하자면 ECDSA 서명과 검증이라는 두 가지 과정으로 이루어져있다.

  1. ECDSA 서명에서는 서명하고자 하는 메시지와 개인키를 통해 서명요소 쌍 (r, s)를 만들어낸다.
  2. ECDSA 검증은 메시지와 서명 (r, s)를 받아들여 공개키로 메시지에 대한 서명이 맞는지 검사하는데, 이 때 v가 r과 동일하면 맞는 서명이다.어려운 내용이 되었지만 요약하자면 위에서 살펴본 v, r, s라는 출력은 이러한 과정에서 필요한 것이다.

Private key와 Public key는 일반 사용자가 알기는 어렵고, 이들은 블록체인 노드에 보관되어 있다. 우리가 메타마스크에서 볼 수 있는 지갑 주소는 Public key의 마지막 20바이트를 Keccak Hash를 통해 만든 것을 보고 있는 것이다.

한편 Transaction은 위에서 살펴본 바와 같이 transactionObject로 구성되어 있다. 여기에 Private key로 ECDSA 서명을 접목하면 Signed transaction이 등장한다. r, s는 ECRECOVER라는 함수를 통해 작동시킬 수 있고, 공개키와 이더리움 계정을 출력할 것이다.

어렵다... 어려워!

Keccak Hash, ECDSA라는 암호화 알고리즘이 2개나 등장하면서 어려운 내용이 되었다. 다시 한 번 정리해보자.

  1. Private Key를 통해 Public key와 Ethereum account를 만들 수 있다.
  2. Transaction과 함께 하면 서명이라는 것을 할 수 있다.
  3. Signed Transaction은 v, r, s라는 것을 통해 Public key와 Ethereum account를 만들 수 있다.
  4. 결과적으로 Signed Transaction을 만들기 위한 Private key를 가진 Ethereum account와 같다는 것을 보장한다.
  5. Transaction이 옳다는 것을 보장할 수 있다.
  6. 이러한 일련의 과정이 옳다는 것을 보장할 수 있는 것은 오직 Private key이다.
  7. 이 과정을 역순으로 연산하는 것은 모든 경우의 수를 테스트해야 하기 때문에 사실상 불가능하다.
profile
일벌리기 좋아하는 사람

2개의 댓글

comment-user-thumbnail
2022년 7월 7일

선생님 너무어려워요

1개의 답글