// 에드센스

https://media.fastcampus.co.kr/insight/why-blockchain-is-hard/

이 카테고리는 Ground X에서 진행한 한양대학교 일반대학원 블록체인 융합학과 강의와 그 외의 참고자료를 보고 정리하는 곳입니다. 강의 동영상은 여기서 볼 수 있습니다.

 

너무 빈약한 지식이기에 이 글을 신뢰하지는 마세요.. 혹시 지나가시다가 잘못된 점 발견하시면 피드백 부탁드립니다.


1. 블록체인의 상태

 

블록체인은 트랜잭션으로 변화하는 상태 기계라고 할 수 있다.

  • 첫블록을 블록0이라고 했을때 이 블록은 초기값이 none이다.
  • 그리고 Changes(트랜잭션)가 일어나며 최종값이 정해진다.
  • 다음 블록1은 블록0의 최종값을 초기값으로 잡고 시작한다. 이 후로 쭉 이어진다.
  • 트랜잭션의 목적은 블록체인의 상태를 변경하는 것

 

 

어카운트(계정)

  • 상태는 어카운트라고 하는 오브젝트들로 구성돼 있다.
  • 각 오브젝트는 주소와 상태변화 내역을 가지고있다.
  • 어카운트는 EOA(External Owned Accounts)와 CA(Contract Account)로 구분된다.
  • EOA는 통상 사용자가 사용하는 어카운트다.

 

 

트랜잭션은 어카운트를 생성하거나 변경한다.

트랜잭션의 sender와 recipient가 있는데 recipient(받는이)가 누구냐에 따라서 트랜잭션의 목적이 나뉜다.

  • 기존에 존재하지 않던 주소로 트랜잭션을 발생시키면 새로운 컨트랙트 배포
  • 기존에 존재했던 주소로 트랜잭션을 발생시키면 보내면 그냥 토큰 교환.
  • CA주소로 트랜잭션을 발생시키면 컨트랙트 실행

 

 

 


2. 가스비

트랜잭션을 참여자들이 받고, 트랜잭션을 블록에 넣기 위해 검증, 실행, 블록으로 묶어서 저장을 해준다.

이 과정에서 비용이 발생한다.

  • 트랜잭션을 받기위해 네트워크를 열어놓는 비용
  • 트랜잭션을 받고 블록에 넣기까지 연산하는 비용
  • 블록으로 묶어서 저장하는 비용

이 비용은 sender가 부담한다. 토큰 보내는 사람이 수수료를 부담하는 그런 느낌.

이 가스비는 블록을 생성한 노드(트랜잭션 처리한 노드)가 수집한다.

 

 

즉, 트랜잭션을 처리하는데 필요한 자원(computing, power, storage)을 비용으로 전환한 것이 가스

 

 

이더리움은 소모되는 가스비를 미리 트랜잭션에 명시하는데 각 노드들은 이것을 보고 가스비가 높은 트랜잭션을 먼저 처리한다. 돈을 많이 준다니깐.

 

 

하지만 결국 하는 연산은 똑같기에 클레이튼은 가스비를 미리 명시하지 않도록 구현돼 있기에 사용자들끼리 경쟁을 하지 않고 선입선출식으로 트랜잭션을 처리하게 된다.

 

 

  • 노드(마이너)는 트랜잭션을 받는다.
  • 트랜잭션 속의 sender를 확인해서 sender의 어카운트에 유효한 만큼의 balance가 있는지 확인한다.
  • balance가 없으면 트랜잭션 거절
  • balance가 충분하면 트랜잭션을 체결(이때 가스비를 받는다)

 

 

 

 


3. 서명

내가 아닌 다른 사람이 나의 어카운트로 트랜잭션을 보내면 그 비용을 내가 지불해야하는 문제가 발생한다.

그렇기에 어느 특정 어카운트를 사용해서 트랜잭션을 발생시키려면 특정 어카운트로 검증할 수 있는 서명이 있어야한다. 트랜잭션은 항상 서명과 함께 움직인다.

 

 

비트코인

  • 공개키로 sender의 주소를 도출해서 sender를 확인.
  • 이걸로 서명도 검증
  • 증명 과정은 간단하지만 sender주소, sender의 공개키, sender의 서명 등 많은 정보를 트랜잭션에 담아야 하기에 비효율

 

 

