🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

MetaMask 연결하기 완벽 가이드 - 슬라이드 1/7
A

AI Generated

2025. 12. 2. · 20 Views

MetaMask 연결하기 완벽 가이드

블록체인 개발의 첫 관문인 MetaMask 지갑을 설치하고 설정하는 방법을 배웁니다. 커스텀 네트워크 추가부터 테스트 ETH 전송까지, 실습 환경을 완벽하게 구축하는 과정을 단계별로 안내합니다.


목차

  1. MetaMask_설치_및_설정
  2. 커스텀_네트워크_추가하기
  3. Chain_ID와_RPC_URL_설정
  4. 테스트_계정_Private_Key_import
  5. 테스트_ETH_확인
  6. 지갑_간_ETH_전송_테스트

1. MetaMask 설치 및 설정

블록체인 개발을 시작하려던 김개발 씨는 첫 번째 난관에 부딪혔습니다. "Web3 개발을 하려면 지갑이 필요하다는데, 도대체 지갑이 뭐지?" 선배 박시니어 씨가 웃으며 말했습니다.

"걱정 마, MetaMask만 설치하면 돼. 5분이면 충분해."

MetaMask는 브라우저에서 동작하는 암호화폐 지갑입니다. 마치 인터넷 뱅킹 앱처럼, 블록체인 네트워크와 소통하는 창구 역할을 합니다.

DApp 개발자라면 반드시 설치해야 하는 필수 도구이며, 설치 후에는 브라우저 확장 프로그램으로 언제든 접근할 수 있습니다.

다음 코드를 살펴봅시다.

// MetaMask 설치 확인 코드
async function checkMetaMaskInstalled() {
  // window.ethereum 객체가 있는지 확인합니다
  if (typeof window.ethereum !== 'undefined') {
    console.log('MetaMask가 설치되어 있습니다!');

    // MetaMask인지 구체적으로 확인
    if (window.ethereum.isMetaMask) {
      console.log('MetaMask 감지 완료');
      return true;
    }
  }

  console.log('MetaMask를 설치해주세요');
  // 설치 페이지로 안내
  window.open('https://metamask.io/download/', '_blank');
  return false;
}

김개발 씨는 입사 첫 주에 블록체인 프로젝트에 배정되었습니다. 팀장님이 말씀하셨습니다.

"우리 회사 NFT 마켓플레이스 개발에 투입될 거야. 일단 MetaMask부터 설치해." MetaMask라는 단어를 처음 들은 김개발 씨는 고개를 갸웃거렸습니다.

메타? 마스크?

뭔가 가면 같은 건가요? 박시니어 씨가 다가와 설명해주었습니다.

"MetaMask는 쉽게 말해서 디지털 지갑이야. 우리가 현금을 넣어두는 지갑처럼, 암호화폐를 보관하고 거래하는 곳이지." 그렇다면 MetaMask는 정확히 어떤 역할을 할까요?

쉽게 비유하자면, MetaMask는 마치 인터넷 뱅킹 앱과 같습니다. 은행 앱으로 잔액을 확인하고 송금하듯이, MetaMask로 이더리움 잔액을 확인하고 전송할 수 있습니다.

다만 중앙 은행이 아닌 블록체인 네트워크와 연결된다는 점이 다릅니다. MetaMask가 없던 시절, 개발자들은 어떻게 했을까요?

과거에는 블록체인과 상호작용하려면 복잡한 명령줄 도구를 사용해야 했습니다. 일반 사용자는 엄두도 내기 어려웠고, 개발자조차 테스트하기 번거로웠습니다.

보안 문제도 심각했습니다. 개인키를 직접 관리해야 했기 때문에 한 번의 실수로 모든 자산을 잃을 위험이 있었습니다.

바로 이런 문제를 해결하기 위해 MetaMask가 등장했습니다. MetaMask는 복잡한 암호화 작업을 뒤에서 처리하고, 사용자에게는 친숙한 인터페이스만 보여줍니다.

