이더리움은 2013년에 비탈릭 부테린이 만든 블록체인 프로젝트이다.
이더리움의 목표는 탈중앙화된 어플리케이션(dAPP)을 만드는 플랫폼이 되는 것이 목표였다.
(하지만 부테린의 영향력이 세서 오히려 탈중앙화에 방해가 되고 있다고..)
보통의 어플리케이션은 서버-클라이언트 구조로 되어있지만,
이더리움의 목표는 중앙화된 서버가 없는 어플리케이션을 위한 플랫폼이 되는 것이다.
더 정확히는 이더리움은 smart contract 라는 코드 (일종의 함수)를 실행하는 플랫폼이다.
비트코인에서도 제한적으로 스크립트 실행을 허용했지만, 이더리움은 그보다 제한을 더 풀어서 어떠한 코드도 실행이 될 수 있다.
이때 코드의 실행이 전세계에서 분산되어 일어나므로, 일종의 글로벌 컴퓨터와 같이 동작한다.
그리고 코드의 실행 결과는 컨센서스를 이루게 된다.
이더리움은 튜링머신과 같기 때문에, 특정 상태에서 특정 인풋을 넣어 실행한 결과는 항상 같다.
트랜잭션을 실행하고나면 상태가 바뀌기 때문에 state transaction machine 이라고도 표현한다.
그리고 실행 결과는 블록체인 네트워크에 저장한다.
이더리움에도 crypto currency 가 있으며, '이더' 라고 부르는 자체 화폐가 사용된다.
그리고 비트코인처럼 코인을 전송하는 트랜잭션이 존재한다.
이때 이더리움에서는 이 트랜잭션을 통해 이더리움 네트워크에 존재하는 어떤 코드 (smart contract) 를 invoke 시켜서 실행할 수 있다.
이더리움과 비트코인을 비교해보면,
둘 다 P2P 네트워크 기반이므로 자유롭게 참여하거나 떠날 수 있다.
또한 각자 자체 화폐를 갖고 있으며, 디지털 서명과 해시같은 암호화 기술을 사용한다는 공통점이 있다.
이더리움과 비트코인의 차이점은 그 목적에 있다.
비트코인의 주 목적은 payment 이지만, 이더리움의 주 목적은 payment 보다는 smart contract 의 실행에 있다.
(이더를 지불하는데 물론 사용될 수도 있다.)
또는 내가 smart contract 를 만들어서 이더리움 네트워크에 올리고, 이를 실행할 때마다 수수료를 받는 비즈니스 모델을 설계할 수도 있다.
또한 비트코인도 일종의 상태 기계이긴 하지만, 상태의 변화는 코인을 가지고 있는 소유주의 변화로 인해 발생하지만, 이더리움은 그보다 더 넓은 개념에서 상태의 변화가 일어난다.
이더리움에서 실행할 수 있는 코드는 비트코인과 달리 turing-complete 하므로, 반복문과 같은 기능도 넣을 수 있다.
보통은 solidity 라는 것을 사용하여 이더리움에 들어갈 smart contract를 작성한다.
이더리움은 이때 플랫폼으로서 모든 코드를 다 작성하지 않아도 되도록, 여러 기본적인 코드를 제공한다.
대표적인 것들이 peer-to-peer network, 컨센서스, 블록체인과 관련된 코드를 제공하고, 이것들을 활용해서 비즈니스 로직만 작성하면 되도록 해준다.
이더리움의 2013년에 시작된 이후 여러 번 바뀌었는데, 대표적으로 2022년 9월 15일에 일어난 serenity 업데이트이다.
이 업데이로 이더리움의 컨센서스는 PoW 에서 PoS로 바뀌었다.
또 한가지 사건은 2016년에 어떤 스마트 컨트랙트 코드에 버그가 발생해서 5천만 달러를 해커가 가져가는 사건이 발생했다.
이더리움에서는 비탈릭 부테린의 주장과, 커뮤니티의 의견 수렴으로인해 이 스마트 컨트랙트 코드가 발생하기 전 시점으로 되돌리기로 하였다. (이렇듯 이더리움은 비탈릭 부테린의 영향력이 어느정도 있다.)
그리고 이에 동의하지 않은 사람들은 '이더리움 클래식'이라는 다른 블록체인 프로젝트로 갈라지게 되었다.
이더리움에서는 넓은 의미로 상태의 변화에 초점을 맞춘다.
그래서 이더리움의 트랜잭션은 상태를 변화시키는데 사용이 된다.
각각의 상태는 일종의 키-밸류 쌍으로 표현할 수 있는 모든 것이 될 수 있다.
그리고 각 상태를 저장하기 위해 메모리 기능이 있어서 코드와 데이터를 저장한다.
최종적으로 어떻게 상태가 변화하고, 어떤 상태를 최종 상태로서 모든 노드가 공유할 지는 이더리움의 컨센서스에 의해 결정된다.
이더리움의 트랜잭션을 보면, 기본적으로 from - to 라고 하는, 이더를 전송하는 주소가 명시되어있다.
그리고 어떤 코드를 실행시킬 때 넘길 데이터와 실행 시킬 코드를 지칭하는 시그니처를 함께 넘긴다.
(즉, 데이터 시그니처에 있는 코드를 명시한 데이터를 가지고 실행시키겠다는 뜻)
왼쪽은 트랜잭션이 발생하기 이전의 상태, 오른쪽은 트랜잭션 이후의 상태를 보여주며,
이후 상태의 from 주소에서는 이전 상태 대비 금액이 10eth 감소하고, (1024 → 1014)
이후 상태의 to 주소에서는 이전 상태 대비 금액이 10eth 증가한 것을 알 수 있다.
그리고 이후 상태의 주소에 있는 리스트에서는 2번 인덱스 원소가 0이었지만, 그 값이 charlie 가 되었음을 확인할 수 있다.
이는 트랜잭션의 데이터 필드로 (2, CHARLIE) 라는 인자를 넘겨 함수를 호출한 것과 같은 효과를 가지기 때문이다.
이때 실행한 코드는 위와 같은 코드이다.
트랜잭션의 0번 데이터에는 2가 들어있었고, contract.storage[2] 가 0이라면 해당 위치에 tx.data[1] 을 넣으라는 의미의 코드를 실행한 것이다.
이더리움의 블록에는 이런 트랜잭션이 많이 들어가 있고, 이런 트랜잭션들을 차례로 실행한 결과가 블록의 state가 된다.
오토마타에서도 등장하는 튜링머신은 앨런 튜링이 개념한 컴퓨터의 수학적 모델이다.
이대 튜링은 '튜링 문제' 라는 것을 제시했는데, 이는 어떤 컴퓨터 (튜링 머신) 가 유한 스텝 후에 멈출(halt) 지 안 멈출지는 알 수 없다는 것이다. 즉, 튜링 머신으로 풀 수 없는 uncomputable 한 문제가 존재한다.
이더리움은 튜링 머신으로 시뮬레이션 할 수 있는 모든 문제를 시뮬레이션 할 수 있도록 (=튜링 컴플리트) 하였으나, 튜링 머신자체의 한계에 의해서 모든 수학적 문제를 풀 수는 없다.
(튜링 머신 = 모든 수학적 문제를 풀 수 있지는 않다 / 스마트 컨트랙트 = 튜링 머신과 동일하게 동작 → 스마트 컨트랙트가 모든 수학적 문제를 풀진 못함)
따라서 이더리움의 스마트 컨트랙트를 실행하는 어떤 주체, 어떤 이더리움 머신을 돌리고 있는 주체는, 그 코드를 실행시켜 보기 전까지는 이게 언제 끝날지, 무한루프를 돌지를 알 수 없다.
그래서 이더리움은 어느 정도 실행하다가 일정 단계가 넘어가도 안 끝나면 강제로 종료시키는 방법을 채택했다.
왜냐하면 누군가 실수로 또는 악의로 무한 루프를 도는 프로그램을 뿌리면 이더리움 시스템이 그대로 멈출 수 있기 때문이다. (Dos 공격)
그렇다면 그 '일정 단계' 를 어떻게 판단할 수 있을까?
이더리움은 코드를 실행하려는 사람에게 '대가' 를 요구하고, 지불한 '대가' 만큼만 실행하도록 한다.
이더리움은 조건문은 1만원, 덧셈은 5천원 이런식으로 각 연산마다 필요한 대가를 명시해두고, 사용자가 지불한 금액에서 연산을 수행할 때마다 차감해나가다가, 만약 지불한 금액이 모자라면 EVM이 강제로 프로그램 실행을 종료한다.
(이 대가를 가리켜 '가스 (Gas)' 라고 한다.)
EVM은 마치 자바의 JVM처럼 스마트 컨트랙트를 실행하는 프로그램이다.
엄밀하게는 EVM은 이더리움 트랜잭션을 처리하는 기계이고, 각 트랜잭션들은 smart contract를 invoke 시키기 때문에, EVM 안에서 Smart Contract 역시 함께 실행된다. 그리고 코드의 실행결과와 남은 eth 잔액 등의 정보가 상태로 저장된다.
트랜잭션이 스마트 컨트랙트를 트리거할 때는 내가 지불할 gas 의 upper limit 을 지정한다.
코드를 실행할 사람들은 얼마의 가스가 필요할 지 예측할 수 없으므로, 적당히 넉넉하게 넣어두고, EVM은 코드의 실행이 다 끝나면 남은 가스는 돌려준다.
하지만 만약 내가 gas를 부족하게 넣었다면, 그때는 프로그램이 실행되다가 멈출 것이고, 이때 지불한 gas는 모두 날아가게 된다.
다시 DAPP으로 돌아오면, (여기까지 정리했을 때 내가 이해한 이더리움은)
어떤 사람이 블록체인을 사용해서 새로운 탈중앙화된 서비스를 만들고 싶다고 할 때, 처음부터 블록체인을 만들고, P2P 네트워크 코드를 짜고 하는 것은 너무 복잡하니, 미리 준비된 블록체인과 P2P 네트워크와 같은 인프라를 이더리움이 제공하고, 서비스를 만들려는 사람은 그 서비스의 비즈니스 로직만 준비해서 이더리움 위에서 돌릴 수 있도록 플랫폼을 제공하는 것이라고 이해할 수 있다.
마치 AWS가 컴퓨터를 준비해주면, 우리는 어플리케이션만 만들어서 그 위에 배포하면 되는 것처럼 말이다.
이더리움은 그런 플랫폼 중에 제일 앞서있는 플랫폼이다.
DAPP은 간단히 말해 '스마트 컨트랙트'라는 비즈니스 로직이 담긴 코드에 '웹 인터페이스'가 붙은 것이다.
그래서 편하게 P2P 네트워크 위에서 돌아가는 탈중앙화된 웹 어플리케이션을 DAPP이라고 부를 수 있다.
또한 기존의 서비스가 DBMS를 사용한 것처럼, DAPP에서도 DMBS(storage)가 필요할 수 있다.
이런 저장공간 역시 IPFS 와 같은 '탈 중앙화된' 저장공간을 사용할 수 있다.
마지막으로 DAPP 을 사용하는 노드끼리 통신하기 위해서는 역시 '탈 중앙화된 메세징 프로토콜' 역시 필요하다.
정리하면 DAPP 은 '스마트 컨트랙트 + 웹 인터페이스' 형태의 웹 어플리케이션이며,
필요에 따라 추가적으로 탈중앙화된 storage, message 프로토콜을 갖고 있다.
이더리움은 WEB 3.0 과도 관련이 있다.
WEB 1.0 은 read-only 인터넷에 존재하는 데이터를 읽기만 하는데 사용되었고,
WEB 2.0 은 read-write 이젠 읽기만 하는게 아니라 자유롭게 데이터를 쓰기도 할 수 있게 되었다. (현재 상태)
WEB 3.0 은 read-write-own 내가 생성한 데이터를 '내가 소유하는 것' 을 말한다.
예를 들어 유튜브에 동영상을 열심히 찍어 올리면, 분명 내가 만든 데이터이기는 하지만, 그 데이터는 유튜브 서버에 저장되어있고, 구글과의 계약에 따라 이 데이터의 컨트롤 권한은 유튜브에게 있다. 그래서 유튜브가 내가 올릴 데이터를 검열할 수도 있다.
즉, 실질적으로 내 데이터의 컨트롤 권한이 100% 나에게 있지 않은 것이다.
그래서 WEB 3.0이 추구하는 것은 P2P 네트워크를 통해서 내가 만든 데이터를 올리면 누구도 내 데이터를 볼 수 있으면서, 동시에 이 데이터의 소유권은 그 데이터를 만든 사람에게만 주는 것을 추구한다. 그리고 이를 구현한 것이 블록체인이다.
하지만 아직은 어느정도 한계가 있다. 인기많은 동영상이 1억회 조회수를 달성할 때, 이를 탈중앙화된 블록체인 네트워크가 감당하는 것은 현재 기술로는 힘들다고 한다.
정리하면
Web 3.0 은 다음과 같은 특징을 갖는 차세대 웹의 개념을 말한다.
1. 탈중앙화 : 콘텐츠에 대한 소유권이 콘텐츠를 만든 사람에게 존재한다.
2. permissionless : 자유롭게 들어오고 자유롭게 나갈 수 있다.
3. native payment : 전 세계에서 사용할 시스템이므로, 특정 국가가 아니라 그 안에서 사용할 자체 화폐가 필요하다.
4. trustless : 서로 간의 신뢰가 아닌, 돈과 인센티브에 의해 동작한다.
비트코인은 일종의 전자 화폐로서의 가치를 가지고,
이더리움은 전자 화폐 + 플랫폼의 기능을 한다.
이를 실제 현실에 존재하는 요소로 비유해보면
비트코인은 금과 같고, 이더리움은 기름과 같다.
금은 그 자체로 쓸모가 있는 것은 아니지만, 화폐 가치의 기준으로 중요한 경제적 기준점이 되고,
기름은 그 자체로 경제적 가치가 금만큼 크진 않지만, 실제 세상에서 매우 중요하게 사용되는 필수적인 물질이다.
즉, 이더리움은 화폐로서의 기능이 전부가 아니라, 마치 전세계적 범위에서 동작하는 컴퓨터와 같은 기능을 행한다.
이렇게 보면, 비트코인은 payment 에 대한 history를 트랜잭션으로 남겨서 각 유저의 '현재 잔고' 에 대한 state를 트랜잭션을 통해 간접적으로 기록하였으며, UTXO 기반으로 동작하는 모델이다.
이더리움은 Account-based model 로 각 유저의 현재 잔고 '상태' 자체를 저장하고, 트랜잭션은 그 상태를 변화시키는데 사용된다.
그리고 저장되는 것은 '변화된 상태' 이다.
비트코인 = 어떻게 바꿀지 저장
이더리움 = 이전 상태와 변화된 상태를 저장
그리고 이 상태는 이더리움이 가지고 있어야 하는 '모든' 내용을 키-밸류로 갖고 있는 global state 라고 보면 된다.
이렇듯 이더리움은 트랜잭션 기반의 'state machine' 이며, 이더리움의 각 노드는 트랜잭션을 처리하기 위해 EVM 을 가지고 있다.
이더리움은 단순히 eth를 전송하는 용도로만 사용할 수도 있고 (simple payment)
스마트 컨트랙트를 만들기 위해서 트랜잭션을 전송할 수도 있고, (이 스마트 컨트랜트는 이더를 전송하면 invoke 된다.)
이더리움 위에서 돌아가는 DAPP을 만들기 위해 사용할 수도 있다.
위 그림은 이더리움의 상태, 트랜잭션, 블록의 모습을 보여준다.
이더리움도 제네시스 블록이 존재한다.
그리고 이 블록들에 있는 트랜잭션이 실행되면서 block by block 으로 상태가 변화한다.
이더리움 시스템을 계층 구조로 표현하면 위와 같이 정리할 수 있다.
인터넷 기반으로 P2P 네트워크를 구축하고, 네트워크를 구성하는 각 노드는 분산된 장부 역할을 하면서 그 위에 EVM을 돌리고 있다.
EVM은 Smart Contract를 각각 실행하며 (트랜잭션을 처리할 때 실행) Smart Contract 를 기반으로 이를 응용한 dApp을 개발할 수 있다.
이 그림은 solidity 라는 언어로 작성한 smart contract 예시를 보여준다.
이 함수는 DNS 서비스를 자동화한 코드로, 내가 사용하고 싶은 domain name 을 등록하려고 할 때, byte32 길이의 name을 받아서 만약 10 이더 이상을 지불 했고, 내가 등록하려는 이름이 registryTable 에 없다면, 내 이름을 등록하는 코드이다.
위 그림은 DApp 과 기존의 클라이언트-서버 구조의 앱을 비교한 모습이다.
사용자 비용 항목을 보면, 간단하게 DApp은 스마트 컨트랙트를 실행하려면 위에서 말한대로 gas 라는 비용을 지불해야 하기 때문에 실행마다 비용을 지불해야 한다.
거래 속도의 경우, 디앱이 전통적인 구조보다는 느리다. 하나의 정해진 서버가 없기 때문이다. (병목도 없지만 일반적으로도 느리다)
'CS > 블록체인' 카테고리의 다른 글
[블록체인] 20. 이더리움 - Smart Contract & dApp (1) | 2024.12.13 |
---|---|
[블록체인] 19. 이더리움 - Account, Transaction, Block (0) | 2024.12.13 |
[블록체인] 17. Lightning Network (3) : 라이트닝 네트워크 vs 비트코인 (1) | 2024.12.09 |
[블록체인] 16. Lightning Network (2) : Commitment Sign & Payment Channel (0) | 2024.12.04 |
[블록체인] 15. Lightning Network (1) : 개요 (0) | 2024.12.01 |