이 포스트는 [학부연구생 - 블록체인] 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의 동작원리를 네트워크 통신단계부터 짚어보자.
혹시 이 포스트에 낯선 용어가 있다면, 반드시 이전 포스트를 읽고 오자.
그럼 진짜진짜 멀리서부터 시작 🧐
관련 책과 리포트 등을 읽을 때 매번 등장하는 개념인 레이어
.
블록체인 레이어는 무엇인가?
쉽게 생각하면 레이어는 하나의 층. 말그대로 집과 같다고 생각하면 된다.
Layer 3
: 지붕 역할, 필수
Layer 2
: 2층 역할, 선택 사항
Layer 1
: 1층 역할, 필수
Layer 0
: 베이스 역할, 필수
아주 기본적이고 필수적인 베이스 위에 단 1층짜리 집이 만들어진다.
이 집의 이름은 <블록체인 네트워크>
Layer 0, Layer 1, Layer 3으로 구성되어 있다.
이 1층 뿐인 집에 방문객이 한꺼번에 많이 들이 닥치면?
👤👤👤👤👤👤👤👤👤👤👤👤👤👤👤
👤👤👤👤👤👤👤👤👤👤👤👤👤👤👤
👤👤👤(복잡복잡 불편불편)👤👤👤👤
👤👤👤👤👤👤👤👤👤👤👤👤👤👤👤
👤👤👤👤👤👤👤👤👤👤👤👤👤👤👤
내부가 혼잡스럽고, 이동하기도 매우 번거로워진다.
그래서 같은 층에 사람들이 한꺼번에 몰리는 혼잡을 피하고, 효율성
과 확장성
을 위한 더 많은 공간을 제공해주는 역할을 위해 하는 것이 바로 Layer 2
Layer 2은 층 하나를 더 만든다고 할 수 있다.
각 Layer는 서로 다른 기능을 제공하지만 모두 상호 연결되어 있다.
: L0 데이터 전송과 채굴 (표준 프로토콜, 생태계 환경 )
블록체인을 위한 기본 인프라를 제공 한다.
L0는 블록체인 생태계의 중추를 구축하는 하드웨어 및 소프트웨어를 포함하는 기본 레이어이다.
L1들이 서로 상호작용하여 토큰과 데이터를 주고 받을 수 있도록 하는 기반이 되는 프로토콜
Layer 0이란?
L1
이 원활하게 실행될 수 있도록 인터넷, 하드웨어 및 연결을 구성해주는 블록체인의 초기 단계
: L1 블록체인 (플랫폼)
자체 블록체인에서 트랜잭션(거래)을 처리하고 완료하는 블록체인.
(이더리움과 비트코인이 이에 해당)
이 레이어에서 합의(PoW, PoS)
와 같은 작업과 블록 시간
및 분쟁 해결
과 같은 모든 기술적 세부 사항이 발생한다.
L1이 처리해야 하는 작업의 수는 블록체인 확장성
문제로 이어진다.
블록체인 확장성 문제란?
특정 블록체인에 많은 사용자가 참여함에 따라 (1층짜리 집에 방문객 우르르)
블록을 검증하고 체인에 추가하기 위해 컴퓨팅 성능이 향상되어야함.
따라서 거래수수료
가 증가하고처리 시간
이 느려진다.
📌 자세한 사항은 블록체인 트릴레마 문서 참조
블록체인에서 가장 중요한 문제는 블록체인 트릴레마인 탈중앙화
, 보안성
, 확장성
을 극복하는 것.
하지만 단일 블록체인으로는 (1층짜리 집으로는) 이 세 가지를 모두 갖추기는 힘들다.
: 속도와 확장(분산 아키텍쳐 )
기존 이더리움 블록체인(레이어1)에 새로운 블록체인(레이어2)를 추가해서 거래를 처리하는 방법.
L1의 트래픽을 가져와서 L2에서 트랜잭션을 처리한다.
확장성
, TPS(초당 트랜잭션 처리량)
을 높이기 위해 사용한다.
기존 블록체인이 아닌 바깥에 있는 별도의 레이어에서 연산을 수행하고 거래를 기록, 검증한 후 그 결과값만 원래 블록체인에 기록한다.
이런 방식을 통해 블록체인의 데이터 부담을 줄여 확장성 문제를 해결할 수 있다.
레이어1은 블록체인이 초당 처리할 수 있는 트랜잭션(거래) 규모를 뜻하는TPS(Transaction Per Second)
가 매우 낮다.
TPS가 낮으면 거래 처리 완료까지 상대적으로 오랜 시간이 걸린다.
- 비트코인 2~7TPS
- 이더리움 20TPS
- 비자 카드는 2만4000TPS
비자 카드에 비해 거래 처리 속도가 현저하게 낮다.
📌 관련 포스트 이더리움 2.0 - 1. 이더리움은 왜 확장되어야 하는가 참조
레이어 2에는 거래 내역이나 과정을 기록
하고
레이어 1에는 결과값만 기록
하여 거래 속도 문제를 해결한다!
이 덕분에, 레이어2가 적용된 블록체인은 빠른 TPS를 구현할 수 있다.
블록체인에 부하 용량이 쌓이면, 이로 인해 처리 속도가 늦어지고 수수료가 증가한다.
레이어 2는 레이어 1의 거래 내역을 나누어 처리할 수 있기 때문에,
TPS 증가
+ 수수료 감소 효과
또한 얻을 수 있다
`ZK Rollup, 사이드 체인 또는 트랜잭션 처리 속도 향상과 관련된 모든 것을 들을 때 L2일 가능성이 높습니다.
이더리움 디앱 작동 원리
프론트엔드 -> {Web3
를 통해서 } -> { RPC 통신
을 통해서 }
{Web3
를 통해서 } 의 내부
const web3 = {
web3_instance : {
todo : "객체 Web3를 인스턴스화 해서 web3.js의 API와 상호작용하기 위해",
how : "RPC 공급자(서버)"
},
provider : "컨트랙트와 상호작용한다",
}
클라이언트
: 웹 / 앱
일반적으로, java script 가 포함된 웹 프로그램.Web3.js 라는 자바스크립트 라이브러리를 통해 특정 서버와 직접 통신할 수 있습니다.보통의 애플리케이션이 가지는 클라이언트와 큰 차이가 없습니다.
서버
: P2P 네트워크
탈중앙화 서버는 P2P 네트워크. 즉, 하나의 단일 주체가 중앙에서 조정하는 형태가 아니라 각 노드가 서로 통신하며 같은 코드를 실행하고 같은 블록체인 데이터베이스를 가진다.
이때 노드는 모든 노드에 연결될 필요가 없고, 전체를 관장하는 마스터 노드 또한 없다.
몇 개의 노드에만 연결되어 있어도 서로서로 통신을 통해 빠르게 전체 네트워크에 데이터를 전달할 수 있다.
결국 클라이언트
가 API가 아니라 특정 라이브러리를 통해 서버와 통신하는 것이고, 서버
는 단일 서버가 아니라 여러 노드 간의 연결로 구성되어 있다.
web3.js
라이브러리 함수를 사용하여 스마트 컨트랙트와 연결된 이더리움 노드와 연결하고 이벤트에 맞는 함수 A를 호출합의
)Confirmation
이벤트를 발생시키고, 웹 UI 를 포함하여 연결된 모든 클라이언트에 전파한다. 이것을 UI 가 화면에 출력한다.분산 네트워크 컴퓨터 환경에서 프로그래밍을 쉽게 할 수 있는 방법
: Remote Procedure Call(원격 프로시저 호출)의 약자로, 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행 할 수 있게 하는 프로세스 간 통신 기술을 말한다.
어떻게 하면 분산 네트워크 컴퓨터 환경에서 프로그래밍을 쉽게 할 수 있을까?
RPC를 이용하면 프로그래머는 실행 프로그램이 로컬 위치에 있든, 원격 위치에 있든 상관없이 동일한 기능의 함수나 프로시저를 수행할 수 있다
폴리글랏
, MSA
의 시대이기 때문
일반적으로 프로세스(Process)는 자신의 주소공간 안에 존재하는 함수만 호출하여 실행 가능하다.
RPC를 이용하면 자신과 다른 주소공간에서 동작하는 프로세스의 함수를 실행할 수 있게 해준다. (RPC는 네트워크를 통한 메시징을 수행하기 때문에)
따라서 MSA
구조의 서비스를 만들 때, 언어나 환경에 구애받지 않고, 별도의 원격제어를 위한 코딩없이, 비즈니스 로직을 개발할 수 있다.
서로 다른 환경이지만 서비스간의 프로시저 호출을 가능하게 해줌 에 따라 언어에 구애받지 않고 환경에 대한 확장이 가능하며, 좀더 비즈니스 로직에 집중하여 생산성을 증가시킬 수 있다
폴리글랏
- 한 가지 언어가 아닌 다양한 언어를 사용하여 프로그래밍 한다는 의미로 폴리글랏 프로그래밍(polyglot programing)MSA(Micro Service Architecture)
- 작고, 독립적으로 배포 가능한 각각의 기능을 수행하는 서비스로 구성된 프레임워크라고 할 수 있다. 마이크로서비스는 완전히 독립적으로 배포가 가능하고, 다른 기술 스택(개발 언어, 데이터베이스 등)이 사용 가능한 단일 사업 영역에 초점
현재 유행하는 MSA(Micro Service Architecture)
구조로 서비스를 만들다보면, 다양한 언어와 프레임워크로 개발되는 경우가 잦음. 이런 Polyglot 한 구조에서는 프로토콜을 맞춰서 통신해야 하는 비용이 발생한다.
이 경우에 RPC를 이용하여 언어에 구애받지 않고, 원격에 있는 프로시저를 호출하여 조금 더 비즈니스 로직에 집중하는 개발을 할 수 있다.
(하부 네트워크 프로토콜에 신경쓰지 않아도 되기 때문)
Server
를 켬Client
---(데이터 혹은 행동을 요청)---> Server
Server
---(요청 받은 내용에 대한 응답을 반환)---> Client
Client
는 응답 값으로 자신의 요청 결과를 알 수 있음: 이를 구현하기 위해서 HTTP
와 Socket
을 사용
그래서 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을 발생시키는 명령을 원격으로 할 수 있다.
이더리움 클라이언트
(이더리움 블록체인 네트워크를 구성하고 있는 노드들)
이더리움이 제공하는 Geth
에서는, RPC를 통해 상호작용할 수 있는 api를 제공한다.
우선 가나쉬를 이용해 로컬 이더리움 네트워크를 생성한다.
이더리움 클라이언트는 http에서 동작하는 노드
로컬 이더리움 네트워크한테 RPC 요청을 curl 형태로 보내보자
curl -X POST -H "content-type:application/json" --data '{name:"Jang"}' http://localhost:3000
{
"id": 1337, // 체인 아이디, 선택
"jsonrpc": "2.0", // 필수
"method": "eth_accounts", // 필수
"params": [] // 메소드의 인자값
}
$ curl -X POST \
-H "Content-type: application/json" \
--data '{ "jsonrpc": "2.0", "method": "eth_accounts", "params": [] }' \
http://localhost:8545
=> 하나하나 다 적어서 요청을 보냄. 매우 복잡하다!
이더리움 재단에서 제공해주는 javascript 라이브러리.
Web3.js
를 이용하면 이더리움 네트워크와 상호작용할 수 있는 다양한 메소드를 제공해주고 좀 더 쉽게 RPC 요청을 주고받을 수 있게 해준다.
web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545'))
accounts = await web3.eth.getAccounts()
web3.eth.getAccounts( )
메소드를 이용해서 해당 노드에 존재하는 계정을을 가져올 수 있다.
이후 트랜잭션을 이용할 때 필요한 sender 변수를 첫번 째 계정에 담아두고, received 변수에 두번 째 계정을 담아둘 수 있다.
web3.js
는 위와 같이 매우 다양한 메소드를 제공한다.