EVM 기반 dApp을 루트스탁에 이식하는 법

https://dev.rootstock.io/resources/port-to-rootstock/ethereum-dapp/
이더리움 디앱을 루트스탁에 이식하는 법
이 글은 Rootstock의 큰 강점인 EVM 호환성을 활용해 기존 EVM 기반 체인에 배포된 dApp을 루트스탁에 이식하는 튜토리얼을 위해 작성 되었습니다.
시작하기
필수 조건
시작하기 전에, 아래 조건들을 만족해야 합니다.
Node.js
HardHat 하드햇이 없으면 하드햇 설치
npm i -g hardhat
저는 대표적인 evm 디앱 중 프레딕션 마켓 컨트랙트를 루트스탁에 배포해보겠습니다.
하드햇 프로젝트 만들기
새로운 프로젝트 디렉토리를 만듭니다.
mkdir rsk-hardhat-example
cd rsk-hardhat-example
하드햇 프로젝트로 initialize 합니다.
npx hardhat init
프레임워크를 선택합니다. 아래와 같은 화면이 뜨면 Create a Typescript project를 선택하고 엔터를 누릅니다.
저는 이렇게 세팅해줬습니다.
정상적으로 모든 절차가 마무리 되면 프로젝트 디렉토리 구조는 다음과 같을 것입니다.
contracts/
ignition/modules/
test/
hardhat.config.ts
- 하드햇 ignition과 타입스크립트를 설치해줍니다.
npm install --save-dev @nomicfoundation/hardhat-ignition-ethers typescript
hardhat.config.ts는 이런 형식일 것입니다.
//hardhat.config.ts
import type { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import "@nomicfoundation/hardhat-ignition-ethers";
const config: HardhatUserConfig = {
solidity: "0.8.28",
};
export default config;
루트스탁 네트워크 설정
루트스탁 체인에 로컬에서 배포하려면 RPC URL과 배포에 사용할 지갑의 Private key가 필요합니다.
RPC URL은 다른 체인과는 다르게 직접 대시보드에서 회원가입하고 API Key 형식으로 발급받아야합니다.
https://dashboard.rpc.rootstock.io/dashboard 위 링크에서 발급받을 수 있습니다.
테스트넷에서 rpc url은 이런 형식이어야 합니다: https://rpc.testnet.rootstock.io/<API-KEY>
안전하게 환경변수를 저장하기 위해서 .env
파일을 사용하거나 hardhat configuration variables를 사용할 수 있습니다. npx hardhat vars set TESTNET_RPC_URL
위 명령어를 통해 hardhat 환경변수를 저장할 수 있습니다.
rpc url을 저장할 땐 반드시 https 링크 형식으로 저장되어야합니다.
For example,
https://rpc.testnet.rootstock.io/eOQAoxAI7Bt6zZ6blwOdMjQQIzKwSW-W
(Where eOQAoxAI7Bt6zZ6blwOdMjQQIzKwSW-W is your API-KEY)
저는 .env
파일에 저장하도록 하겠습니다.
//hardhat.config.ts
import type { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import "@nomicfoundation/hardhat-ignition-ethers";
const config: HardhatUserConfig = {
solidity: "0.8.20",
networks: {
// Testnet configuration
rskTestnet: {
url: `https://rpc.testnet.rootstock.io/${process.env.API_KEY}`,
accounts: [process.env.PRIVATE_KEY || ""],
},
},
};
export default config;
그 다음엔 hardhat.config.ts 파일에 networks로 세팅을 해주면 됩니다. 참고로 저는 solidity 컴파일 버전을 0.8.20으로 했습니다.
EVM 컨트랙트 코드 복사
기존에 있던 컨트랙트 코드를 contracts/
폴더에 복사해서 넣습니다. 저는 제가 사용하던 프레딕션 마켓 코드를 Betmeme.sol 파일에 붙여넣겠습니다.
test 코드도 작성해서 test/
폴더에 넣어서 코드를 테스트 할 수 있습니다.
컨트랙트 컴파일
npx hardhat compile
을 실행하면 contracts/
폴더에 있는 코드를 모두 컴파일 해줍니다. 성공적으로 컴파일 되면 아래와 같은 화면이 출력됩니다.
- *주의할 점: hardhat.config.ts 파일에서 환경변수를 불러오지 못할 때는
dotenv
패키지를 설치해서 사용하거나, hardhat configuration variables를vars.get()
으로 불러와서 사용할 수 있습니다.
//hardhat.config.ts
import * as dotenv from "dotenv";
import type { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import "@nomicfoundation/hardhat-ignition-ethers";
dotenv.config();
const config: HardhatUserConfig = {
solidity: "0.8.20",
networks: {
// Testnet configuration
rskTestnet: {
url: `https://rpc.testnet.rootstock.io/${process.env.API_KEY}`,
accounts: [process.env.PRIVATE_KEY || ""],
},
},
};
export default config;
hardhat configuration variables를 사용하려면 import {vars} from "hardhat/config";
accounts: [vars.get("PRIVATE_KEY")],
와 같이 사용하면 됩니다. 여기서 get 할 때 이름은 npx hardhat vars set TESTNET_RPC_URL
이 때 사용한 이름이어야 합니다.
컨트랙트 테스트
test를 하려면 아래 명령어를 터미널에 실행하면 됩니다. npx hardhat test
컨트랙트를 루트스탁에 배포
배포하기 전에 아래 사항들을 점검해야 합니다.
충분한 지갑 잔액 지갑에 배포를 위한 가스비가 충분히 있어야 합니다. faucet은 아래 링크에서 받을 수 있습니다. promo code란은 무시해도 됩니다. https://faucet.rootstock.io/
배포 스크립트 작성 Betmeme.ts를
ignition/modules
폴더에 생성하고 작성해야 합니다.
// ignition/modules/Betmeme.ts
import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";
const BetMemeModule = buildModule("BetMemeModule", (m) => {
const betMeme = m.contract("BetMeme");
return { betMeme };
});
export default BetMemeModule;
제가 사용한 예시 코드입니다. 여기서 중요한 코드는 m.contract()입니다. 여기서 컨트랙트 코드 내에서 정의한 컨트랙트 이름을 넣어야 합니다. 왜냐하면 컴파일을 한 컨트랙트의 artifact 기준으로 배포되기 때문에 철자를 틀리지 않도록 주의해야 합니다.
준비가 완료 되면 아래 명령어를 사용해 배포를 실행합니다.
npx hardhat ignition deploy ignition/modules/Betmeme.ts --network rskTestnet
배포 완료 체인 아이디를 보여주며 (31) 루트스탁 테스트넷에 배포하냐고 물으면 yes라고 타이핑 하시면 됩니다.
저처럼 IgnitionError: IGN401 에러가 나면 커맨드를 한번 더 시도하면 됩니다.
배포가 완료되면 이렇게 컨트랙트 주소가 나옵니다.
이렇게 EVM 기반에서 사용하던 dapp의 컨트랙트를 Rootstock에도 배포를 해 봤습니다.
Rootstock의 Bitcoin 보안 상속, 낮은 가스비, 빠른 트랜잭션 처리 속도, evm 호환성 등 여러 조건을 생각했을 dapp을 rootstock에 배포해서 bitcoin 생태계에 내재된 커다란 tvl을 활용할 방법을 찾아보는 것도 좋을 것 같습니다. 🥳
궁금한 점은 댓글로 남겨주세요.
Subscribe to my newsletter
Read articles from 이찬호 directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