개발자 입장에서는 window.ethereum 객체 하나로 블록체인과 대화할 수 있게 되었습니다. 혁신적인 변화였습니다.

설치 방법은 매우 간단합니다. Chrome 브라우저에서 Chrome 웹 스토어에 접속합니다.

검색창에 MetaMask를 입력하고, 공식 확장 프로그램을 찾아 설치 버튼을 클릭합니다. 설치가 완료되면 브라우저 우측 상단에 여우 아이콘이 나타납니다.

처음 실행하면 시작하기 화면이 나옵니다. 새 지갑 만들기를 선택하고, 비밀번호를 설정합니다.

그 다음이 중요합니다. 시드 문구(Secret Recovery Phrase) 12개 단어가 표시됩니다.

이 단어들을 반드시 종이에 적어서 안전한 곳에 보관하세요. 컴퓨터가 고장나도 이 문구만 있으면 지갑을 복구할 수 있습니다.

위의 코드를 살펴보겠습니다. window.ethereum 객체는 MetaMask가 브라우저에 주입하는 특별한 객체입니다.

이 객체가 존재하면 MetaMask가 설치된 것입니다. isMetaMask 속성으로 다른 지갑이 아닌 MetaMask인지 정확히 확인할 수 있습니다.

실제 프로젝트에서는 이 확인 코드가 필수입니다. 사용자가 MetaMask 없이 DApp에 접속하면 아무것도 할 수 없습니다.

따라서 항상 설치 여부를 먼저 확인하고, 미설치 시 안내 메시지를 보여주는 것이 좋은 사용자 경험입니다. 김개발 씨는 MetaMask를 성공적으로 설치했습니다.

브라우저 상단의 여우 아이콘을 클릭하니 지갑 화면이 나타났습니다. "오, 생각보다 쉽네요!" 하지만 진짜 여정은 이제 시작입니다.

실전 팁

💡 - 시드 문구는 절대 온라인에 저장하지 마세요. 종이에 적어 금고에 보관하는 것이 가장 안전합니다.

  • Firefox, Brave, Edge에서도 MetaMask를 설치할 수 있습니다.

2. 커스텀 네트워크 추가하기

MetaMask를 설치한 김개발 씨가 물었습니다. "선배, 지금 이더리움 메인넷에 연결되어 있는데, 테스트는 어디서 해요?

진짜 이더리움으로요?" 박시니어 씨가 고개를 저었습니다. "아니지, 테스트용 네트워크가 따로 있어.

직접 추가해볼까?"

커스텀 네트워크란 MetaMask 기본 설정에 없는 블록체인 네트워크를 말합니다. 마치 TV 채널을 추가하듯이, 원하는 네트워크를 직접 등록할 수 있습니다.

로컬 개발 환경이나 테스트넷, 레이어2 네트워크 등을 연결할 때 필수적인 기능입니다.

다음 코드를 살펴봅시다.

// 커스텀 네트워크 추가 요청
async function addCustomNetwork() {
  try {
    // MetaMask에 네트워크 추가 요청
    await window.ethereum.request({
      method: 'wallet_addEthereumChain',
      params: [{
        chainId: '0x7A69',  // 31337 (Hardhat 기본값)
        chainName: 'Localhost 8545',
        rpcUrls: ['http://127.0.0.1:8545'],
        nativeCurrency: {
          name: 'Ethereum',
          symbol: 'ETH',
          decimals: 18
        }
      }]
    });
    console.log('네트워크 추가 완료!');
  } catch (error) {
    console.error('네트워크 추가 실패:', error);
  }
}

김개발 씨는 MetaMask 화면 상단을 클릭해보았습니다. 드롭다운 메뉴가 나타나며 여러 네트워크 이름이 보였습니다.

