✨ 블록체인 멀리보기 - 네트워크로 보는 Dapp의 흐름 ✨

Jeenie·2022년 10월 1일
0
post-thumbnail

이 포스트는 [학부연구생 - 블록체인] Remix 연결, Web3.js 연결 ,
폴리글랏 프로그래밍 (polyglot programing) ,
(트렌드) 블록체인의 계층 영역 (L0, L1, L2, L3) ,
[블록체인 용어] 블록체인 레이어(Layer)란? – Layer 0, 1, 2, and 3 ,
[블록체인] Dapp 사용의 전반적인 흐름,
RPC란?, [통신] RPC(Remote Procedure Call)의 개념 및 특징 ,
[MSA] MSA란 무엇인가? 개념 이해하기 ,
[개념] Blockchain 개발하기 :: dapp (탈중앙화 앱) 이란? dapp 구조, 흐름, 스마트 컨트랙트,
[온더 in Devcon②] 레이어2는 이더리움의 확장성을 어떻게 개선할까,
[학부연구생 - 블록체인]DApp과 블록체인의 관계,
[학부연구생 - 블록체인] ABI와 바이트코드에 대한 이해,
[학부연구생 - 블록체인] web3 Provider와 클라이언트,
블록체인 Block-Chain - 이더리움 Web3,
RPC란? 를 참고하여 요약한 글입니다

서론

이전 포스트에서 블록체인 개념 묶어보기를 했으니, 이젠 블록체인 멀리보기를 해보자.

궁극적인 목적은 이더리움 DApp은 어떻게 동작하는가 를 이해하는 것

그럼 이더리움 Dapp의 동작원리를 네트워크 통신단계부터 짚어보자.

혹시 이 포스트에 낯선 용어가 있다면, 반드시 이전 포스트를 읽고 오자.

그럼 진짜진짜 멀리서부터 시작 🧐

1. Layer

관련 책과 리포트 등을 읽을 때 매번 등장하는 개념인 레이어.
블록체인 레이어는 무엇인가?

쉽게 생각하면 레이어는 하나의 층. 말그대로 집과 같다고 생각하면 된다.

Layer 3 : 지붕 역할, 필수

Layer 2 : 2층 역할, 선택 사항

Layer 1 : 1층 역할, 필수

Layer 0 : 베이스 역할, 필수

아주 기본적이고 필수적인 베이스 위에 단 1층짜리 집이 만들어진다.

이 집의 이름은 <블록체인 네트워크>
Layer 0, Layer 1, Layer 3으로 구성되어 있다.

이 1층 뿐인 집에 방문객이 한꺼번에 많이 들이 닥치면?

👤👤👤👤👤👤👤👤👤👤👤👤👤👤👤
👤👤👤👤👤👤👤👤👤👤👤👤👤👤👤
👤👤👤(복잡복잡 불편불편)👤👤👤👤
👤👤👤👤👤👤👤👤👤👤👤👤👤👤👤
👤👤👤👤👤👤👤👤👤👤👤👤👤👤👤

내부가 혼잡스럽고, 이동하기도 매우 번거로워진다.

그래서 같은 층에 사람들이 한꺼번에 몰리는 혼잡을 피하고, 효율성확장성을 위한 더 많은 공간을 제공해주는 역할을 위해 하는 것이 바로 Layer 2

Layer 2은 층 하나를 더 만든다고 할 수 있다.

각 Layer는 서로 다른 기능을 제공하지만 모두 상호 연결되어 있다.

1-1. Layer 0

: L0 데이터 전송과 채굴 (표준 프로토콜, 생태계 환경 )

블록체인을 위한 기본 인프라를 제공 한다.

L0는 블록체인 생태계의 중추를 구축하는 하드웨어 및 소프트웨어를 포함하는 기본 레이어이다.

L1들이 서로 상호작용하여 토큰과 데이터를 주고 받을 수 있도록 하는 기반이 되는 프로토콜

Layer 0의 예시

  • Polkadot
  • Avalanche
  • Cardano
  • Cosmos

Layer 0이란?

L1이 원활하게 실행될 수 있도록 인터넷, 하드웨어 및 연결을 구성해주는 블록체인의 초기 단계

Layer 1

: L1 블록체인 (플랫폼)

자체 블록체인에서 트랜잭션(거래)을 처리하고 완료하는 블록체인.
(이더리움과 비트코인이 이에 해당)

