블록체인이 하나의 거대한 state machine으로서 프로그램의 상태를 저장하고, 스마트 컨트랙트가 블록체인에서 돌아가는 프로그램이자 로직을 정의하는 역할을 한다.
아래 항목들은 web3 어플리케이션을 이루는 스택들에 대해 정리해 보았다.
Smart Contract
이더리움 블록체인에서 실행되는 프로그램을 말한다. 스마트 컨트랙트는 이더리움 account의 한 종류이다. 즉 밸런스를 가지고 있고, 네트워크를 통해 트랜잭션을 보낼 수 있다. 다만 유저가 아닌 프로그램에 의해 실행된다는 것이 다른 점이다.
이더리움의 경우 Solidity나 Vyper와 같이 스마트 컨트랙트를 작성할 수 있는 언어를 지원해준다. 어떤 언어를 사용해도 되지만 EVM이 사용할 수 있게 컴파일이 되어야 한다.
스마트 컨트랙트 테스트 프레임워크 및 툴 : Waffle, Solidity-Coveragy, hevm 등
스마트 컨트랙트 배포, 관리 툴 : Remix IDE, Tenderly, Hardhat, Truffle 등
스마트 컨트랙트 보안 관리 툴 : Slither, MythX, Mythril 등
개발망
DApp에 사용할 스마트 컨트랙트를 만들 때 배포 전 로컬 네트워크에 실행해보고 싶을 수가 있다.
이더리움 노드를 로컬로 띄울 수도 있지만, 개발에 최적화된 네트워크가 존재한다. ETH 잔액이 있는 계정을 쓸 수 있다거나 딜레이 없이 트랜잭션을 보내고 받는 등의 기능을 사용할 수 있다.
개발망 프레임워크는 Ganache, Hardhat Network 등이 있다.
Providers(이더리움 클라이언트, 노드)
클라이언트는 각 블록의 트랜잭션을 검증해 데이터를 정확하게 유지하는 역할을 한다. 클라이언트 소프트웨어를 실행하는 컴퓨터가 바로 노드가 된다.
프론트엔드 코드는 이더리움 블록체인에 있는 데이터와 코드를 사용하고, 트랜잭션을 실행하기 위해 블록체인의 노드들 중 하나와 상호작용을 해야 한다. 노드를 사용하는 방법은 크게 두 가지가 있다.
(1) 본인의 노드를 만들어 사용한다
(2) Infura, Alchemy, Quicknode 같은 노드를 사용할 수 있는 third-party 서비스를 이용한다.
third-party 서비스를 사용할 때의 장점은 본인이 노드를 셋업하는 복잡한 과정을 할 필요가 없다는 것이다. 특히 Dapp이 커질수록 전체 이더리움 블록체인을 저장하는데 들어가는 코스트가 높아지고, 이는 더 많은 노드를 필요로 해 인프라를 관리하는게 더욱 복잡해진다.
직접 노드를 실행시키면 다른 노드에 의존하지 않고 직접 트랜잭션을 검증할 수 있고, 본인의 주소나 밸런스 등을 다른 노드에게 유출하지 않아도 된다는 장점이 있다. 디앱을 배포할 때 이러한 점이 안정성에 도움이 된다.
클라이언트 소프트웨언어는 다양한 언어로 여러 오픈 소스가 있다. Geth, OpenEthereum, Nevermind, Besu 등이 있다.
Signer
Provider가 있으면 블록체인에 접속을 하고 블록체인에 저장된 상태를 읽을 수 있다. 그러나 트랜잭션을 블록체인에 실행시켜 상태를 바꾸려면 한 가지 과정이 더 필요한데, 프리이빗 키로 트랜잭션을 Sign하는 과정이다.
블로그 DApp을 상상해보자. 특정 작가가 쓴 블로그 포스트들을 검색하고 읽는 것은 블록체인에서 읽는 과정이기에 유저가 sign을 할 필요가 없다. 그러나 유저가 새로운 포스트를 체인에 올리고 싶으면, DApp은 유저에게 프리이빗 키로 트랜잭션을 사인할 것을 요청해야 한다.
트랜잭션을 사인하는 툴은 Metamask를 많이 사용한다. Metamask는 유저의 프라이빗 키를 브라우저에 저장해 프론트엔드가 유저에게 트랜잭션을 사인할 것을 요청할 때 대신해준다.
Storage(IPFS, SWARM)
블록체인에 데이터를 추가하는 것은 비싸고 시간도 든다. 이는 좋은 유저 경험을 주지 못하기 때문에 IPFS나 SWARM 같은 탈중앙화 오프 체인 스토리지 솔루션을 사용하기도 한다.
탈중앙화 스토리지 시스템은 peer to peer 네트워크로 이루어져 있다. 블록체인 베이스일수도 있고, 별개의 p2p 네트워크일수도 있다.
지속성 메커니즘 / 인센티브 구조에 따른 분류
블록체인 베이스
이더리움 자체가 탈중앙화 스토리지 시스템이지만 대용량의 데이터를 저장하기에는 적합하지 않다. 모든 노드가 블록체인의 데이터를 저장할 수 있어야 하기 때문이다.
컨트랙트 베이스
모든 노드가 데이터를 복사하고 영원히 보관할 수 없다는 것을 인정하고, 컨트랙트의 동의로 데이터를 유지한다. 컨트랙트 동의는 여러 노드들이 데이터의 일부를 특정 기간 동안 보관을 한다는 것이다. 데이터의 계약이 끝날때마다 갱신 혹은 중단해야 한다.
대부분의 경우 모든 데이터를 체인에 저장하는 대신 데이터가 체인에 위치된 곳의 해시가 저장된다.
컨트랙트 베이스의 플랫폼은 filecoin, Skynet, Storj, 0Chain 등이 있다.
기타
IPFS는 데이터, 어플리케이션, 웹사이트, 파일 등을 저장하고 접근하기 위한 분산 시스템이다. 인센티브 시스템은 없지만 위의 컨트렉트 베이스 인센티브 솔루션과 함께 사용할 수 있다.
IPFS에서 데이터를 유지하기 위한 또다른 방법은 고정 서비스(pinning service)를 사용하는 것이다. 자체 IPFS 노드를 가동시켜 네트워크에 데이터를 기여할 수 있다.