
이 블로그는 탈중앙화 네트워크와 스마트 컨트랙트로 web3가 개발 방식을 어떻게 변화시키는지 탐구하며, 이더리움 시작에 필요한 핵심 인사이트와 도구를 제공합니다.

온라인 상호작용이 투명성, 보안, 사용자 제어를 보장하는 탈중앙화 네트워크에 의해 구동되는 세상을 상상해 보세요. 이것이 바로 블록체인 기술로 구동되는 web3가 약속하는 미래입니다. 이 글에서는 이더리움 블록체인 개발을 이해하는 데 필요한 핵심 개념과 도구를 살펴보겠습니다.
web2의 클라이언트-서버 아키텍처를 설명할 때 흔히 '주방 비유'가 사용됩니다. 이 비유에서 서버는 주방과 같고, 클라이언트(사용자)는 음식을 주문하듯 요청을 보냅니다. 서버는 이 요청을 처리하고 완성된 요리를 내어주듯 데이터를 반환합니다. API는 웨이터 역할을 하며, 주문을 주방에 전달하고 완성된 음식을 가져다주는 것처럼 클라이언트와 서버가 서로 다른 언어를 사용하더라도 둘 사이의 소통을 원활하게 합니다.
이 주방 비유를 web3에도 적용할 수 있지만, 몇 가지 중요한 차이점이 있습니다. 동일한 주방(노드)이 여러 개 존재하고, 그 중 하나가 무작위로 선택되며, 음식을 받기 전에 조리 수수료를 미리 지불해야 합니다.
이 비유를 통해 사용자가 dapp과 상호작용할 때 내부에서 어떤 일이 일어나는지 이해해 봅시다. 비유가 완벽하지는 않지만, 이더리움에서 개발 여정을 시작하기 위한 멘탈 모델을 구축하는 데 도움이 됩니다.
탈중앙화 세계에는 전통적인 '서버'가 존재하지 않습니다. 대신, 탈중앙화 노드들이 전 세계에 분산되어 함께 놀라운 결과를 만들어냅니다. 이 노드들은 공동으로 블록체인이라는 공유된 불변의 원장을 유지하며, 모든 트랜잭션이 안전하고 투명하게 처리되도록 보장합니다. 어떤 노드든 트랜잭션을 처리하거나 스마트 컨트랙트 코드를 실행할 수 있습니다.
블록체인 노드는 블록체인 프로토콜 소프트웨어를 실행하고 해당 네트워크에 연결된 모든 컴퓨터를 말합니다. 이 노드들은 탈중앙화 네트워크의 근간을 이루며, 블록체인 인프라를 유지하는 핵심 주체로 기능합니다. 노드는 데이터 저장 지점 역할을 하므로, 사용자가 블록체인의 데이터에 접근할 때마다 노드와 상호작용하게 됩니다. 노드는 투명하며 네트워크의 누구에게나 접근 가능합니다.
블록체인은 중앙 권한 없이 운영되기 때문에, 제어권은 노드 네트워크 전체에 분산되어 있으며, 노드들이 공동으로 트랜잭션 검증 및 거버넌스 프로토콜 실행과 같은 작업을 처리합니다. 블록체인의 모든 토큰과 스마트 컨트랙트는 노드 내에 존재하므로, 노드는 블록체인 기능에 필수적입니다. 노드가 없다면 블록체인의 근본적인 구조 자체가 존재할 수 없습니다.
스마트 컨트랙트는 블록체인에서 실행되는 자동화 프로그램으로, 계약 조건이 코드에 직접 인코딩되어 있습니다. 특정 조건이 충족되면 계약이 자동으로 합의된 조건을 이행하고 실행하여, 중개자가 필요 없게 됩니다.
그러나 탈중앙화 네트워크에서 중요한 과제 중 하나는, 중앙 권한이 없는 상황에서 노드들이 정직하게 행동하고 사용자 요청을 올바르게 처리하도록 보장하는 것입니다. 이 문제를 해결하는 것이 바로 '합의(consensus)' 개념입니다.
합의 메커니즘은 모든 트랜잭션이 노드들에 의해 검증되고 동의되도록 보장하여, 사기와 이중 지불을 방지하고 블록체인의 무결성을 유지합니다. 주방 비유를 확장하면 이렇습니다. 선택된 주방이 주문을 완성한 후, 완성된 요리와 레시피를 다른 주방들과 공유합니다. 다른 주방들은 동일한 레시피를 따라 결과를 비교하고, 주문이 올바르게 준비되었는지 공동으로 확인하여 네트워크 전반의 일관성과 정확성을 보장합니다.
서버 배포를 위한 인프라를 직접 관리해야 하는 web2와 달리, web3는 백엔드 로직의 상당 부분을 블록체인의 스마트 컨트랙트로 이전합니다. 다음은 스마트 컨트랙트 개발의 전체 라이프사이클을 간소화하는 개발 환경들입니다.
Hardhat: 스마트 컨트랙트와 앱의 편집, 컴파일, 디버깅, 배포를 위한 구성 요소를 포함하는 종합 개발 환경입니다. JavaScript에 능숙하고 웹 기술과의 광범위한 통합이 필요한 경우에 이상적입니다.
Foundry: 모든 것을 Solidity 생태계 내에서 유지하는 빠르고 효율적인 옵션으로, 속도와 Solidity 네이티브 지원을 통해 생산성을 향상시킵니다.
Hardhat과 Foundry의 자세한 비교는 Choosing the Right Ethereum Development Tool 가이드를 참고하세요.
Remix: 필수 작업을 위한 플러그인이 사전 탑재된 온라인 IDE로, 로컬에 아무것도 설치하지 않고도 코드를 빠르게 테스트하기에 완벽합니다.
개발자들은 다양한 고수준 프로그래밍 언어로 스마트 컨트랙트를 작성할 수 있으며, 이는 저수준 바이트코드로 컴파일됩니다. 가장 널리 사용되는 두 가지 언어는 다음과 같습니다.
Solidity: JavaScript와 유사한 문법으로 많은 개발자들이 쉽게 접근할 수 있습니다.
Vyper: Python과 유사한 문법으로 보안성과 가독성을 강화하도록 설계되었습니다.
그 외에도 Yul, Cairo, Rust 등의 언어가 있으며, 개발 요구사항에 따라 추가적인 선택지를 제공합니다.
음식 주문이 테이블에서 주방으로 전달되고, 완성된 주문이 다시 테이블로 돌아오는 방법은 무엇일까요? 바로 웨이터를 통해서입니다!
web2에서는 REST API가 '웨이터' 역할을 하며, 애플리케이션과 비즈니스 로직이 있는 백엔드 서버 간의 통신을 중개합니다. 이 백엔드와 상호작용하려면 URL과 다양한 작업을 위한 특정 엔드포인트가 필요합니다.
web3에서는 블록체인 노드와의 상호작용이 JSON-RPC API를 통해 이루어집니다. 이 API는 JSON-RPC 호출 본문 내에 비즈니스 로직이 담긴 컨트랙트를 지정함으로써 여러 dapp이 동일한 URL을 통해 상호작용할 수 있게 합니다. JSON-RPC API가 낯설게 느껴질 수 있지만, 아래와 같이 일반적인 HTTP 요청과 유사하게 작동합니다.
요청 본문의 data 객체에 포함된 내용을 자세히 살펴보세요.
{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}여기에는 JSON-RPC 버전, 원하는 작업을 위한 메서드(예: 최신 블록 번호 조회), 선택적 파라미터, 그리고 요청을 추적하기 위한 ID가 포함됩니다. 이 형식은 데이터 조회나 블록체인 작업 실행 등 이더리움 노드와의 통신을 표준화합니다.
요청의 URL은 Infura를 가리키는데, Infura는 자체 이더리움 노드를 설정하고 유지하는 복잡성과 리소스 부담을 덜어주는 노드 제공업체입니다. 이 URL은 블록체인으로의 게이트웨이 역할을 합니다.
앞서 언급한 조리 수수료를 미리 지불해야 한다는 점을 기억하시나요? web3에서 트랜잭션을 실행할 때는 'Gas fee'라는 비용이 발생하며, 이는 트랜잭션의 복잡성과 당시 네트워크 혼잡도에 따라 달라집니다. 단, 블록체인에서 데이터를 읽는 것은 무료입니다.
트랜잭션이 올바르게 이해되고 실행되려면 표준화된 설명 방식이 필요합니다. 이때 ABI(Application Binary Interface)가 등장합니다. ABI는 메뉴판처럼 스마트 컨트랙트의 함수와 상호작용하는 방법을 정의하고, 필요한 파라미터와 함수 실행 방식을 명시합니다.
그렇다면 dapp은 배포된 스마트 컨트랙트와 어떻게 통신할까요? 앞서 설명했듯이 JSON-RPC API를 사용해야 하지만, 이 과정을 단순화하기 위한 여러 라이브러리가 있습니다. JavaScript에서는 Ethers.js나 Viem을 사용할 수 있으며, React 기반 프론트엔드에는 이더리움용 React Hooks 라이브러리인 wagmi가 특히 유용합니다. 이 라이브러리들은 JSON-RPC 호출을 래핑하여 블록체인 및 배포된 컨트랙트와의 상호작용을 더 쉽게 만들어줍니다.
Viem, 그리고 내부적으로 viem을 사용하는 Wagmi는 강력한 타입 API를 제공하여 자동완성, 타입 추론, 정적 유효성 검사로 개발자 경험을 향상시킵니다. ABI를 제공하면 viem이 자동완성을 지원하고 사용자에게 영향을 미치기 전에 타입 오류를 잡아줍니다.
ethers.js와 viem 중 어떤 것을 선택해야 할지 고민된다면, Web3 개발자를 위한 상세 비교 가이드를 확인해 보세요.
스마트 컨트랙트와 상호작용하는 방법은 여러 가지가 있지만, 가장 인기 있는 방법인 dapp을 통한 방식을 살펴보겠습니다. dapp은 블록체인과 상호작용하도록 설계된 탈중앙화 웹 또는 모바일 앱입니다.
그렇다면 dapp은 일반 웹 앱과 무엇이 다를까요? 시각적으로는 큰 차이가 없는 경우가 많습니다. 개발자들은 web3에서도 React, Next.js, 또는 바닐라 JavaScript와 같은 web2의 익숙한 웹 프레임워크를 사용할 수 있으며, dapp을 배포하는 방식도 크게 다르지 않습니다. 다만 web3에서는 IPFS(InterPlanetary File System)나 SWARM과 같은 탈중앙화 스토리지 솔루션이 일반적으로 사용됩니다.
대부분의 web3 앱에서 두드러지는 특징은 "지갑 연결(Connect Wallet)" 기능입니다. dapp에서 "지갑 연결"을 클릭하면, 애플리케이션이 지갑과 상호작용하도록 권한을 부여하는 것으로, 공개 주소를 읽고 사용자를 대신하여 트랜잭션을 요청할 수 있게 됩니다. 트랜잭션은 사용자가 해당 작업을 수행할 자격이 있는지 확인하기 위해 인증이 필요합니다. 이는 서명(signing)을 통해 이루어지며, 이 과정에서 이더리움 계정 소유권을 증명하는 고유 식별자인 개인 키(private key)가 사용되며, 이는 지갑에 안전하게 저장됩니다.
지갑에 대해 더 자세히 알아보겠습니다. 지갑은 브라우저 확장 프로그램, 모바일 앱, 심지어 물리적 장치 등 다양한 형태로 제공되며, MetaMask가 가장 널리 사용되는 지갑 중 하나입니다. 실제 레스토랑이 여러 결제 수단을 받아들이듯, dapp에서도 여러 지갑을 지원해야 할 수 있습니다.
지갑 연결 기능을 쉽게 구현하고 다양한 지갑 유형을 지원하려면 다음과 같은 도구를 활용해 보세요.
이 도구들은 통합 과정을 간소화하여 dapp과 사용자 지갑 간의 원활한 연결을 보장합니다.
web3 개발은 블록체인의 스마트 컨트랙트를 활용하여 앱의 작동 방식을 변화시키고, 앱을 영구적으로 만들며 백엔드 작업을 중앙화된 서버에서 분리합니다. 이러한 변화로 인해 개발자들은 트랜잭션 서명, Gas fee 처리, JSON-RPC API 사용 등에 익숙해져야 하며, 이는 기존 web2 개발과 차별화되는 부분입니다. 도전적일 수 있지만, 동시에 새롭고 흥미로운 가능성을 열어줍니다.
web3 개발에 대해 더 알아보고 최신 도구와 모범 사례를 확인하려면, 개발자 중심의 인사이트와 가이드를 제공하는 MetaMask 블로그를 방문해 보세요.
AI가 번역했습니다. 오류가 있을 수 있습니다. 항상 정보를 확인하시기 바랍니다.