Ethereum Mainnet, Sepolia, Goerli 등등. 그런데 팀에서 사용하는 로컬 테스트 환경은 보이지 않았습니다.

박시니어 씨가 설명했습니다. "기본 제공되는 네트워크 외에 다른 곳에 연결하려면 수동으로 추가해야 해." 네트워크란 무엇일까요?

쉽게 비유하자면, 네트워크는 고속도로와 같습니다. 이더리움 메인넷은 실제 차가 다니는 본선 도로이고, 테스트넷은 운전 연습을 위한 연습장 도로입니다.

각 도로마다 다른 톨게이트(RPC URL)와 도로 번호(Chain ID)가 있습니다. 왜 커스텀 네트워크가 필요할까요?

개발 중에 실제 이더리움을 사용하면 큰일 납니다. 한 번의 실수로 수백만 원이 사라질 수 있습니다.

그래서 개발자들은 테스트넷이나 로컬 네트워크에서 먼저 충분히 테스트합니다. 가짜 돈으로 마음껏 실험할 수 있으니까요.

MetaMask에서 네트워크를 추가하는 방법은 두 가지입니다. 첫 번째는 수동 추가입니다.

MetaMask 설정에서 네트워크 추가를 클릭하고, 필요한 정보를 직접 입력합니다. 두 번째는 코드로 추가입니다.

DApp에서 자동으로 네트워크 추가 팝업을 띄울 수 있습니다. 위의 코드를 살펴보겠습니다.

wallet_addEthereumChain 메서드는 MetaMask에 새 네트워크를 추가하도록 요청합니다. params 배열 안에 네트워크 정보를 객체로 전달합니다.

chainId는 16진수로 표기해야 합니다. 31337은 0x7A69가 됩니다.

chainName은 MetaMask 드롭다운에 표시될 이름입니다. 알아보기 쉽게 지으면 됩니다.

rpcUrls는 블록체인 노드에 접속하는 주소입니다. 로컬 개발 시에는 보통 localhost:8545를 사용합니다.

nativeCurrency 객체도 중요합니다. 이 네트워크에서 사용하는 기본 화폐 정보입니다.

이더리움 계열 네트워크라면 ETH를 사용하고, 폴리곤이라면 MATIC을 설정합니다. decimals는 소수점 자릿수로, 대부분 18을 사용합니다.

코드를 실행하면 MetaMask 팝업이 나타납니다. 사용자에게 "이 네트워크를 추가하시겠습니까?"라고 묻습니다.

승인 버튼을 클릭하면 네트워크가 추가되고, 자동으로 해당 네트워크로 전환됩니다. 거부하면 catch 블록에서 에러를 처리합니다.

실무에서는 사용자 편의를 위해 이 기능을 적극 활용합니다. NFT 마켓플레이스가 폴리곤 네트워크에서 운영된다면, 사용자가 처음 접속할 때 자동으로 폴리곤 추가 팝업을 띄워줍니다.

사용자가 직접 복잡한 설정을 할 필요가 없어지는 것입니다. 김개발 씨는 코드를 실행해보았습니다.

MetaMask에 팝업이 뜨고, 승인을 누르자 네트워크 목록에 Localhost 8545가 추가되었습니다. "오, 자동으로 되네요!"

실전 팁

💡 - 테스트넷 정보는 공식 문서에서 확인하세요. chainlist.org에서 대부분의 네트워크 정보를 찾을 수 있습니다.

  • 네트워크 추가 시 RPC URL이 정확한지 꼭 확인하세요. 잘못된 URL은 연결 실패의 주요 원인입니다.

3. Chain ID와 RPC URL 설정

김개발 씨가 네트워크 설정 화면을 들여다보다가 질문했습니다. "Chain ID는 뭐고, RPC URL은 또 뭔가요?

그냥 아무 숫자나 넣으면 안 되나요?" 박시니어 씨가 진지하게 말했습니다. "절대 안 돼.

