이더리움 창시자:비탈릭 부테린
비트코인의 보완을 좀 더 신경쓴거 같은 느낌
내용을 보면 비트코인과 크게 다른점이 있는데
과거에 비트코인과 비슷하게 암호화폐를 만들려고 시도는 했는데
중앙화된 데이터 의존,조명을 받기 힘들었고
탈 중앙화 개념을 제안한걸 계속 시도했고 번번히 실패를 하다가
사토시 나카모토가 합의 알고리즘(POW)의 사용으로 탈중앙화를 실현 시켰다.
비탈릭 부테인은 작업증명의 2가지 문제를 동시에 해결했다고 한다.
- 아주 간단하며 효과가 좋은 합의 알고리즘 제공
- 누구나 합의 프로세스에 참여할 수 있다.
이후에 지분 증명(POS) 라는 새로운 방식의 합의 알고리즘이 등장
각 노드가 가진 계산 능력을 통해서 nonce를 증가시켜 Hash를 찾기
화폐의 보유량에 따라 각 노드의 결정된 정도를 계산하는 것
결국 이더리움은 지분 증명을 선택했다.
누구나 합의 프로세스에 참여를 할 수 있는데 컴퓨팅 파워가 많이 올라가다보니 채굴에 급급한 마이너들이 그룹을 만들어서 자기들끼리 보상을 나누어 먹는 형태를 만들었고
그 그룹이 거대해지면 결국 중앙화가 되는 것이 아니냐라는 말이 나올 정도
이러한 이유로 이더리움은 POW에서 POS로 변경되었다.
이더리움 백서에서는 비트코인의 트랜잭션을 상태변환 시스템이라고 말하고 있다.
비트코인의 트랜잭션은 UTXO인데 이더리움은 트랜잭션 내용을 상태 처리라고 하고 있다.
상태에 대해 간단히 설명하면 다음과 같다.
쇼핑몰을 만들었는데 상품을 구매하는 프로세스에서 상품의 현재 상태를 나타낼 테이블을 만들었다.
상품 테이블에 주문이라는 상태가 있고
주문을 접수하는 상태 => 결제 확인 상태 => 상품을 준비 => 발송=> 배송 완료=>상품 수령
UTXO도 마찬가지로 동작된다.
UTXO => Transaction => UTXO (상태 전환)
비트코인이 정말 낮은 수준의 스마트 컨트랙트는 존재하는데 비탈릭 부테렌은 서명에 관련된 로직을 스마트 컨트랙트라는 시점으로 바라보고 있다.
비트코인은 UTXO는 공개키 만으로 해당 계정의 잔액을 조회할 수 있는데 단순히 스택의 기반으로 프로그래밍 언어로 표현되어있다.
토이 비트코인을 만들면서 한명의 서명을 만들어 트랜잭션 생성 처리를 했는데
비트코인에서 2,3개의 개인키를 가지고 서명을 만들어서 검증을 할 수 있도록 간단한 스크립팅을 작성할 수 있다.
이걸 실제로 사용한 플랫폼이 없다.(어렵고,실용성이 없다)
그래서 이더리움은 이내용을 스마트 컨트랙트 개념으로 보고 있다.
문제점
이더리움의 목적은 분산 어플리케이션 제작을 위한 대체 프로토콜
이더리움을 짧게 문장으로 서술 했을 때
이렇게 생산하는 이유는
- 비트코인을 가지고 예금,보험 및 금융상품에 대한 것을 구현할 수가 없다.(이자 구현x)
- 사이트 및 게임에 적용하기 힘든 부분들이 많다.(상품 및 게임 아이템 매칭 x)
- 비트코인은 결제에 포커스가 맞춰져있고 결제에 대한 부분만 처리르 하고 있기 때문에
- 이자의 부분은 따로 구현을 해서 처리를 해야한다.
하지만 이더리움은 이부분을 보완해서, 이더리움이라는 플랫폼을 만든것.
적은 시간으로 탈중앙화를 사용해서 데이터를 저장하는 사이트,혹은 게임을 만들 수 있게 되었다.
우리는 이것을 DApp이라 부른다.
탈중앙화랑 통신을 할 수 있는 프로토콜을 유저가 쉽게 구현할 수 있도록 도와준다.
탈중앙화에 데이터를 저장할 수 있다. === 스마트 컨트랙트
그로인해 비트코인의 UTXO형식적인 데이터가 아닌 상태를... 즉 변화를 만들어서 다양한 데이터를 저장하고 사용할 수 있도록 트랜잭션의 구조를 완전히 바꾼것
interface Account {
nonce: number; // 트랜잭션의 회수 카운터(이중지불 방지 용도)
balance: string; // 이더리움 잔액
storageRoot: string; //account의 상태 저장 공간 초기는 비어있다.
codeHash: string; //스마트컨트랙트 계약의 코드
}
interface Account {
nonce: number; // 트랜잭션의 회수 카운터(이중지불 방지 용도)
balance: string; // 이더리움 잔액
storageRoot: string; //사용 x.
codeHash: string; //사용 x
}
CA계정은 Account 객체구조에 있는 모든 속성을 사용한다.
나중에 스마트 컨트랙트 코드를 solidity로 작성할 것이다.
pragma solidity ^0.8.0
constract testContract{
uint256 value; //상태 변수 선언
function setValue(uint256 newValue)public{
value=newValue; //상태 변수를 변경
}
function getValue() public view returns(uint256){
return value; //상태변수 조회
}
}
이 때 codehash들은 코드를 컴파일해서 결과를 저장한다.
stroageRoot에는 value 상태 변수를 키와 값의 형태로 데이터 저장을 한다.
그리고 CA는 메시지를 발생시킬 수 없다.
왜냐하면 개인키가 존재하지 않는다.
CA는 어떻게 사용하는 거냐?
Message라는 것을 받으면 CA가 자신의 코드를 활성화 시키고
Message가 어떤 값인자를 보고
읽거나 상태변수의 내용을 변경하게 된다. or Message를 보낼수 있게 된다.
이더리움에서 서명이 있는 영수증 트랜잭션이라고 말하고
서명이 없는 영수증은 message라고 말한다.
EOA => Transaction
CA=> Message
interface Message {
from: string; //메시지를 보내는 어카운트의 주소
to:string //메시지를 받는 어카운트 or 주소
gas:number //메시지를 처리하기위해 사용할 가스의 양
gasPrice:number // 가스당의 가격
value:number //메시지와 함계 전송할 이더 양
data:string//메시지 데이터
nonce:number // 메시지를 전송한 어카운트의 nonce값
}
interface Transaction extends Message{
v:number // 서명 v값
r:number // 서명 r값
s:number // 서명 s값
}
이더리움과 비트코인의 차이를 트랜잭션 실습을 통해 알아보았다. UTXO가 어떻게 작동되고 이더리움에선 왜 이 방법을 사용하지 않는지 코드로 이해하니 수월했다. 특히 interface구조를 통해 트랜잭션과 메시지의 키값을 이해함으로서 스마트 컨트랙트가 어떻게 작동되고 무엇을 필요로 하는지 알 수 있었다.