이더리움

  • 트랜잭션에 sender의 주소 없이 서명만 넣는다.
  • 서명에서 공개키를 도출할 수 있는 어떤 함수가 있다.(노드가 할 수 있다)
  • 도출한 공개키로 만든 주소가 실존하면 검증완료.
  • 하지만 서명에서 공개키를 도출하는 과정에서 연산이 너무 많다. 느려짐.
  • 이게 이더리움이 성능 안좋다고 하는 이유의 3할 정도.

 

 

클레이튼

  • 이더리움 기반으로 만든 클레이튼은 공개키 도출 과정을 병렬화 시켜보았다. 연산량이 줄긴 줄었다.
  • 그래도 문제였기에 그냥 sender의 주소를 포함시켰다. 자세한 이유는 이후 강의에서 아라보자.

 

 

 


4. 트랜잭션

트랜잭션은 이런 구조를 가진다. 

{
    nonce: 1,
    from: '0xd5wef4gr5e4we1wx3e1rg5ce4w1wc3ce4w5a',
    to: '0x5e4f6w58df4e5461xcs21fed54e84x6qw5w1c2',
    value: 10
}
  • from과 to의 값은 내가 아무 텍스트를 입력한 것이다. 
  • 어카운트 기반 블록체인이 nonce값을 사용한다. 어카운트가 몇 번째 트랜잭션을 보냈는지 의미.

 

 

 

이더리움 트랜잭션은 다음과 같은 구조를 가진다.

{
    nonce: '0x01',
    gasPrice: '0x4a817c800',
    gas: '0x5208',
    value: '0xde0b6b3a764000',
    
    to: '0x3563535353535353535353535353535353535',
    v: '0x25',
    r: '0x4sd5f4ef4s2a4cd5dc3s1.......75735sdf7s35sa5',
    s: '0x4s85cs5dc45sc4s54dc2sd5.......sdc54sd5c4d5cs8'
}
  • from이 없다. 160비트 아끼기 위해
  • gas는 instruction을 몇개까지 실행하겠다. 라는 의미
  • gasPrice는 각 gas마다 얼마를 지불할지. 를 의미
  • gas x gasPrice는 총 가격이 나온다.
  • gas x gasPrice의 값 이상이 balance에 있어야 실행된다.
  • v,r,s는 전자서명 부분.

 

 

 

클레이튼 트랜잭션은 다음과 같은 구조를 가진다.

{
    type: 'VALUE_TRANSFER',
    nonce: '0x01',
    gasPrice: '0x4a817c800',
    gas: '0x5208',
    value: '0xde0b6b3a764000',
    
    to: '0x3563535353535353535353535353535353535',
    from: '0x5df4w5e4w6efe8fe1w3e2dwef512sd1f3s2g',
    
    v: '0x25',
    r: '0x4sd5f4ef4s2a4cd5dc3s1.......75735sdf7s35sa5',
    s: '0x4s85cs5dc45sc4s54dc2sd5.......sdc54sd5c4d5cs8'
}
  • 타입과 from이 생겼다.
  • to가 CA인지, EOA인지, 없는지에 따라 트랜잭션의 목적이 바뀐다고 위에 말했었는데,
  • type에 미리 트랜잭션의 목적을 명시해둔다.
  • gasPrice를 사용자가 바꿀 수 없다. (이더리움 트랜잭션 가스비의 1/10 미만)

 

 

 

 


5. 정리

사용자 -> Node

  • 사용자는 트랜잭션을 생성, 서명하여 Node(마이너)에게 전달
  • 이때 데이터 구조를 온전하게 전달하고자 RLP알고리즘으로 트랜잭션 직렬화
  • 사용자와 Node가 같은 프로토콜로 통신하는 것이 중요

 

Node -> 사용자

  • 올바른 트랜잭션 수신시 트랜잭션을 해시로 반환
  • 트랜잭션 체결 시 Receipt(영수증)반환(소요된 gas, 트랜잭션 해시, 인풋 등이 기록돼있다)

 

 

 

 

참고:

더보기

 

+ Recent posts