티스토리 뷰
이더리움 메인넷에서 암호화폐 코인 만들기
지난번에는 롭스텐 테스트 네트워크에서 이더리움 계열 ERC20 토큰(코인)을 만드는 법을 알아보았는데요. 이번에는 메인넷에서 ERC20 계열 코인을 만드는 법에 대해서 알아보겠습니다. 테스트넷에서 먼저 만들어 보고 싶으신 분은 아래 글을 참고해주세요. 그리고 이번 코드의 특징은 코드안에 지갑주소를 따로 입력할 필요없이 코인을 만들 당시 연결된 지갑으로 등록이 될 수 있도록 하였습니다. 이점 참고해주세요.
이더리움 기반의 ERC20 코인 만드는 법 쉽게 따라하기 (이보다 더 쉬울 순 없어요)
코인을 만들기 위한 준비물
이더리움 메인넷에서 코인을 만들기 위해서는 준비물 3가지가 필요합니다.
1. 메타마스크 지갑(이더리움이 들어있는)
메타마스크 지갑은 여우 지갑이라고 불리는데요. 이미 있으시겠지만 없다면 아래 글을 참고해서 만들어주세요. 메타마스크 지갑이 있다면 업비트나 빗썸 등에서 이더리움을 사서 여우지갑(메타마스크)로 보내야 합니다. 업비트나 빗썸 모두 이더리움 전송 수수료가 있으니까 약 0.1 이더 보내면 모자라지 않을 것입니다.
2. 소스 코드(밑에 첨부)
pragma solidity ^0.4.16;
contract Token {
/// @return total amount of tokens
function totalSupply() constant returns (uint256 supply) {}
/// @param _owner The address from which the balance will be retrieved
/// @return The balance
function balanceOf(address _owner) constant returns (uint256 balance) {}
/// @notice send `_value` token to `_to` from `msg.sender`
/// @param _to The address of the recipient
/// @param _value The amount of token to be transferred
/// @return Whether the transfer was successful or not
function transfer(address _to, uint256 _value) returns (bool success) {}
/// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
/// @param _from The address of the sender
/// @param _to The address of the recipient
/// @param _value The amount of token to be transferred
/// @return Whether the transfer was successful or not
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {}
/// @notice `msg.sender` approves `_addr` to spend `_value` tokens
/// @param _spender The address of the account able to transfer the tokens
/// @param _value The amount of wei to be approved for transfer
/// @return Whether the approval was successful or not
function approve(address _spender, uint256 _value) returns (bool success) {}
/// @param _owner The address of the account owning tokens
/// @param _spender The address of the account able to transfer the tokens
/// @return Amount of remaining tokens allowed to spent
function allowance(address _owner, address _spender) constant returns (uint256 remaining) {}
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
contract StandardToken is Token {
function transfer(address _to, uint256 _value) returns (bool success) {
//Default assumes totalSupply can't be over max (2^256 - 1).
//If your token leaves out totalSupply and can issue more tokens as time goes on, you need to check if it doesn't wrap.
//Replace the if with this one instead.
//if (balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]) {
if (balances[msg.sender] >= _value && _value > 0) {
balances[msg.sender] -= _value;
balances[_to] += _value;
Transfer(msg.sender, _to, _value);
return true;
} else { return false; }
}
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
//same as above. Replace this line with the following if you want to protect against wrapping uints.
//if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to]) {
if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0) {
balances[_to] += _value;
balances[_from] -= _value;
allowed[_from][msg.sender] -= _value;
Transfer(_from, _to, _value);
return true;
} else { return false; }
}
function balanceOf(address _owner) constant returns (uint256 balance) {
return balances[_owner];
}
function approve(address _spender, uint256 _value) returns (bool success) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
return allowed[_owner][_spender];
}
mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;
uint256 public totalSupply;
}
//name this contract whatever you'd like
contract ERC20Token is StandardToken {
function () {
//if ether is sent to this address, send it back.
throw;
}
/* Public variables of the token */
/*
NOTE:
The following variables are OPTIONAL vanities. One does not have to include them.
They allow one to customise the token contract & in no way influences the core functionality.
Some wallets/interfaces might not even bother to look at this information.
*/
string public name; //fancy name: eg Simon Bucks
uint8 public decimals; //How many decimals to show. ie. There could 1000 base units with 3 decimals. Meaning 0.980 SBX = 980 base units. It's like comparing 1 wei to 1 ether.
string public symbol; //An identifier: eg SBX
string public version = 'H1.0'; //human 0.1 standard. Just an arbitrary versioning scheme.
//
// CHANGE THESE VALUES FOR YOUR TOKEN
//
//make sure this function name matches the contract name above. So if you're token is called TutorialToken, make sure the //contract name above is also TutorialToken instead of ERC20Token
function ERC20Token(
) {
balances[msg.sender] = 100000; // Give the creator all initial tokens (100000 for example)
totalSupply = 100000; // Update total supply (100000 for example)
name = "hulepong"; // Set the name for display purposes
decimals = 2; // Amount of decimals for display purposes
symbol = "HLP"; // Set the symbol for display purposes
}
/* Approves and then calls the receiving contract */
function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
//call the receiveApproval function on the contract you want to be notified. This crafts the function signature manually so one doesn't have to include a contract in here just for this.
//receiveApproval(address _from, uint256 _value, address _tokenContract, bytes _extraData)
//it is assumed that when does this that the call *should* succeed, otherwise one would use vanilla approve instead.
if(!_spender.call(bytes4(bytes32(sha3("receiveApproval(address,uint256,address,bytes)"))), msg.sender, _value, this, _extraData)) { throw; }
return true;
}
}
위에 있는 내용을 쭉 긁어서 복사 후 메모장에 붙여넣으셔도 되고, 아니면 그대로 복사해서 아래에 나올 리믹스 IDE에 붙여 넣어도 됩니다. 단, 바꿔야 할 곳이 5군데 있으니 꼭 기억해두세요. 5군데 바꿔야 합니다. 고치지 않고 위의 내용 그대로 했다가는 "훌레퐁"코인이 1000개 만들어집니다. 주의하세요.
** 👉 소스가 복사가 안된다고 하셔서 아래에 텍스트 파일로 첨부합니다.
3. 리믹스 IDE
리믹스 IDE는 통합 개발환경으로 아래에 바로갈 수 있도록 해놓았습니다.
리믹스 IDE에 처음 접속하면 아래처럼 나오는데 SURE를 누릅니다.
처음 들어왔으면 화면 메뉴 안내를 해주는데, 3번정도 next를 누르면 사라집니다.
코인 만들기 시작
이제 리믹스(REMIX)의 첫화면이 나오게 됩니다. 바로 시작해보겠습니다. 화살표 친 새 파일 만들기를 누릅니다.
이름을 정하고 뒤에 "쩜 sol"을 붙이면 됩니다. 여기서는 "이더리움 스페이스"를 뜻하는 ETS.sol이라고 쓰겠습니다.
이제 위에서 다운로드해서 연 소스코드를 복사해서 붙여넣으면 되는데요. 아래 그림처럼 ETS.sol을 클릭하고 오른쪽에 빈 공간에서 1 옆에 있는 커서를 클릭하고 복사한 내용을 붙여 넣으세요.
소스 코드 내용 중 5군데 바꾸기
위에 있는 소스코드를 그대로 복사해서 붙여 넣었으면 이제 아래에 있는 빨간 박스 안에 있는 내용 중 5군데를 바꿔야 합니다.
맨 위에 밸런스는 총 발행량 중에서 제작자에게 몇 개나 가게 하냐는 것이고 밑에 토털 서플라이는 총발행량을 뜻하는데요 별다른 이유가 없다면 두 군데 모두 같은 숫자를 쓰시면 됩니다. 여기서는 1억 개를 쓰고 0을 8개 더 쓰겠습니다. 즉 0이 16개를 쓸 것입니다. 이유는 밑에 말씀드립니다.
name은 기본으로 제가 써놓은 훌레퐁에서 이더리움 스페이스로 바꾸겠습니다. Ethereum Space
decimals는 소수점이라는 말인데요. 이 소수점이 원래 총발행량의 0을 깎아먹습니다. 그래서 8로 쓰면 위에 쓴 16개의 0중에서 8개가 사라집니다. 대신 소수점 8자리까지 쪼개지게 됩니다. 0.00000001까지 말입니다.
마지막으로 symbol은 약자입니다. 세 글자나 네 글자로 해도 되고 다섯 글자로 해도 됩니다만 여기서는 ETS라고 해보겠습니다.
자 이제 준비가 다 되었습니다. 컴파일을 할 차례입니다. 왼쪽 메뉴 중에 화살표가 가리키는 모양을 누릅니다.
맨 위에 있는 COMPILER를 0.4.16으로 바꾸고 아래쪽에 있는 세 군데 모두 체크한 후 Compile ETS.sol을 누릅니다.
다음으로 넘어가기 전에 맨 위에서 설정했던 메타 마스크를 열어보면 아래처럼 되어있어야 합니다. 이더리움 메인넷이어야 하며 "연결됨"이라고 표시가 되어있어야 합니다. 만약 연결됨이 없으면 수동으로 리믹스와 연결해주어야 합니다.
맨 위부터 첫 번째 왼쪽 메뉴 중에 이더리움처럼 생긴 아이콘을 누르고 맨 위에 있는 항목을 Injected Web3로 바꾼 후에 메인넷 주소랑 맞는지 확인하고 contract는 ERC20Token - ETS.sol을 체크하고 Deploy를 누릅니다.
그러면 이제 아래와 같은 내용이 나오는데 수수료에 대한 이야기입니다. 메인넷에서 코인을 만들 때 수수료가 들어가는데요. 대략 많이 들어갈 때는 0.1 이더 정도 들어가고 대부분 0.07에서 0.09 이더 정도 소요가 된다고 알고 계시면 됩니다. 물론 "컨펌(confirm)"을 누르면 실제 이더(ETH)가 얼마나 소요되는지 그날그날의 네트워크 상황에 따라서 다르게 표시가 됩니다.
실제 소요되는 비용이 표시가 되는데요. 오늘은 네트워크 상황이 좋은 것 같습니다. 토털 0.026458 이더가 들어가네요. 얼마 전에 만들었을 때는 0.06 이더가 들어간 적도 있으니 충분하게 0.1 이더를 넣어놓으시면 모자람 없이 코인을 만드실 수 있습니다. "확인"을 눌러서 진행을 합니다.
다시 리믹스로 가서 보면 "creating of ERC20Token pending..."이라는 말이 쓰여있는데요. 펜딩(pending)은 진행 중이라고 이해하시면 됩니다. 코인 제작 역시 네트워크 상황에 따라서 시간이 차이가 나니 인내심을 가지고 기다려주세요. 많이 기다리면 5분 이상 기다려야 할 때도 있습니다.
만약 10분 이상 기다려도 계속 pending 이거나 또는 실수로 deploy를 한번 더 눌렀다가 취소했을 경우에는 10분 이상 지난 다음에 자신의 메타마스크 주소를 이더스캔에서 검색하여 방금 만든 코인을 찾을 수 있습니다.
메타마스크의 주소를 마우스로 클릭하면 주소가 복사됩니다.
이더스캔은 아래에 있는 박스로 들어가시면 됩니다.
이더스캔에 들어가서 검색창에 방금 복사한 메타마스크 주소를 붙여 넣기 하고 엔터를 칩니다.
지갑 주소를 치면 아래쪽에 그 지갑에서 만든 코인의 트랜잭션 해시값이 나오는데요 이 해시값을 누릅니다.
아래쪽에 컨트랙트 주소가 나오는데요. 이 주소를 누릅니다.
아래처럼 컨트랙트 주소가 있고 코인 이름은 ETX로 잘 만들어진 것을 알 수 있습니다.
그럼 이번에는 메타마스크에 이 코인을 등록을 해보겠습니다. 컨트랙트 주소가 제일 중요한데요. 이 주소를 아래처럼 생긴 아이콘을 눌러서 복사합니다. 0x41A6C9AE2b20aE1644e5bD579774C6468Db9415D 와 같은 값이 나옵니다.
이제 이 컨트랙트 주소를 가지고 코인을 등록해야 하는데요. 아래처럼 메타마스크를 열고 "토큰 추가"를 누른 후에 "맞춤형 토큰"을 누르고 주소를 붙여 넣기 하면 코인 심벌과 소수점은 자동으로 나오게 됩니다. 여기서 "다음"을 누릅니다.
방금 만든 ETS 토큰이 보이는데요. 여기서 "토큰 추가"를 누릅니다.
ETS(이더리움 스페이스) 토큰 1억 개가(100000000) 만들어진 것을 확인할 수 있습니다.
메인넷에서 만들었기 때문에 다름 사람에게 보낼 때는 실제 이더리움 수수료가 들어갑니다. 다른 사람에게 코인을 보내는 방법은 보내고자 하는 사람에게 코인의 "컨트랙트 주소"를 알려주어야 합니다.
실제로 제가 위에 써놓은 ETS의 컨트랙 주소를 메타마스크에 등록하면 코인을 볼 수 있습니다. 아래처럼 전혀 다른 메타마스크 지갑에서도 "토큰 추가"를 누른 다음 "맞춤형 토큰"을 누르고 컨트랙주소를 입력하고 나서 "다음"을 누르면
ETS 코인이 추가가 되는 것을 볼 수 있습니다.
상대의 메타마스크 지갑주소를 알면 코인을 보낼 수도 있는데요. 수수료가 많으면 보내지 않겠습니다. 이더리움 수수료는 3천원 정도지만 새로 만든 코인의 경우에는 수수료가 꽤 비쌉니다. 20000원이 넘을 때도 있습니다. 치킨 한마리가 사라지다니요!
여기서 상대의 메타마스크 주소는 계정 밑에 주소를 클릭하면 바로 복사가 됩니다. 여기서는 0x6488Db933c08D48982497d685ACE4fBba42C2906 으로 복사가 되었습니다.
이제 코인을 만든 지갑으로 가서 ETS 코인으로 들어간 다음 "보내기"를 누르고 수신인에 상대방의 주소를 붙여 넣기 합니다.
몇 개를 보내던지 수수료는 그때그때 상황에 따라 다르게 부과되는데요. 오늘은 1만 원 정도가 들어가는 상황입니다.
취소했다가 다시 보내기를 몇 번 해보다가 15000원까지 오르기도 했고 9천 원까지 내리기도 해서 보내보았습니다. 100 ETS를 보내기 했는데요. 수수료는 8.4달러 나왔고 "확인"을 누릅니다.
1분도 안돼서 코인은 전송이 되었습니다. 아래 보시면 100 ETS가 이동되었음을 알 수 있습니다.
여기까지 해서 코인을 "이더리움 메인넷"에서 만드는 법에 대해서 알아보는 시간을 가졌습니다. 요즘 이더리움 가격이 다시 300만 원을 넘어가고 있습니다. 집에서 쉬는 피시가 있다면 그래픽카드를 놀리지 마시고 HiveOS나 이더마인으로 이더리움 채굴해보시라고 권해드립니다. 이더리움이 150만 원만 넘어가도 이득이 나는 상황이니 경험 삼아 채굴해보셔도 괜찮을 듯싶습니다.
추가적으로 코인의 심볼 이미지가 없다고 해서 코인 유통이 되지 않는것이 아닙니다. 아래글을 참고해보시면 BXS는 코인 이미지가 없는데도 에어드랍 및 프리세일을 하고 있는 것을 알 수 있습니다.
'Crypto(암호화폐)' 카테고리의 다른 글
팬케이크 스왑(PancakeSwap) 사용방법 5단계 (2) | 2021.11.29 |
---|---|
바이낸스 거래소 가입방법 6단계 및 암호화폐 입출금, 거래하기 (0) | 2021.11.26 |
업비트 오입금 처리 접수 유형 (0) | 2021.06.16 |
UNISWAP(유니스왑) 탈중앙거래소 사용하는 방법, 실제거래 포함 (16) | 2021.05.13 |
아임토큰(imToken) 비트코인,이더리움 암호화폐 모바일 지갑 만드는 방법 (3) | 2021.05.13 |