이 두 가지가 틀리면 완전히 다른 네트워크에 연결되거든."

Chain ID는 블록체인 네트워크의 고유 식별 번호이고, RPC URL은 그 네트워크에 접속하는 통신 주소입니다. 마치 국가 코드와 전화번호의 관계처럼, 두 가지 모두 정확해야 원하는 네트워크에 연결할 수 있습니다.

잘못 설정하면 트랜잭션이 영원히 실패하거나 자산을 잃을 수도 있습니다.

다음 코드를 살펴봅시다.

// 주요 네트워크 Chain ID와 RPC URL 정보
const NETWORK_CONFIG = {
  // 이더리움 메인넷
  ethereum: {
    chainId: '0x1',        // 1
    chainName: 'Ethereum Mainnet',
    rpcUrls: ['https://eth.llamarpc.com']
  },
  // Sepolia 테스트넷
  sepolia: {
    chainId: '0xaa36a7',   // 11155111
    chainName: 'Sepolia Testnet',
    rpcUrls: ['https://rpc.sepolia.org']
  },
  // 로컬 Hardhat
  localhost: {
    chainId: '0x7A69',     // 31337
    chainName: 'Localhost',
    rpcUrls: ['http://127.0.0.1:8545']
  }
};

김개발 씨는 Sepolia 테스트넷에 연결하려고 했습니다. 그런데 Chain ID 입력란에서 손이 멈췄습니다.

11155111? 이게 대체 무슨 숫자일까요?

박시니어 씨가 설명을 시작했습니다. "Chain ID는 네트워크의 주민등록번호 같은 거야." 좀 더 쉽게 비유해볼까요?

전 세계 국가마다 국가 코드가 있습니다. 한국은 82, 미국은 1, 일본은 81입니다.

이처럼 블록체인 세계에서도 각 네트워크마다 고유한 번호가 있습니다. 이더리움 메인넷은 1번, Sepolia는 11155111번, Hardhat 로컬은 31337번입니다.

왜 이렇게 번호가 필요할까요? 리플레이 어택을 막기 위해서입니다.

만약 Chain ID가 없다면, 메인넷에서 보낸 트랜잭션을 테스트넷에서도 똑같이 실행할 수 있습니다. 해커가 이를 악용하면 큰 피해가 발생합니다.

Chain ID가 트랜잭션에 포함되어 서명되므로, 다른 네트워크에서는 유효하지 않게 됩니다. 그렇다면 RPC URL은 무엇일까요?

RPC는 Remote Procedure Call의 약자입니다. 쉽게 말해 블록체인 노드에 명령을 전달하는 전화번호입니다.

이 URL로 요청을 보내면, 블록체인 노드가 응답을 돌려줍니다. 잔액 조회, 트랜잭션 전송 등 모든 작업이 이 URL을 통해 이루어집니다.

MetaMask에서 Chain ID는 16진수로 입력합니다. 일반 숫자 1은 0x1로, 11155111은 0xaa36a7로 변환해야 합니다.

다행히 MetaMask가 자동 변환해주는 경우도 있지만, 코드에서는 16진수를 직접 사용하는 것이 안전합니다. 위의 코드를 보면 세 가지 네트워크 설정이 있습니다.

이더리움 메인넷은 Chain ID가 1입니다. 가장 중요한 실제 네트워크이므로 1번을 받았습니다.

Sepolia는 현재 가장 활발한 테스트넷입니다. 로컬호스트는 Hardhat이나 Ganache로 로컬에서 실행하는 개발용 네트워크입니다.

RPC URL 선택도 중요합니다. 공개 RPC는 무료지만 속도가 느리고 요청 제한이 있습니다.

프로덕션에서는 InfuraAlchemy 같은 유료 서비스를 사용하는 것이 좋습니다. 이들은 안정적인 연결과 높은 처리량을 보장합니다.