이 레이어에서 합의(PoW, PoS)와 같은 작업과 블록 시간분쟁 해결 과 같은 모든 기술적 세부 사항이 발생한다.

L1이 처리해야 하는 작업의 수는 블록체인 확장성 문제로 이어진다.

블록체인 확장성 문제란?

특정 블록체인에 많은 사용자가 참여함에 따라 (1층짜리 집에 방문객 우르르)
블록을 검증하고 체인에 추가하기 위해 컴퓨팅 성능이 향상되어야함.
따라서 거래 수수료가 증가하고 처리 시간이 느려진다.

📌 자세한 사항은 블록체인 트릴레마 문서 참조

블록체인에서 가장 중요한 문제는 블록체인 트릴레마인 탈중앙화, 보안성, 확장성을 극복하는 것.

하지만 단일 블록체인으로는 (1층짜리 집으로는) 이 세 가지를 모두 갖추기는 힘들다.

👉 블록체인 트릴레마이를 해결하기 위한 솔루션들

Layer 1 예시

  • Bitcoin
  • Ethereum
  • Binance Smart Chain
  • Solana

Layer 2

: 속도와 확장(분산 아키텍쳐 )

기존 이더리움 블록체인(레이어1)에 새로운 블록체인(레이어2)를 추가해서 거래를 처리하는 방법.

L1의 트래픽을 가져와서 L2에서 트랜잭션을 처리한다.

확장성, TPS(초당 트랜잭션 처리량)을 높이기 위해 사용한다.

기존 블록체인이 아닌 바깥에 있는 별도의 레이어에서 연산을 수행하고 거래를 기록, 검증한 후 그 결과값만 원래 블록체인에 기록한다.

이런 방식을 통해 블록체인의 데이터 부담을 줄여 확장성 문제를 해결할 수 있다.

이더리움에서의 Layer 2

[온더 in Devcon②] 레이어2는 이더리움의 확장성을 어떻게 개선할까 참조

Layer 2의 특징

1. 거래 속도 문제 해결

레이어1은 블록체인이 초당 처리할 수 있는 트랜잭션(거래) 규모를 뜻하는TPS(Transaction Per Second)가 매우 낮다.
TPS가 낮으면 거래 처리 완료까지 상대적으로 오랜 시간이 걸린다.

  • 비트코인 2~7TPS
  • 이더리움 20TPS
  • 비자 카드는 2만4000TPS
    비자 카드에 비해 거래 처리 속도가 현저하게 낮다.

📌 관련 포스트 이더리움 2.0 - 1. 이더리움은 왜 확장되어야 하는가 참조

레이어 2에는 거래 내역이나 과정을 기록하고
레이어 1에는 결과값만 기록하여 거래 속도 문제를 해결한다!

이 덕분에, 레이어2가 적용된 블록체인은 빠른 TPS를 구현할 수 있다.

2. 수수료 문제 해결

블록체인에 부하 용량이 쌓이면, 이로 인해 처리 속도가 늦어지고 수수료가 증가한다.

레이어 2는 레이어 1의 거래 내역을 나누어 처리할 수 있기 때문에,
TPS 증가 + 수수료 감소 효과 또한 얻을 수 있다

Layer 2의 예시

  • Polygon
  • OmiseGo
  • Loopring
  • SKALE Network
  • Optimisim

