Ver2.5 내 손으로 만드는 디지털 자산, ERC-20 토큰 개발부터 배포까지 A to Z

내 손으로 만드는 디지털 자산, ERC-20 토큰 개발부터 배포까지 A to Z
코딩 1도 몰라도 괜찮아! 친구처럼 친절하게 떠먹여주는 블록체인 개발 실전 가이드 🚀
들어가며: 코인 만들기, 정말 '너두' 할 수 있을까? 🤔
"비트코인", "이더리움", "NFT"...
뉴스만 틀면 나오는 이 단어들, 이제는 너무 익숙하죠? 블록체인과 암호화폐는 더 이상 소수 IT 전문가들만의 전유물이 아닌, 우리 삶 깊숙이 파고든 하나의 거대한 금융/핀테크 트렌드가 되었습니다.
혹시 이런 생각해 본 적 없으신가요?
"나도 나만의 코인을 만들어볼 수 있을까?"
친구들끼리만 사용하는 재미있는 포인트 토큰, 우리 동아리 활동을 증명하는 멤버십 토큰, 혹은 세상을 바꿀 혁신적인 아이디어를 담은 새로운 프로젝트의 시작점까지! 상상만 해도 가슴이 뛰지 않나요?
결론부터 말하자면, "네, 가능합니다!" 그것도 생각보다 훨씬 더 간단하게요. 🤯
물론, 수조 원의 가치를 지닌 비트코인이나 이더리움 같은 '코인(메인넷 코인)'을 밑바닥부터 만드는 것은 정말 어려운 일입니다. 하지만 이더리움이라는 거대한 플랫폼 위에서 동작하는 '토큰'을 만드는 것은 잘 짜인 레시피를 따라 요리하는 것과 같아요.
이 글은 바로 그 '레시피'를 여러분에게 알려드리기 위해 태어났습니다.
우리는 블록체인 세계의 '표준 규격'과도 같은 ERC-20이라는 규칙을 따라 우리만의 토큰을 만들고, 전 세계 누구나 볼 수 있는 블록체인 네트워크에 직접 배포해보는 여정을 함께할 거예요.
코딩 경험이요? 없어도 괜찮아요. 개발자 친구가 옆에서 하나하나 알려주듯, 최대한 쉽고 재미있게 설명해 드릴게요.
자, 이제부터 당신은 단순한 사용자가 아닌, 블록체인 생태계를 직접 만들어가는 '빌더(Builder)'가 되는 겁니다. 준비되셨나요? 그럼, 지금 바로 시작해봅시다! 🚀
ERC-20은 'Ethereum Request for Comment 20'의 약자로, 이더리움 블록체인 위에서 토큰이 따라야 할 일종의 '기술 표준'이에요. 쉽게 말해, 세상의 모든 충전기가 'USB-C' 타입으로 통일되면 어떤 기기든 쉽게 충전할 수 있는 것처럼, 모든 토큰이 ERC-20이라는 규칙을 따르면 어떤 지갑이나 거래소에서도 쉽게 호환될 수 있는 거죠. 이 표준 덕분에 이더리움 생태계가 폭발적으로 성장할 수 있었답니다!
1단계: 실전 준비! 개발 환경 세팅하기 🛠️
요리를 시작하기 전에 재료 손질과 조리 도구 준비가 필수인 것처럼, 우리도 토큰 개발을 위한 최소한의 환경을 세팅해야 합니다. 걱정 마세요! 복잡한 프로그램을 설치할 필요 없이, 웹 브라우저만 있으면 대부분 해결된답니다.
1-1. 나만의 디지털 금고, 메타마스크(MetaMask) 지갑 설치
메타마스크는 이더리움 블록체인과 상호작용하기 위한 필수 관문입니다. 우리가 만든 토큰을 보관할 '지갑'이자, 블록체인에 "이 토큰 좀 만들어줘!"라고 명령을 내릴 때 필요한 '서명 도구'이기도 하죠.
1. 설치하기: 크롬, 파이어폭스, 엣지 등 사용하는 웹 브라우저에서 '메타마스크'를 검색하거나 공식 사이트(metamask.io)에 접속해 확장 프로그램을 설치해주세요. 여우 모양 아이콘이 보이면 성공! 🦊
2. 지갑 생성: '새 지갑 생성'을 선택하고, 안내에 따라 비밀번호를 설정하세요.
3. 🚨 가장 중요한 단계! 비밀 복구 구문(Secret Recovery Phrase) 백업: 12개의 영어 단어로 이루어진 비밀 복구 구문이 나타날 거예요. 이건 여러분 지갑의 '마스터 키'입니다. 절대, 절대로 컴퓨터에 파일로 저장하거나 스크린샷을 찍어두지 마세요. 해킹의 직접적인 원인이 됩니다. 꼭! 물리적인 종이에 순서대로 적어서 아무도 모르는 안전한 곳에 보관해야 합니다. 이 구문만 있으면 전 세계 어디서든 여러분의 지갑을 복구할 수 있지만, 반대로 이게 유출되면 모든 자산을 잃게 됩니다.
4. 구문 확인: 백업한 구문을 순서대로 클릭하여 확인하면 지갑 생성이 완료됩니다. 축하해요! 이제 여러분만의 블록체인 지갑이 생겼습니다.
1-2. 테스트넷과 테스트 이더(ETH) 받기
우리가 만든 토큰을 바로 실제 돈이 오가는 '메인넷(Mainnet)'에 올리는 건 너무 위험하겠죠? 코드를 잘못 작성했을 수도 있고, 실수로 엄청난 수수료(가스비)를 내야 할 수도 있으니까요.
그래서 개발자들은 '테스트넷(Testnet)'이라는 모의 환경에서 충분히 실험을 합니다. 테스트넷은 실제 이더리움 블록체인과 거의 똑같이 작동하지만, 여기서 사용되는 이더(ETH)는 진짜 돈이 아닌 공짜 '테스트용 이더'예요.
1. 테스트 네트워크 표시: 메타마스크 우측 상단의 네트워크 선택 메뉴에서 '설정' > '고급'으로 이동하여 '테스트 네트워크 표시'를 활성화해주세요.
2. 세폴리아(Sepolia) 테스트넷 선택: 다시 네트워크 메뉴로 돌아가 'Sepolia'를 선택합니다. 이제 여러분의 지갑은 테스트 환경에 연결되었습니다.
3. 테스트 이더 받기 (수도꼭지, Faucet): 테스트넷에서 활동하려면 수수료로 낼 가짜 이더가 필요해요. 'Sepolia Faucet'이라고 구글에 검색하면 여러 사이트가 나옵니다. (예: sepoliafaucet.com, alchemy.com/faucets/ethereum-sepolia 등) 이런 사이트를 '수도꼭지(Faucet)'라고 불러요.
- 사이트에 접속해서 여러분의 메타마스크 지갑 주소(0x로 시작하는 긴 주소, 클릭하면 복사됩니다)를 붙여넣고 'Send Me ETH' 같은 버튼을 누르면, 잠시 후 여러분의 지갑으로 0.1 ~ 0.5 정도의 테스트용 Sepolia ETH가 들어올 거예요. 이제 토큰을 배포할 준비 자금이 마련되었습니다! 💰
이더리움은 전 세계 수많은 컴퓨터(노드)가 함께 운영하는 거대한 분산 컴퓨터예요. 우리가 토큰을 만들거나 전송하는 등의 작업을 요청하면, 이 컴퓨터들이 일을 처리해주죠. '가스비'는 바로 이들에게 지불하는 수수료, 즉 '수고비'입니다. 네트워크가 붐빌수록, 복잡한 작업을 요청할수록 가스비는 비싸져요. 자동차가 움직이려면 기름이 필요한 것과 같은 원리랍니다!
1-3. 코딩 놀이터, 리믹스(Remix) IDE 접속
이제 코드를 작성하고 실행할 공간이 필요하겠죠? 예전에는 복잡한 개발 도구를 컴퓨터에 설치해야 했지만, 지금은 웹 브라우저에서 모든 것이 가능한 멋진 세상입니다.
'리믹스 IDE(Remix IDE)'는 이더리움 스마트 컨트랙트(우리가 만들 토큰 코드도 스마트 컨트랙트의 일종이에요)를 위한 공식 웹 기반 통합 개발 환경입니다. 그냥 웹사이트에 접속하기만 하면 끝이에요!
- 주소창에 remix.ethereum.org 를 입력하고 접속하세요.
화면 왼쪽에 파일 탐색기, 가운데에 코드 편집기, 그리고 컴파일 및 배포를 위한 도구들이 보일 거예요. 처음에는 조금 복잡해 보일 수 있지만, 우리가 사용할 기능은 몇 개 안 되니 걱정하지 마세요.
자, 이제 모든 준비가 끝났습니다. 메타마스크 지갑, 테스트용 총알(ETH), 그리고 코딩 놀이터 리믹스까지! 본격적으로 ERC-20의 세계로 뛰어들어 볼까요?
2단계: ERC-20 표준, 제대로 파헤치기 🧐
코드를 작성하기 전에, 우리가 만들고자 하는 '설계도'인 ERC-20에 대해 조금만 더 깊이 알아봅시다. 이 부분을 이해하면 단순히 코드를 복사-붙여넣기 하는 것을 넘어, "아, 이 코드가 이런 역할을 하는구나!" 하고 깨닫게 될 거예요.
ERC-20 표준은 크게 6개의 필수 함수(Function)와 2개의 필수 이벤트(Event)로 구성되어 있습니다. 모든 ERC-20 토큰은 반드시 이 기능들을 포함해야만 해요.
2-1. ERC-20의 핵심 기능들 (Functions)
이 함수들은 토큰의 기본적인 움직임을 정의합니다. 누가 얼마나 가졌고, 어떻게 보내고, 또 어떻게 위임하는지 등을 말이죠.
1. `totalSupply()`
- 역할: 이 토큰이 총 몇 개나 발행되었는지 알려줍니다.
- 예시: 우리가 '재능코인'을 총 100만 개 발행했다면, `totalSupply()`를 호출하면 1,000,000이라는 숫자가 반환됩니다.
2. `balanceOf(address account)`
- 역할: 특정 지갑 주소(account)가 토큰을 몇 개나 가지고 있는지 알려줍니다.
- 예시: 내 지갑 주소를 넣고 `balanceOf()`를 호출하면, 내가 가진 '재능코인'의 수량을 확인할 수 있죠.
3. `transfer(address recipient, uint256 amount)`
- 역할: 내가 가진 토큰을 다른 사람(recipient)에게 특정 수량(amount)만큼 보냅니다.
- 예시: 친구에게 '재능코인' 100개를 보내고 싶을 때 사용하는 가장 기본적인 송금 기능입니다.
4. `approve(address spender, uint256 amount)`
- 역할: 내 토큰 중 일부(amount)를 다른 사람이나 다른 스마트 컨트랙트(spender)가 대신 사용할 수 있도록 '허락(승인)'해주는 기능입니다.
- 중요성: 이게 왜 필요할까요? 바로 다른 서비스(DeFi, 게임 등)와 상호작용하기 위해서입니다. 예를 들어, 탈중앙화 거래소(DEX)에서 내 '재능코인'을 다른 코인과 바꾸려면, 거래소 컨트랙트가 내 지갑에서 '재능코인'을 가져갈 수 있도록 미리 허락해줘야겠죠? 그때 `approve` 함수가 쓰입니다.
5. `allowance(address owner, address spender)`
- 역할: 특정 소유자(owner)가 특정 사용자(spender)에게 얼마만큼의 토큰을 사용하도록 허락했는지 그 '허용량'을 확인합니다.
- 예시: 위에서 내가 거래소에 1,000개의 '재능코인' 사용을 허락했다면, `allowance(내 주소, 거래소 주소)`를 호출하면 1,000이 반환됩니다.
6. `transferFrom(address sender, address recipient, uint256 amount)`
- 역할: `approve`로 허락받은 양 내에서, 내가(spender) 다른 사람(sender)의 토큰을 또 다른 사람(recipient)에게 보냅니다.
- 예시: 탈중앙화 거래소가 `approve`로 허락받은 내 '재능코인' 1,000개 중 500개를, 나와 거래하는 상대방에게 보내줄 때 이 함수를 사용합니다. 즉, 제3자가 승인 하에 토큰을 이동시키는 핵심 기능이죠.
이 두 가지 방식의 차이를 이해하는 것이 ERC-20의 핵심입니다!
- `transfer`: 나 → 너 (A가 B에게 직접 보내는 가장 간단한 송금)
- `approve` + `transferFrom`: 나 → (C가 대신) → 너 (A가 C에게 "내 돈 100원까지는 네가 대신 B에게 보내도 돼"라고 허락하고, C가 그 권한을 사용해 A의 돈을 B에게 보내는 방식). 이 방식 덕분에 스마트 컨트랙트를 통한 자동화된 거래가 가능해집니다!
2-2. 블록체인의 발자국, 이벤트(Events)
이벤트는 블록체인 상에서 어떤 중요한 일이 일어났을 때, 그 기록을 남기고 외부에 알려주는 역할을 합니다. 마치 은행 앱에서 입출금 알림이 오는 것과 비슷해요.
1. `Transfer(address from, address to, uint256 value)`
- 언제 발생?: 토큰이 생성(민팅)되거나, 소멸(소각)되거나, 한 주소에서 다른 주소로 이동할 때 발생합니다.
- 기록 내용: 누가(`from`), 누구에게(`to`), 얼마를(`value`) 보냈는지 기록을 남깁니다. 지갑 앱이나 블록체인 탐색기(Etherscan)는 이 `Transfer` 이벤트를 감지해서 우리에게 거래 내역을 보여주는 거예요.
2. `Approval(address owner, address spender, uint256 value)`
- 언제 발생?: `approve` 함수가 성공적으로 호출되었을 때 발생합니다.
- 기록 내용: 누가(`owner`), 누구에게(`spender`), 얼마만큼의 토큰 사용을 허락했는지(`value`) 기록을 남깁니다.
이러한 표준 규칙 덕분에 우리는 어떤 ERC-20 토큰이든 메타마스크에 추가할 수 있고, 유니스왑 같은 탈중앙화 거래소에서 자유롭게 거래할 수 있는 것입니다. 정말 잘 만든 약속이죠?
3단계: 실전 코딩! 나만의 토큰 만들기 (feat. OpenZeppelin) 👨💻
드디어 코딩 시간입니다! 하지만 겁먹지 마세요. 우리는 바퀴를 다시 발명하지 않을 겁니다. 이미 수많은 전문가들이 검증하고 안전하게 만들어 둔 '오픈제플린(OpenZeppelin)'이라는 스마트 컨트랙트 라이브러리를 사용할 거거든요.
오픈제플린은 ERC-20 표준을 비롯해 다양한 기능들을 미리 구현해놓은 코드 모음집이에요. 우리는 이 레고 블록들을 가져와 조립하기만 하면 됩니다. 이렇게 하면 보안에 취약한 코드를 직접 작성할 위험을 크게 줄일 수 있어요.
3-1. 리믹스에서 새 파일 만들기
1. 리믹스 IDE 왼쪽의 파일 탐색기에서 `contracts` 폴더를 확인하세요. 기본 예제 파일들이 있을 거예요. 2. `contracts` 폴더에 마우스를 올리고, '새 파일' 아이콘을 클릭하여 `JaenungToken.sol` 이라는 이름의 파일을 만들어주세요. `.sol`은 솔리디티(Solidity) 언어 파일의 확장자입니다.
3-2. 기본 ERC-20 토큰 코드 작성하기
이제 막 생성한 `JaenungToken.sol` 파일에 아래 코드를 그대로 복사해서 붙여넣어 보세요. 각 줄이 어떤 의미인지 바로 아래에서 자세히 설명해 드릴게요.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract JaenungToken is ERC20 {
constructor() ERC20("Jaenung Token", "JNT") {
_mint(msg.sender, 1000000 * 10**18);
}
}
이게 끝이냐고요? 네, 이게 가장 기본적인 ERC-20 토큰의 전체 코드입니다! 😮 정말 간단하죠? 이제 한 줄씩 뜯어봅시다.
- // SPDX-License-Identifier: MIT
이 코드는 어떤 라이선스를 따르는지 명시하는 주석입니다. 오픈소스 프로젝트에서는 거의 필수로 사용돼요. 그냥 '규칙이구나' 하고 넘어가시면 됩니다.
- pragma solidity ^0.8.20;
이 코드를 컴파일할 솔리디티 컴파일러의 버전을 지정합니다. `^0.8.20`은 "0.8.20 버전 이상, 하지만 0.9.0 미만 버전으로 컴파일해줘"라는 의미예요. 버전이 안 맞으면 에러가 날 수 있으니 중요합니다.
-
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";이 부분이 핵심입니다! 오픈제플린 라이브러리에서 미리 만들어 둔 `ERC20.sol` 파일을 가져오는(import) 코드입니다. 우리가 위에서 길게 설명했던 `totalSupply`, `balanceOf`, `transfer` 같은 모든 표준 기능들이 이 파일 안에 다 들어있어요.
- contract JaenungToken is ERC20 { ... }
`JaenungToken`이라는 이름의 새로운 스마트 컨트랙트를 정의하는 부분입니다. `is ERC20`은 "우리가 만들 JaenungToken은 방금 import한 ERC20의 모든 기능을 상속받을 거야!"라는 의미예요.
-
constructor() ERC20("Jaenung Token", "JNT") { ... }`constructor`는 컨트랙트가 블록체인에 처음 배포될 때 딱 한 번만 실행되는 특별한 함수입니다. 여기서 토큰의 기본 정보를 설정해요.
`ERC20("Jaenung Token", "JNT")`는 상속받은 ERC20 컨트랙트의 생성자를 호출하면서, 토큰의 전체 이름(Full Name)은 "Jaenung Token"으로, 짧은 단위인 심볼(Symbol)은 "JNT"로 설정하겠다는 의미입니다.
- _mint(msg.sender, 1000000 * 10**18);
이 코드는 토큰의 초기 발행량을 설정하는 부분입니다.
- `_mint`: 토큰을 새로 '주조(minting)'하는 내부 함수입니다.
- `msg.sender`: 솔리디티에서 아주 중요한 변수인데요, "이 함수를 호출한 사람(지갑 주소)"를 의미합니다. 즉, 이 컨트랙트를 배포하는 '나'의 지갑 주소가 되겠죠.
- `1000000 * 10**18`: 발행할 토큰의 수량입니다. "어? 100만 개만 발행할 건데 왜 뒤에 이상한 숫자를 곱하죠?" 라는 의문이 드실 거예요.
솔리디티는 기본적으로 소수점 계산을 지원하지 않아요. 그래서 우리는 항상 정수로만 계산해야 합니다. 1.5 JNT 같은 건 표현할 수 없죠.
이 문제를 해결하기 위해, 우리는 아주 작은 단위를 기준으로 토큰의 양을 셉니다. 이더리움이 1 ETH = 1,000,000,000,000,000,000 wei (10의 18제곱)로 표현되는 것처럼, ERC-20 토큰도 보통 18개의 소수점 자리를 갖는 것으로 약속합니다.
따라서, 우리가 1,000,000개의 토큰을 발행하고 싶다면, 실제 코드에는 1,000,000 * (10의 18제곱)을 입력해야 하는 거죠. 이렇게 하면 블록체인 내부에서는 아주 큰 정수로 기록되지만, 메타마스크 같은 지갑에서는 소수점 18자리를 적용해서 우리 눈에 '1,000,000'으로 보여주게 됩니다.
4단계: 기능 업그레이드! 우리 토큰은 특별해야지 ✨
기본 토큰을 만드는 데 성공했지만, 이대로는 너무 심심하죠? 실제 프로젝트에서는 보통 몇 가지 추가적인 기능이 필요합니다. 이번에도 오픈제플린의 마법을 빌려 우리 토큰을 한 단계 업그레이드해 봅시다.
- Ownable: 컨트랙트의 소유자(Owner) 개념을 추가해서, 특정 함수는 오직 소유자만 실행할 수 있도록 제한하는 기능. (예: 추가 발행) - Burnable: 사용자가 자신의 토큰을 스스로 '소각(Burn)'하여 영원히 없애버릴 수 있는 기능. 총 공급량을 줄이는 효과가 있죠. - Pausable: 비상 상황 시, 컨트랙트 소유자가 토큰 전송을 포함한 모든 활동을 일시적으로 '중지(Pause)'시킬 수 있는 기능.
이 기능들을 모두 적용한 코드는 다음과 같습니다. 기존 `JaenungToken.sol` 파일의 내용을 모두 지우고 아래 코드로 교체해주세요.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
contract JaenungToken is ERC20, ERC20Burnable, Ownable, Pausable {
constructor(address initialOwner)
ERC20("Jaenung Token", "JNT")
Ownable(initialOwner)
{
_mint(msg.sender, 1000000 * 10**18);
}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
function _beforeTokenTransfer(address from, address to, uint256 amount)
internal
whenNotPaused
override(ERC20, Pausable)
{
super._beforeTokenTransfer(from, to, amount);
}
}
4-1. 업그레이드된 코드 분석하기
코드가 조금 길어졌지만, 원리는 똑같습니다.
- `import` 구문 추가: `ERC20Burnable`, `Ownable`, `Pausable` 컨트랙트를 추가로 가져왔습니다.
- `is ERC20, ERC20Burnable, Ownable, Pausable`: `JaenungToken`이 여러 컨트랙트의 기능을 동시에 상속받도록 했습니다. 솔리디티에서는 이렇게 쉼표(,)로 여러 부모 컨트랙트를 지정할 수 있어요.
- `constructor(address initialOwner)`와 `Ownable(initialOwner)`: 이제 생성자에서 `initialOwner`라는 주소를 입력받습니다. 그리고 `Ownable(initialOwner)`를 호출하여, 컨트랙트를 배포할 때 지정한 그 주소를 이 컨트랙트의 '소유자(Owner)'로 설정합니다. 이렇게 하면 배포자와 소유자를 다르게 설정하는 것도 가능해지죠.
- `pause()`, `unpause()`, `mint()` 함수: - 새로운 함수들을 추가했습니다. `pause()`는 토큰 거래를 중지시키고, `unpause()`는 다시 활성화합니다. `mint()`는 소유자가 원할 때 토큰을 추가로 발행하는 함수입니다. - 각 함수 뒤에 붙은 `public onlyOwner`가 보이시나요? `public`은 누구나 이 함수를 호출할 수 있다는 의미지만, `onlyOwner`라는 '제어자(modifier)'가 붙어있기 때문에, 실제로는 `Ownable` 컨트랙트에 정의된 소유자가 아니면 함수 실행이 거부됩니다. 강력한 권한 관리 기능이죠!
- `_beforeTokenTransfer(...)` 함수: - 이 함수는 ERC20의 모든 토큰 전송(transfer, transferFrom, mint, burn)이 일어나기 *직전에* 자동으로 호출되는 특별한 '훅(hook)' 함수입니다. - 우리는 이 함수를 '오버라이딩(재정의)'해서 `whenNotPaused`라는 제어자를 추가했습니다. 이 제어자는 `Pausable` 컨트랙트에서 제공하는 것으로, "만약 지금 컨트랙트가 '일시정지(paused)' 상태가 아니라면, 계속 진행해라" 라는 뜻입니다. - 결과적으로, 소유자가 `pause()` 함수를 호출하면 모든 토큰 전송이 이 `_beforeTokenTransfer` 단계에서 막히게 되는 것입니다.
이제 우리는 단순한 토큰을 넘어, 관리 기능까지 갖춘 제법 그럴듯한 토큰 컨트랙트를 완성했습니다! 다음 단계는 이 코드를 블록체인에 올리는, 가장 설레는 순간입니다.
5단계: 컴파일과 배포! 테스트넷으로 떠나는 첫 여정 🚀
자, 이제 우리가 정성껏 작성한 코드를 컴퓨터가 이해할 수 있는 언어로 번역(컴파일)하고, 테스트넷 블록체인에 기록(배포)할 시간입니다.
5-1. 컴파일하기
1. 리믹스 좌측 메뉴에서 세 번째 아이콘인 솔리디티 로고 모양의 'Solidity compiler' 탭을 클릭하세요. 2. COMPILER: `0.8.20` 또는 우리가 코드(`pragma solidity ^0.8.20;`)에 명시한 버전과 호환되는 최신 버전을 선택합니다. (예: 0.8.24) 버전이 맞지 않으면 오류가 발생하니 꼭 확인해주세요. 3. Auto compile: 이 옵션을 체크해두면 코드를 수정할 때마다 자동으로 컴파일해줘서 편리합니다. 4. 파란색 'Compile JaenungToken.sol' 버튼을 클릭합니다.
만약 코드에 오타나 문법 오류가 없다면, 잠시 후 컴파일러 탭 아이콘에 녹색 체크 표시 ✅가 나타날 거예요. 만약 빨간색으로 오류 메시지가 뜬다면, 메시지를 잘 읽어보고 오타가 없는지 다시 한번 확인해보세요.
5-2. 테스트넷에 배포하기
컴파일이 성공했다면, 이제 블록체인에 우리의 컨트랙트를 올릴 차례입니다.
1. 리믹스 좌측 메뉴에서 네 번째 아이콘인 이더리움 로고 모양의 'Deploy & run transactions' 탭으로 이동하세요.
2. ENVIRONMENT: 드롭다운 메뉴를 클릭하고 'Injected Provider - MetaMask'를 선택하세요. 이 옵션은 리믹스가 웹 브라우저에 설치된 메타마스크와 연동하겠다는 의미입니다. - 선택하면 메타마스크 팝업창이 뜨면서 연결을 요청할 거예요. 우리가 사용할 계정을 선택하고 '다음', '연결'을 눌러주세요. - 연결이 완료되면, 리믹스의 'ACCOUNT' 부분에 여러분의 메타마스크 지갑 주소와 잔액(Sepolia ETH)이 표시될 겁니다.
3. CONTRACT: 드롭다운 메뉴에서 우리가 컴파일한 `JaenungToken - contracts/JaenungToken.sol`을 선택해주세요. 다른 컨트랙트가 선택되어 있으면 안 됩니다!
4. DEPLOY: 'Deploy' 버튼 옆에 입력창이 하나 보일 거예요. `constructor(address initialOwner)` 기억나시나요? 여기에 컨트랙트의 소유자가 될 지갑 주소를 입력해야 합니다. 보통은 배포하는 사람, 즉 여러분의 지갑 주소를 그대로 복사해서 붙여넣으면 됩니다.
5. 주소를 입력한 후, 주황색 'Deploy' 버튼을 클릭하세요!
6. 메타마스크 확인: 'Deploy' 버튼을 누르면 메타마스크 팝업창이 다시 나타납니다. 이것은 블록체인에 데이터를 기록(트랜잭션 발생)하기 위한 '가스비'를 지불하겠다는 최종 확인 절차입니다. 예상 가스비를 확인하고 '확인' 버튼을 누르세요.
7. 배포 완료: 트랜잭션이 처리되는 데에는 몇 초에서 몇 분 정도 걸릴 수 있습니다. 리믹스 하단의 터미널 창을 보면 진행 상황이 표시되고, 성공적으로 완료되면 녹색 체크 표시와 함께 로그가 나타납니다.
축하합니다! 🎉 여러분의 첫 ERC-20 토큰이 이제 세폴리아 테스트넷 블록체인 위에 성공적으로 올라갔습니다! 'Deploy & run transactions' 탭 아래 'Deployed Contracts' 섹션에 여러분의 `JAENUNGTOKEN` 컨트랙트가 나타난 것을 확인할 수 있을 거예요.
지금까지의 모든 과정은 '테스트넷'이라는 안전한 모의 환경에서 진행되었습니다. 만약 실제 이더리움 메인넷에 배포하고 싶다면, 메타마스크에서 네트워크를 'Ethereum Mainnet'으로 바꾸고 똑같이 진행하면 됩니다.
하지만! 메인넷 배포는 실제 돈(ETH)이 가스비로 소모되며, 한번 배포된 컨트랙트는 수정하거나 삭제할 수 없습니다. 코드에 작은 결함이라도 있다면 여러분의 소중한 자산에 큰 위험이 될 수 있어요. 실제 서비스를 위한 토큰이라면, 배포 전에 반드시 여러 번의 테스트와 전문가의 코드 감사(Audit)를 거쳐야 합니다. 전문적인 도움이 필요하다면, **재능넷**과 같은 플랫폼에서 블록체인 전문가를 찾아 조언을 구하는 것도 좋은 방법입니다.
6단계: 내 토큰과 대화하기! 기능 테스트 및 확인 💬
이제 막 태어난 우리 토큰이 잘 작동하는지 확인해볼 시간입니다. 리믹스와 블록체인 탐색기를 통해 토큰과 직접 소통해봅시다.
6-1. 리믹스에서 함수 호출해보기
리믹스의 'Deployed Contracts' 아래에 있는 `JAENUNGTOKEN`을 클릭하여 펼쳐보세요. 우리가 코드에 정의했거나 상속받은 수많은 함수들이 버튼 형태로 나열되어 있습니다.
- 파란색 버튼: 블록체인의 데이터를 '읽기'만 하는 함수들입니다. 가스비가 들지 않고 즉시 결과를 보여줍니다. (예: `name`, `symbol`, `totalSupply`, `balanceOf`) - 주황색 버튼: 블록체인의 상태를 '변경'하는 함수들입니다. 트랜잭션을 발생시키므로 가스비가 필요하고 메타마스크의 서명이 필요합니다. (예: `transfer`, `approve`, `mint`)
테스트 해보기: 1. `name` 버튼을 누르면 "Jaenung Token"이, `symbol` 버튼을 누르면 "JNT"가 아래에 표시될 거예요. 2. `totalSupply` 버튼을 누르면 `1000000000000000000000000` 이라는 아주 긴 숫자가 나올 겁니다. 100만 * 10^18 이죠. 3. `balanceOf` 옆 입력창에 여러분의 지갑 주소를 붙여넣고 버튼을 누르면, `totalSupply`와 동일한 숫자가 나올 거예요. 초기 발행량이 모두 내 지갑으로 들어왔으니까요. 4. 이제 `transfer` 기능을 테스트해봅시다. `transfer`를 펼치고, `recipient`에는 친구의 지갑 주소(없다면 메타마스크에서 새 계정을 만들어보세요)를, `amount`에는 `100 * 10**18` (100개 토큰)을 입력하고 'transact' 버튼을 누르세요. 메타마스크 서명창이 뜨면 '확인'을 눌러줍니다. 5. 트랜잭션이 완료된 후, 다시 `balanceOf`로 여러분의 잔액과 친구의 잔액을 확인해보세요. 여러분의 잔액은 100 JNT만큼 줄어들고, 친구의 잔액은 100 JNT만큼 늘어났을 거예요!
6-2. 메타마스크에 내 토큰 추가하기
지금 메타마스크를 열어봐도 JNT 토큰은 보이지 않을 거예요. 지갑이 이 토큰의 존재를 아직 모르기 때문이죠. 우리가 직접 알려줘야 합니다.
1. 리믹스의 'Deployed Contracts'에서 `JAENUNGTOKEN` 컨트랙트 주소 옆의 '복사' 아이콘을 눌러 주소를 복사하세요. 2. 메타마스크를 열고 'Assets(자산)' 탭으로 이동합니다. 3. 가장 아래에 있는 'Import tokens(토큰 가져오기)'를 클릭하세요. 4. 'Token contract address(토큰 계약 주소)' 입력란에 방금 복사한 컨트랙트 주소를 붙여넣습니다. 5. 잠시 기다리면 'Token symbol(토큰 기호)'과 'Token decimal(토큰 소수 자릿수)'가 각각 'JNT'와 '18'로 자동 완성될 거예요. 6. 'Add custom token(사용자 정의 토큰 추가)' 버튼을 누르고, 다음 화면에서 'Import tokens'를 한번 더 누르면 완료!
이제 메타마스크 자산 목록에 여러분이 만든 'JNT' 토큰과 잔액이 자랑스럽게 표시됩니다! 🥳
6-3. 블록체인 탐색기(Etherscan)에서 확인하기
이더스캔은 이더리움 블록체인 위에서 일어나는 모든 활동을 투명하게 들여다볼 수 있는 웹사이트입니다. 우리 토큰의 모든 기록도 여기에 남아있죠.
1. 세폴리아 테스트넷용 이더스캔 사이트(sepolia.etherscan.io)에 접속하세요. 2. 검색창에 여러분의 토큰 컨트랙트 주소를 붙여넣고 검색합니다. 3. 컨트랙트 정보 페이지가 나타납니다. 여기서 누가 이 컨트랙트를 만들었는지(Creator), 언제 만들었는지(Timestamp) 등을 모두 확인할 수 있습니다. 4. 페이지를 아래로 내려보면 'Transactions' 탭에서 우리가 방금 친구에게 토큰을 보낸 `Transfer` 기록을 확인할 수 있습니다.
이처럼 블록체인의 모든 기록은 투명하게 공개되고 위변조가 불가능합니다. 이것이 바로 블록체인 기술의 핵심 가치 중 하나죠.
7단계: 코드 인증! 이더스캔에 '족보' 등록하기 ✅
이더스캔에서 우리 컨트랙트를 보면, 'Contract' 탭에 알아보기 힘든 기계어(Bytecode)만 보일 거예요. 다른 사람들이 이 컨트랙트가 어떤 코드이며 안전한지 신뢰할 수 없겠죠.
'컨트랙트 인증(Verification)'은 이더스캔에 우리의 솔리디티 소스 코드를 직접 등록하여, 배포된 기계어가 바로 이 소스 코드로부터 컴파일된 것임을 증명하는 과정입니다. 인증이 완료되면 누구나 우리 토큰의 코드를 투명하게 읽고 분석할 수 있게 되어 신뢰도가 크게 올라갑니다.
1. 이더스캔의 컨트랙트 페이지에서 'Contract' 탭을 클릭하고, 'Verify and Publish' 링크를 누르세요.
2. 다음 페이지에서 아래와 같이 설정합니다. - Compiler Type: Solidity (Single File) - Compiler Version: 리믹스에서 컴파일할 때 사용했던 버전과 '정확히' 동일한 버전을 선택합니다. (예: `v0.8.20+commit.a1b79de6`) - License: 코드 맨 위에 명시했던 라이선스를 선택합니다. (`MIT License (MIT)`)
3. 'Continue'를 누르면 소스 코드를 붙여넣는 페이지가 나옵니다. - Enter the Solidity Contract Code below: 여기에 `JaenungToken.sol`의 전체 코드를 붙여넣어야 하는데, 한 가지 문제가 있습니다. 우리 코드는 `import`를 통해 여러 파일을 가져오고 있죠. 이더스캔은 이 파일들의 내용을 모르기 때문에, 모든 `import`된 코드를 하나로 합친 '플랫(Flattened)' 파일이 필요합니다.
4. 리믹스에서 코드 플랫하기: - 리믹스의 파일 탐색기에서 `JaenungToken.sol` 파일에 마우스 오른쪽 버튼을 클릭합니다. - 'Flatten' 메뉴를 선택하면, 잠시 후 `JaenungToken_flat.sol`이라는 새로운 파일이 생성될 거예요. 이 파일에는 `ERC20.sol`, `Ownable.sol` 등의 모든 코드가 합쳐져 있습니다. - 이 파일의 전체 내용을 복사해서 이더스캔의 코드 입력창에 붙여넣습니다.
5. Constructor Arguments: 만약 우리 컨트랙트 생성자에 인자가 필요했다면(우리 코드는 `initialOwner` 주소가 필요하죠), 이 부분에 ABI-encoded 형식으로 입력해야 합니다. - 이건 좀 복잡하니, 이더스캔이 제공하는 온라인 인코더(etherscan.io/contract-constructor-input-encoder)를 사용하는 것이 편리합니다. - 해당 페이지에서 컨트랙트의 ABI를 붙여넣고, `initialOwner` 주소를 입력하면 인코딩된 값을 알려줍니다. 그 값을 복사해서 붙여넣으세요. (컨트랙트 ABI는 리믹스 컴파일러 탭의 'Compilation Details'에서 찾을 수 있습니다.)
6. 'I'm not a robot'을 체크하고 'Verify and Publish' 버튼을 클릭합니다.
모든 정보가 정확히 일치했다면, 잠시 후 "Successfully generated ByteCode and ABI"라는 메시지와 함께 성공 페이지가 나타납니다! 이제 다시 컨트랙트 페이지의 'Contract' 탭으로 가보면, 녹색 체크 표시와 함께 우리가 작성한 솔리디티 코드가 예쁘게 정리되어 있는 것을 볼 수 있습니다. 이제 누구나 우리 토큰을 신뢰하고 사용할 수 있게 된 거죠.
마치며: 이제 당신도 블록체인 빌더입니다! 🌍
와, 정말 긴 여정이었습니다! 우리는 이더리움과 ERC-20이 무엇인지 배우는 것부터 시작해서, 직접 토큰 코드를 작성하고, 테스트넷에 배포하고, 지갑에 추가하고, 심지어 이더스캔에 인증까지 마쳤습니다.
이제 여러분은 더 이상 블록체인 기술의 방관자가 아닙니다. 직접 무언가를 창조하고 생태계에 기여한 '빌더'가 되신 겁니다. 오늘 만든 이 작은 토큰이 여러분의 호기심을 더 큰 세상으로 이끄는 첫걸음이 되기를 바랍니다.
여기서 멈추지 마세요.
- 토큰에 투표 기능을 넣어보는 건 어떨까요? (ERC20Votes)
- 토큰을 스테이킹하면 이자를 주는 디파이(DeFi) 모델을 구상해볼 수도 있습니다.
- 혹은 이 토큰을 입장권으로 사용하는 커뮤니티(DAO)를 만들어볼 수도 있겠죠.
블록체인의 세계는 무한한 가능성으로 가득 차 있습니다. 오늘 배운 지식을 바탕으로 여러분만의 아이디어를 마음껏 펼쳐보세요. 코딩이 막히거나 더 깊은 지식이 필요할 때, **재능넷**과 같은 지식 공유 플랫폼의 문을 두드리는 것을 잊지 마시고요.
이제 여러분의 시대입니다. 세상을 바꿀 다음 혁신은, 바로 당신의 손에서 시작될지도 모릅니다.
댓글 작성
이 글에 대한 여러분의 생각을 들려주세요
로그인이 필요합니다
댓글을 작성하려면 먼저 로그인해주세요.
댓글 0
지식인의 숲 - 지적 재산권 보호 고지
지적 재산권 보호 고지
- 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
- AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
- 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
- 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
- AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.
아직 댓글이 없습니다.