로컬 개발 시에는 127.0.0.1:8545를 사용합니다. Hardhat이나 Ganache를 실행하면 이 포트에서 로컬 블록체인 노드가 동작합니다.

외부 네트워크 없이도 모든 기능을 테스트할 수 있어 개발 초기 단계에서 매우 유용합니다. 김개발 씨가 이해한 표정을 지었습니다.

"아, Chain ID는 어떤 네트워크인지 알려주는 번호이고, RPC URL은 그 네트워크에 접속하는 주소군요!" 박시니어 씨가 엄지를 치켜세웠습니다. "정확해!"

실전 팁

💡 - chainlist.org에서 수백 개 네트워크의 Chain ID와 RPC URL을 확인할 수 있습니다.

  • 로컬 개발 시 Chain ID 충돌을 피하기 위해 31337(Hardhat 기본값)을 권장합니다.
  • 메인넷 Chain ID(1)로 테스트하지 마세요. 실수로 실제 자산을 잃을 수 있습니다.

4. 테스트 계정 Private Key import

로컬 네트워크 설정을 마친 김개발 씨가 지갑을 열어보니 잔액이 0 ETH였습니다. "어?

테스트 이더는 어디 있죠?" 박시니어 씨가 말했습니다. "Hardhat이 미리 만들어둔 테스트 계정이 있어.

Private Key를 가져와서 MetaMask에 등록하면 돼."

Private Key는 지갑의 비밀 열쇠입니다. 이 키만 있으면 해당 지갑의 모든 자산을 통제할 수 있습니다.

Hardhat 같은 로컬 개발 도구는 테스트용으로 미리 충전된 계정들을 제공하는데, 이 계정들의 Private Key를 MetaMask에 가져오면 바로 개발에 사용할 수 있습니다.

다음 코드를 살펴봅시다.

// Hardhat 기본 테스트 계정 (절대 실제 자산 보관 금지!)
const HARDHAT_TEST_ACCOUNTS = [
  {
    address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
    // 아래 키는 공개된 테스트용 키입니다
    privateKey: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
    balance: '10000 ETH'
  },
  {
    address: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',
    privateKey: '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d',
    balance: '10000 ETH'
  }
];
// MetaMask에서 Import Account로 privateKey 입력

김개발 씨는 터미널에서 npx hardhat node 명령을 실행했습니다. 화면에 여러 계정 정보가 쏟아져 나왔습니다.

Account #0, Account #1... 각각 주소와 Private Key, 그리고 10000 ETH라는 잔액이 표시되어 있었습니다.

"이 10000 ETH를 MetaMask에서 쓰려면 어떻게 하죠?" 박시니어 씨가 설명했습니다. "MetaMask에 계정을 가져오기 하면 돼.

Private Key만 있으면 가능해." Private Key가 정확히 뭘까요? 비유하자면, Private Key는 금고 비밀번호와 같습니다.

금고 주소(공개 주소)는 누구나 알아도 되지만, 비밀번호(Private Key)는 절대 노출되면 안 됩니다. 비밀번호를 아는 사람은 금고를 열고 안의 모든 것을 가져갈 수 있으니까요.

Private Key의 형태를 살펴보겠습니다. 0x로 시작하는 64자리 16진수 문자열입니다.

총 66글자(0x 포함)로, 엄청나게 긴 숫자처럼 보입니다. 이 숫자에서 수학적으로 공개 주소가 생성됩니다.

반대로 주소에서 Private Key를 알아내는 것은 현재 기술로 불가능합니다. MetaMask에서 계정을 가져오는 방법은 간단합니다.

먼저 MetaMask를 열고 우측 상단의 계정 아이콘을 클릭합니다. Add account or hardware wallet을 선택합니다.

Import account를 클릭하면 Private Key 입력란이 나타납니다. Hardhat에서 복사한 키를 붙여넣고 Import 버튼을 누릅니다.

