dApps
은 Decentralized Applications
의 줄임말로 평소 우리가 사용하고 있는 중앙화 앱과는 상반되는 개념이다.
디앱에는 분산된 P2P 네트워크에서 실행되는 Backend
가 있다.
또한, 디앱은 이 백엔드를 호출하기 위해 모든 언어로 작성된 Frontend
와 UI
를 가질 수 있고, Frontend
는 분산화 저장소에서 호스팅 될 수 있다.
디앱의 주요 특징 및 장단점에 대해서 잠깐 살펴보자.
디앱의 주요 특징
Decentralized
: 디앱은 개인이나 그룹이 통제할 수 없는 개방형 공개 탈중앙화 플랫폼에서 작동한다.Deterministic
: 디앱은 실행되는 환경에 관계없이 동일한 기능을 수행한다.Turing Complete
: 필요한 리소스가 주어지면 모든 작업을 수행할 수 있다.Isolated
: 디앱은EVM
이라는 가상 환경에서 실행되므로Smart contract
에 버그가 있어도 블록체인 네트워크의 정상적인 기능을 방해하지 않는다.
디앱의 장점
Zero downtime
: 한번 스마트 컨트랙트가 블록체인에 배포되면, 네트워크 전체가 해당 컨트랙트를 사용하고자 하는 클라이언트에게 서비스를 제공할 수 있게 된다. 따라서 개별 디앱을 대상으로 서비스 거부 공격을 할 수 없다.Privacy
: 디앱을 배포하거나 사용을 위해 실제 신원정보를 제공할 필요가 없다.Resistance to censorship
: 네트워크 상의 어떤 개채도 사용자가 트랜잭션 생성, 디앱 배포 또는 블록체인의 데이터를 읽는 것을 차단할 수 없다.Complete data integrity
: 기본적인 암호화 요소들 덕분에 블록체인에 저장된 데이터는 변경할 수 없다
따라서, 악의적인 사용자는 이미 공개된 트랜잭션이나 데이터를 위조할 수 없다.Trustless computation / verifiable behavior
: 신뢰할 만한 중앙 기관없이도 스마트 컨트랙트를 분석 가능하고 예측 가능한 방식으로 실행하도록 보장할 수 있다.
디앱의 단점
Maintenance
: 블록체인에 게시된 코드와 데이터는 수정하기 어렵기 때문에 유지보수가 어려울 수 있다.
개발자는 배포 후 이전 버전에서 버그나 보안 위험이 식별되더라도 디앱이나 디앱에 의해 저장된 데이터를 업데이트하기 어렵다.Performance overhead
: 매우 큰 성능 오버헤드로 인해 확장성이 낮다. (오버헤드를 대략적으로 계산해보면 현재 표준 계산의 100만 배 수준)
이더리움에서 원하는 보안, 무결성, 투명성 그리고 신뢰성 수준을 달성하기 위해 모든 노드가 모든 트랜잭션을 실행하고 저장해야 한다.
게다가 작업 증명(PoW)에서도 많은 시간이 걸린다.Network congestion
: 하나의 디앱이 너무 많은 계산 리소스를 사용해버리면 전체 네트워크가 백업된다.
현재 네트워크는 초당 10~15개 정도의 트랜잭션만 처리할 수 있으며, 이보다 빠른 속도로 트랜잭션이 전송될 경우 트랜잭션 풀이 급증할 수 있다.User experience
: 일반 사용자들에게는 블록체인과 상호 작용하는데 필요한 툴을 완전히 보안된 방식으로 구축하는게 어렵다고 느낄 수 있다.
이 때문에 사용자 친화적인 설계를 하는 것이 어려울 수 있다.Centralization
: 이더리움 기본 레이어 위에 사용자 친화적인 방법으로 구축된 서비스는 결국 중앙 집중화 서비스처럼 보일 수 있다.
예를 들어, 블록체인을 사용하기 이전에 중앙 서버에서 민감한 개인 정보를 저장하거나, 중앙 집중식 서버를 사용하여 프론트엔드를 제공하는 경우에는 블록체인의 많은 이점을 없애게 된다.
중앙화 앱은 회사, 기관, 정부와 같은 단일 혹인 중앙화된 주체가 시스템을 제어한다.
이 주체들은 시스템을 직접 운영하면서 시스템 아키텍처의 모든 구성 요소와 계층을 완벽하게 제어할 수 있다.
따라서 중앙화 앱의 경우, 사용자들이 시스템의 주체들을 얼마나 신뢰하냐에 따라 시스템 사용 여부를 결정하게 된다.
디앱은 단일 컴퓨터가 아닌 P2P 블록체인 네트워크에서 실행되는 분산 오픈 소스 소프트웨어의 한 종류다.
언뜻 보기에 모바일이나 웹에서 지원되는 일반 소프트웨어랑 비슷해보이지만, P2P 서버를 이용한다는 점이 다르다.
Apps
: Frontend + Centralized ServerdApps
: Frontend (uising web3) + P2P Server (with Blockchain)
디앱을 사용하는 대표적인 플랫폼으로 이더리움
이 있다.
웹 클라이언트는 일반적인 웹 앱과 마찬가지로, HTML
, Javascript
가 포함된 웹 프로그램이다.
일반적인 웹 서버에서 사용자 브라우저로 다운로드 되며, 웹 UI에는 서버측 스크립트가 포함되어 있지 않다.
Web3.js
모듈을 사용하여 네트워크의 특정 서버와 직접 통신하고, 자체 로컬 네트워크 노드와도 통신할 수 있다.
탈중앙화 서버는 같은 코드를 실행하고 같은 블록체인 데이터베이스를 갖는 서버의 P2P 네트워크다.
P2P 네트워크는 마스터 노드의 조정 없이 서로 직접 통신하는 노드들로 구성되어 있다.
아래 그림처럼 모든 노드가 연결될 필요 없이 몇 개의 노드만 연결되어 있어도 데이터를 전체 네트워크에 빠르게 전달할 수 있다.
블록체인 플랫폼을 지원하는 다양한 P2P 네트워크가 있는데, 디앱의 대부분은 이더리움 플랫폼 위에서 개발되고 있다.
이더리움 네트워크에서 모든 노드는 동등하게 블록체인 데이터베이스와 클라이언트를 가지고 있다.
따라서 클라이언트와 서버의 명확한 구분이 없고, 각 노드는 서로 다른 노드의 서버이면서 클라이언트로 동작한다.
- 참여자 노드 :
Blockchain database
+client
- client
: 노드의 소프트웨어 요소, 공통 클라이언트 인터페이스를 노출하고Wire
라는 P2P 프로토콜을 통해 서로 통신함 (블록 데이터를 표준화된 방식으로 전송)이더리움 클라이언트는
표준 클라이언트 인터페이스
를 사용하고Wire 프로토콜
을 사용하므로, 클라이언트가 다른 언어로 구현되더라도 서로 상호작용이 가능하다.
프로그램 블록체인(Program Blockchain)
: 암호화폐 거래내역 및 블록을 네트워크에 전파할 수 있을 뿐만 아니라, 블록체인 데이터베이스에서 호스팅되는 어플리케이션 코드를 실행할 수 있는 블록체인 플랫폼
디앱의 코드 : 스마트 컨트랙트(Smart Contract)
로 구성되어 있음. (스마트 컨트랙트는 나중에 따로 포스팅 예정입니다.)
모든 네트워크 노드가 Wire 프로토콜
을 통해 원활하게 통신하지만, 다 동일한 기능을 수행하지 않는다.
기능에 따라 노드는 Full Node
, Mining Node
로 구분할 수 있다.
특징은 아래와 같다.
Full node
- 블록체인에서 데이터를 읽어올 수는 있지만 새로운 블록을 생성할 순 없다.
- 피어 노드에서 받은 블록을 자신의 로컬 블록체인에 추가할 수 있다.
- 받은 블록의 유효성 검증을 위해 거래를 실행한다.
- 검증이 된 블록은 연결된 다른 피어 노드들에 전파한다.
Mining node
- 거래내역을 모아서 새로운 블록에 저장한다.
- 보상을 받기 위해 올바른 블록을 찾는 작업을 수행한다.
- 생성된 블록을 블록체인에 추가하고 P2P 네트워크에 전파한다.
투표 서비스를 진행하는 디앱을 예시로 트랜잭션의 흐름에 대해서 단계별로 알아보자.
- 사용자가 웹 화면에서 투표 옵션을 선택하고 Vote 를 클릭한다.
- 자바스크립트 함수가 클릭 이벤트 처리하고 선택된 투표내역을 불러온다.
그 다음web3.js
모듈을 사용하여 투표 스마트 컨트랙트와 연결된 이더리움 노드와 연결하고castVote()
함수를 호출한다.
castVote()
는 전자서명된 거래내역 메시지를 생성하여 사용자가 실제로 이 트랜잭션을 보낸 사람임을 증명한다.- 연결된 로컬 이더리움 노드는 거래내역 메시지 처리 및 검증한 뒤에 피어 노드에 전달한다.
- 피어 노드는 거래내역이 채굴 노드를 만날 때까지 거래내역을 계속 전파한다.
채굴 노드는 2단계, 3단계를 동일하게 수행한 뒤, 블록을 먼저 생성하기 위해 다른 채굴 노드와 경쟁한다.
가장 먼저 블록을 생성한 채굴 노드는 생성된 블록을 모든 피어노드에 전달한다.- 새로운 블록을 받은 노드는 블록에 포함된 모든 트랜잭션들이 정상적인지 또는 블록이 유효한지 여부를 검증한 뒤, 블록에 존재하는 모든 트랜잭션을 처리한다.
노드가 성공적으로 블록을 확인하면 해당 블록을 피어 노드로 전달한다.
전체 네트워크가 새 블록을 추가할 때까지 동일한 검증 및 전파 과정을 반복한다.- 각 노드는 블록 내 모든 트랜잭션들을 실행하면서 검증한다.
트랜잭션 중 하나가 투표 트랜잭션이며, 이것에 대한 검증이 성공적으로 완료되면VoteConfirmation
이벤트를 발생시킨다.
이 이벤트는 디앱 웹 UI를 포함하여 연결된 모든 클라이언트에 전파된다.- 투표 웹 클라이언트의 자바스크립트 코드에는
VoteConfirmation
이벤트에 대한 콜백 함수가 포함되어 있으며, 이 이벤트가 발생하면 해당 콜백 함수가 호출된다.- 마지막으로 콜백함수는 사용자의 화면에 투표가 완료되었음을 표시한다.