`ZK Rollup, 사이드 체인 또는 트랜잭션 처리 속도 향상과 관련된 모든 것을 들을 때 L2일 가능성이 높습니다.

📌 Optimistic vs. ZK Rollup: Deep Dive 참조


2. Dapp 작동 원리

이더리움 디앱 작동 원리

프론트엔드 -> {Web3를 통해서 } -> { RPC 통신을 통해서 }

{Web3를 통해서 } 의 내부

const web3 = {
  web3_instance : {
    todo : "객체 Web3를 인스턴스화 해서 web3.js의 API와 상호작용하기 위해",
  	how : "RPC 공급자(서버)"
  },
  provider : "컨트랙트와 상호작용한다",
  
}

Dapp의 구조

  • 클라이언트 : 웹 / 앱
    일반적으로, java script 가 포함된 웹 프로그램.Web3.js 라는 자바스크립트 라이브러리를 통해 특정 서버와 직접 통신할 수 있습니다.보통의 애플리케이션이 가지는 클라이언트와 큰 차이가 없습니다.

  • 서버 : P2P 네트워크
    탈중앙화 서버는 P2P 네트워크. 즉, 하나의 단일 주체가 중앙에서 조정하는 형태가 아니라 각 노드가 서로 통신하며 같은 코드를 실행하고 같은 블록체인 데이터베이스를 가진다.
    이때 노드는 모든 노드에 연결될 필요가 없고, 전체를 관장하는 마스터 노드 또한 없다.
    몇 개의 노드에만 연결되어 있어도 서로서로 통신을 통해 빠르게 전체 네트워크에 데이터를 전달할 수 있다.

결국 클라이언트가 API가 아니라 특정 라이브러리를 통해 서버와 통신하는 것이고, 서버는 단일 서버가 아니라 여러 노드 간의 연결로 구성되어 있다.

Dapp의 흐름

  • 1) 사용자의 이벤트를 웹페이지의 JS가 처리한다
  • 2) 이벤트 발생 시 web3.js 라이브러리 함수를 사용하여 스마트 컨트랙트와 연결된 이더리움 노드와 연결하고 이벤트에 맞는 함수 A를 호출
  • 3) 연결된 로컬 이더리움 노드 (ex. 개발자 컴퓨터) 는 메시지를 처리하고 검증한 후 피어 노드로 전달한다.
  • 4) 거래내역이 채굴 노드를 만날 때까지 전파한다
  • 5) 각 노드는 새 block 을 받으면 해당 block 의 개별 거래내역이 정상적인지 + 전체 block 이 유효한지 검증한다.
    이후 block 에 존재하는 모든 거래내역을 처리하며 이 과정에서 계약 상태의 유효성을 암시적으로 확인한다. (이것이 바로 합의)
  • 6) 검증이 성공적으로 완료되면 Confirmation 이벤트를 발생시키고, 웹 UI 를 포함하여 연결된 모든 클라이언트에 전파한다. 이것을 UI 가 화면에 출력한다.

3. RPC

분산 네트워크 컴퓨터 환경에서 프로그래밍을 쉽게 할 수 있는 방법

RPC란?

: Remote Procedure Call(원격 프로시저 호출)의 약자로, 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행 할 수 있게 하는 프로세스 간 통신 기술을 말한다.

왜 사용하는가?

어떻게 하면 분산 네트워크 컴퓨터 환경에서 프로그래밍을 쉽게 할 수 있을까?

RPC를 이용하면 프로그래머는 실행 프로그램이 로컬 위치에 있든, 원격 위치에 있든 상관없이 동일한 기능의 함수나 프로시저를 수행할 수 있다

RPC가 필요한 이유?

폴리글랏, MSA의 시대이기 때문

일반적으로 프로세스(Process)는 자신의 주소공간 안에 존재하는 함수만 호출하여 실행 가능하다.

RPC를 이용하면 자신과 다른 주소공간에서 동작하는 프로세스의 함수를 실행할 수 있게 해준다. (RPC는 네트워크를 통한 메시징을 수행하기 때문에)

따라서 MSA 구조의 서비스를 만들 때, 언어나 환경에 구애받지 않고, 별도의 원격제어를 위한 코딩없이, 비즈니스 로직을 개발할 수 있다.

서로 다른 환경이지만 서비스간의 프로시저 호출을 가능하게 해줌 에 따라 언어에 구애받지 않고 환경에 대한 확장이 가능하며, 좀더 비즈니스 로직에 집중하여 생산성을 증가시킬 수 있다

  • 폴리글랏
    - 한 가지 언어가 아닌 다양한 언어를 사용하여 프로그래밍 한다는 의미로 폴리글랏 프로그래밍(polyglot programing)
  • MSA(Micro Service Architecture)
    - 작고, 독립적으로 배포 가능한 각각의 기능을 수행하는 서비스로 구성된 프레임워크라고 할 수 있다. 마이크로서비스는 완전히 독립적으로 배포가 가능하고, 다른 기술 스택(개발 언어, 데이터베이스 등)이 사용 가능한 단일 사업 영역에 초점

현재 유행하는 MSA(Micro Service Architecture) 구조로 서비스를 만들다보면, 다양한 언어와 프레임워크로 개발되는 경우가 잦음. 이런 Polyglot 한 구조에서는 프로토콜을 맞춰서 통신해야 하는 비용이 발생한다.

이 경우에 RPC를 이용하여 언어에 구애받지 않고, 원격에 있는 프로시저를 호출하여 조금 더 비즈니스 로직에 집중하는 개발을 할 수 있다.
(하부 네트워크 프로토콜에 신경쓰지 않아도 되기 때문)

전통적인 Client - Server 방식

  • Server를 켬
  • Client ---(데이터 혹은 행동을 요청)---> Server
  • Server ---(요청 받은 내용에 대한 응답을 반환)---> Client
  • Client는 응답 값으로 자신의 요청 결과를 알 수 있음

: 이를 구현하기 위해서 HTTPSocket을 사용

그래서 RPC는 왜 사용하는가?

=> 함수가 있는 곳과 다른 주소 공간에서 실행 프로그램이 해당 함수를 실행할 수 있게 하기 위해서.

Web3에서의 RPC는?

블록체인 연동 준비

web3.js는 Web3이라는 클래스를 제공하고 web3.js는 이 클래스의 객체를 통해서 web3.js의 API와 상호작용한다.

var web3 = new Web3();
라는 문장으로 Web3 객체를 생성한다

블록체인과 연동하기 위해서는 RPC 공급자(서버)와 연결해야 하는데, 지역 또는 원격 web3 RPC 공급자와 연결 시

web3.setProvider(new web3.providers.HttpProvider("http://RPC_IP:RPC_Port"));
형태의 호출이 필요하다. 여기서 RPC_IP는 RPC 공급자의 IP이고 RPC_Port는 해당 RPC 포트이다.

RPC 서버란? 외부의 서버컴퓨터에 접속해 제어하는 것.
이더리움은 클라이언트 프로그램은 RPC 명령어를 JSON 형태로 지원한다.

이것을 Ethereum JSON RPC라고 하는데, 이것을 이용해서 블록체인의 정보를 얻거나 Transaction을 발생시키는 명령을 원격으로 할 수 있다.

Ether.js

Provider

Signer

Contract

Ethereum Provider란?

geth

이더리움 클라이언트(이더리움 블록체인 네트워크를 구성하고 있는 노드들)

이더리움이 제공하는 Geth 에서는, RPC를 통해 상호작용할 수 있는 api를 제공한다.

RPC 요청을 보내는 방법

우선 가나쉬를 이용해 로컬 이더리움 네트워크를 생성한다.
이더리움 클라이언트는 http에서 동작하는 노드

방법 1. curl로 직접 RPC 요청 보내기 👎

로컬 이더리움 네트워크한테 RPC 요청을 curl 형태로 보내보자

  1. 로컬 이더리움 네트워크 생성하기
curl -X POST -H "content-type:application/json" --data '{name:"Jang"}' http://localhost:3000
  1. 가나쉬에서 생성한 로컬 이더리움 클라이언트에 RPC 요청 보내기
{
    "id": 1337, // 체인 아이디, 선택
    "jsonrpc": "2.0", // 필수
    "method": "eth_accounts", // 필수
    "params": [] // 메소드의 인자값
}
  1. 이더리움 클라이언트에서 계정 가져오기
$ curl -X POST \
    -H "Content-type: application/json" \
    --data '{ "jsonrpc": "2.0", "method": "eth_accounts", "params": [] }' \
    http://localhost:8545

=> 하나하나 다 적어서 요청을 보냄. 매우 복잡하다!

방법 2. Web3.js 라이브러리 사용 👍

이더리움 재단에서 제공해주는 javascript 라이브러리.
Web3.js를 이용하면 이더리움 네트워크와 상호작용할 수 있는 다양한 메소드를 제공해주고 좀 더 쉽게 RPC 요청을 주고받을 수 있게 해준다.

  1. web3 인스턴스 생성하기
web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545'))
  1. 전체 accounts 가져오기
accounts = await web3.eth.getAccounts()

web3.eth.getAccounts( ) 메소드를 이용해서 해당 노드에 존재하는 계정을을 가져올 수 있다.
이후 트랜잭션을 이용할 때 필요한 sender 변수를 첫번 째 계정에 담아두고, received 변수에 두번 째 계정을 담아둘 수 있다.

web3.js는 위와 같이 매우 다양한 메소드를 제공한다.

Ethereum JSON RPC

profile
Web Front-end developer

0개의 댓글