잠깐, 중요한 경고가 있습니다. Hardhat이 제공하는 테스트 계정의 Private Key는 전 세계에 공개된 키입니다.

모든 개발자가 같은 키를 사용합니다. 따라서 이 계정에 실제 이더리움이나 NFT를 절대 보관하면 안 됩니다.

누구나 가져갈 수 있습니다! 위의 코드에서 두 개의 테스트 계정을 볼 수 있습니다.

Account #0의 주소는 0xf39F로 시작합니다. Hardhat 튜토리얼이나 문서에서 자주 보게 될 익숙한 주소입니다.

각 계정에는 10000 ETH가 미리 들어있어서 가스비 걱정 없이 마음껏 테스트할 수 있습니다. 계정을 가져온 후에는 이름을 변경하는 것이 좋습니다.

MetaMask에서 계정 이름을 Hardhat Test #0 같이 명확하게 바꿔두세요. 나중에 실수로 이 계정을 메인넷에서 사용하는 불상사를 막을 수 있습니다.

김개발 씨는 Private Key를 복사하여 MetaMask에 붙여넣었습니다. Import 버튼을 누르자 새 계정이 추가되었고, 네트워크를 Localhost로 바꾸니 10000 ETH가 표시되었습니다.

"와, 진짜 부자가 된 것 같아요!" 박시니어 씨가 웃었습니다. "테스트넷 부자지만!"

실전 팁

💡 - 실제 자산이 있는 지갑의 Private Key는 절대 어디에도 입력하지 마세요. 피싱 사이트의 주요 공격 방식입니다.

  • Hardhat 테스트 계정을 구분하기 쉽게 MetaMask에서 이름을 변경해두세요.

5. 테스트 ETH 확인

계정을 가져온 김개발 씨가 MetaMask를 확인했습니다. "어라, 0 ETH로 나오는데요?" 박시니어 씨가 물었습니다.

"혹시 네트워크가 메인넷으로 되어있지 않아?" 김개발 씨가 확인하니 정말 그랬습니다. "아, Localhost로 바꿔야 하는구나!"

테스트 ETH는 올바른 네트워크에 연결되어야만 확인할 수 있습니다. MetaMask는 네트워크별로 잔액을 따로 보여주므로, Hardhat 로컬 네트워크의 잔액을 보려면 해당 네트워크로 전환해야 합니다.

또한 코드로 잔액을 조회하는 방법도 익혀두면 DApp 개발에 유용합니다.

다음 코드를 살펴봅시다.

// 현재 계정의 ETH 잔액 조회
async function getBalance() {
  // 연결된 계정 주소 가져오기
  const accounts = await window.ethereum.request({
    method: 'eth_requestAccounts'
  });

  // 잔액 조회 (Wei 단위로 반환)
  const balanceWei = await window.ethereum.request({
    method: 'eth_getBalance',
    params: [accounts[0], 'latest']
  });

  // Wei를 ETH로 변환 (1 ETH = 10^18 Wei)
  const balanceEth = parseInt(balanceWei, 16) / 1e18;
  console.log(`잔액: ${balanceEth} ETH`);

  return balanceEth;
}

김개발 씨는 10000 ETH가 들어있다는 테스트 계정을 가져왔는데, MetaMask에는 0 ETH로 표시되었습니다. 분명 Private Key도 맞게 입력했는데 왜 그럴까요?

박시니어 씨가 화면을 가리키며 말했습니다. "여기 봐, 네트워크가 Ethereum Mainnet으로 되어있잖아." 이해를 돕기 위해 비유를 들어보겠습니다.

같은 은행에 원화 계좌와 달러 계좌가 있다고 생각해보세요. 원화 계좌를 조회하면 달러 잔액이 안 보입니다.

마찬가지로 MetaMask에서 메인넷을 보면 로컬넷의 잔액이 보이지 않습니다. 각 네트워크는 완전히 별개의 세계입니다.

네트워크 전환은 간단합니다. MetaMask 상단의 네트워크 드롭다운을 클릭합니다.

앞서 추가한 Localhost 8545를 선택합니다. 네트워크가 전환되면 잔액이 업데이트됩니다.

10000 ETH가 표시되면 성공입니다! 하지만 주의할 점이 있습니다.

로컬 네트워크에 연결하려면 Hardhat 노드가 실행 중이어야 합니다. 터미널에서 npx hardhat node가 동작하고 있어야 MetaMask가 연결할 수 있습니다.

노드가 꺼져있으면 연결 오류가 발생합니다. 위의 코드는 잔액을 프로그래밍으로 조회하는 방법입니다.

먼저 eth_requestAccounts로 연결된 계정 주소를 가져옵니다. 이 메서드를 호출하면 MetaMask 팝업이 뜨고, 사용자가 승인하면 계정 주소가 반환됩니다.

처음 연결할 때 한 번만 승인하면 됩니다. 다음으로 eth_getBalance를 호출합니다.

첫 번째 파라미터는 조회할 주소, 두 번째는 어느 시점의 잔액인지입니다. 'latest'는 가장 최신 블록 기준입니다.

반환값은 Wei 단위의 16진수 문자열입니다. Wei는 ETH의 가장 작은 단위입니다.

1 ETH = 1,000,000,000,000,000,000 Wei (10의 18승)입니다. 소수점 계산의 정확성을 위해 블록체인에서는 항상 정수인 Wei를 사용합니다.

코드에서 parseInt로 16진수를 10진수로 변환하고, 10의 18승으로 나눠 ETH 단위로 바꿉니다. 실제 DApp에서는 이 코드가 핵심입니다.

사용자가 서비스에 접속하면 먼저 지갑 연결을 요청하고, 잔액을 조회하여 화면에 표시합니다. 잔액이 부족하면 거래를 진행하기 전에 미리 알려줄 수 있습니다.

김개발 씨가 네트워크를 Localhost로 변경하자 10000 ETH가 나타났습니다. 코드로도 조회해보니 콘솔에 정확히 같은 값이 출력되었습니다.

"이제 테스트 환경이 제대로 갖춰진 것 같아요!"

실전 팁

💡 - Hardhat 노드를 재시작하면 잔액이 초기화됩니다. 배포한 컨트랙트도 사라지므로 주의하세요.

  • 큰 숫자 계산 시 JavaScript의 정밀도 문제가 있으므로, 실제 프로젝트에서는 ethers.js의 formatEther 함수를 사용하세요.

6. 지갑 간 ETH 전송 테스트

모든 설정을 마친 김개발 씨가 말했습니다. "이제 진짜 블록체인답게 뭔가 해보고 싶어요.

돈을 보내본다든지..." 박시니어 씨가 웃으며 말했습니다. "그럼 테스트 계정끼리 ETH를 전송해볼까?

블록체인의 핵심 기능이니까."

ETH 전송은 블록체인의 가장 기본적인 기능입니다. 한 지갑에서 다른 지갑으로 가치를 이동시키는 것이죠.

이 과정에서 트랜잭션이 생성되고, 블록에 기록되며, 가스비가 차감됩니다. MetaMask UI로 쉽게 할 수도 있고, 코드로 자동화할 수도 있습니다.

다음 코드를 살펴봅시다.

// 다른 주소로 ETH 전송하기
async function sendETH(toAddress, amountInEth) {
  // 보내는 계정 가져오기
  const accounts = await window.ethereum.request({
    method: 'eth_requestAccounts'
  });

  // ETH를 Wei로 변환 (16진수)
  const amountWei = '0x' + (amountInEth * 1e18).toString(16);

  // 트랜잭션 전송 요청
  const txHash = await window.ethereum.request({
    method: 'eth_sendTransaction',
    params: [{
      from: accounts[0],
      to: toAddress,
      value: amountWei
    }]
  });

  console.log('트랜잭션 해시:', txHash);
  return txHash;
}
// 사용 예: sendETH('0x70997970...', 1);

김개발 씨는 두 번째 Hardhat 테스트 계정도 MetaMask에 가져왔습니다. Account #0에 10000 ETH, Account #1에도 10000 ETH가 있었습니다.

이제 Account #0에서 Account #1로 1 ETH를 보내보기로 했습니다. ETH 전송은 어떻게 이루어질까요?

은행 송금을 생각해보세요. 내 계좌에서 상대방 계좌로 돈을 보내려면 보내는 계좌, 받는 계좌, 금액이 필요합니다.

블록체인도 마찬가지입니다. 추가로 가스비라는 수수료가 필요합니다.

네트워크를 사용하는 대가입니다. MetaMask UI로 전송하는 방법은 직관적입니다.

MetaMask를 열고 Send 버튼을 클릭합니다. 받는 사람 주소를 입력하고, 보낼 금액을 입력합니다.

가스비를 확인하고 Confirm 버튼을 누르면 트랜잭션이 전송됩니다. 잠시 후 완료 알림이 표시됩니다.

하지만 DApp 개발자라면 코드로 전송하는 방법도 알아야 합니다. 위의 코드에서 eth_sendTransaction 메서드를 사용합니다.

이 메서드를 호출하면 MetaMask 팝업이 뜨고, 사용자가 승인해야만 트랜잭션이 실행됩니다. 사용자 동의 없이는 절대 돈이 빠져나가지 않습니다.

params 객체를 살펴보겠습니다. from은 보내는 주소입니다.

반드시 MetaMask에 연결된 계정이어야 합니다. to는 받는 주소입니다.

아무 이더리움 주소나 가능합니다. value는 보낼 금액으로, Wei 단위의 16진수입니다.

Wei 변환 과정이 중요합니다. 1 ETH를 보내려면 1에 10의 18승을 곱해 Wei로 만듭니다.

그리고 toString(16)으로 16진수 문자열로 변환합니다. 앞에 0x를 붙여 16진수임을 표시합니다.

트랜잭션이 성공하면 트랜잭션 해시가 반환됩니다. 이 해시는 트랜잭션의 고유 식별자입니다.

나중에 이 해시로 트랜잭션 상태를 조회하거나, 블록 탐색기에서 상세 정보를 확인할 수 있습니다. 로컬 네트워크에서는 거의 즉시 처리되지만, 메인넷에서는 수십 초가 걸릴 수 있습니다.

실제로 전송해보겠습니다. 김개발 씨는 코드를 실행했습니다.

MetaMask 팝업이 뜨며 트랜잭션 내용을 보여주었습니다. 가스비까지 확인하고 Confirm을 누르자, 잠시 후 콘솔에 트랜잭션 해시가 출력되었습니다.

Account #1로 전환하여 잔액을 확인하니 10001 ETH가 되어있었습니다. Account #0은 9999 ETH 조금 안 되는 금액이었습니다.

가스비가 차감되었기 때문입니다. 김개발 씨가 환호했습니다.

"와, 진짜 블록체인에서 돈이 움직였어요!" 박시니어 씨가 고개를 끄덕였습니다. "축하해, 이제 기본기는 끝났어.

스마트 컨트랙트 배포는 다음 시간에 배워보자."

실전 팁

💡 - 트랜잭션 실패 시 가스비는 소모되므로, 테스트 시에는 넉넉한 잔액을 유지하세요.

  • ethers.js나 web3.js 라이브러리를 사용하면 Wei 변환을 자동으로 처리해줘서 훨씬 편리합니다.
  • 로컬 네트워크에서 충분히 테스트한 후에 테스트넷, 그 다음에 메인넷 순서로 진행하세요.

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Ethereum#MetaMask#Web3#Wallet#DApp#Blockchain,Ethereum

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.