야매 기록입니다. 어차피 다시 배울 것 같기는 한데!! 그냥 어제 한 거 잊어버리지 않으려고 기록으로 남겨둔다. 하루 찍먹한거라 아는 것도 없지만... 신기하기도 해서 한 번 다시 복기할 겸 만들어본다!
나는 이미 지갑을 만들고 크롬에 확장 프로그램도 추가해두었다.
https://metamask.io/에 접속해야 하는데 강사님도 피씽 사이트가 많기 때문에 주의해야 한다고 하셨다. '주의' 혹은 '위험'이라는 단어가 뜬다면 주소를 재확인해야 한다. 저도 다른데서 긁어온 주소입니다.
크롬에 확장 프로그램 추가하면 크롬 상단 바 오른쪽 귀퉁이에 귀여운 여우 아이콘이 뜬다.
메타마스크 지갑을 만들고 접속 비밀번호를 설정한다.
지갑마다 부여되는 고유의 문양 확인한 후 이용 약관 확인하고 개인 정보 보호 정책에 동의하고... 여기까지는 다른 사이트에 가입하는 것과 다를 것 없는데
이용약관 동의 후 백업 프레이즈라는 것을 받는다!!! 이 부분이 매우 중요한데!!! 잘 저장해 두어야 한다. 이 단어들을 다른 사람이 볼 경우에 해킹이 가능하기 때문에... 꼭 나만 알 수 있도록 저장을 잘 해두어야 한다.
이런 식으로 12개의 단어가 주어진다.
성질 급한 한국인인 나는 ^^... 확인 확인 연타를 누르다가 비밀 복구 구문을 그냥 지나쳐버렸었다. (친구가... '언니는 일단 냅다 눌러보는 편?' 이라고 코멘트 함 ㅋㅋㅋ) ㅎㅎ... 어제 토큰 만들기 실습을 하면서 다시 찾을 수 있었다. 소중하게... 캡쳐도 하고 따로 메모장에 복사도 해두고... 잘 저장해 두었다.
리믹스 주소 https://remix.ethereum.org/
워크스페이스에 파일을 생성했다. R-9C이라는 이름으로 sol 파일을 생성했다! 어제는 NGH라는 이름으로 파일을 생성해 토큰을 만들었었다.
pragma solidity ^0.4.21;
interface ERC20 {
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
assert(c / a == b);
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
contract StandardToken is ERC20 {
using SafeMath for uint;
string internal _name;
string internal _symbol;
uint8 internal _decimals;
uint256 internal _totalSupply;
mapping (address => uint256) internal balances;
mapping (address => mapping (address => uint256)) internal allowed;
function StandardToken() public {
_name = "MisterPizza"; // Set the name for display purposes
_decimals = 18; // Amount of decimals for display purposes
_symbol = "MPC"; // Set the symbol for display purposes
_totalSupply = 100000000000000000000000000; // Update total supply (100000 for example)
balances[msg.sender] = 100000000000000000000000000; // Give the creator all initial tokens (100000 for example)
}
function name()
public
view
returns (string) {
return _name;
}
function symbol()
public
view
returns (string) {
return _symbol;
}
function decimals()
public
view
returns (uint8) {
return _decimals;
}
function totalSupply()
public
view
returns (uint256) {
return _totalSupply;
}
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
balances[msg.sender] = SafeMath.sub(balances[msg.sender], _value);
balances[_to] = SafeMath.add(balances[_to], _value);
Transfer(msg.sender, _to, _value);
return true;
}
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = SafeMath.sub(balances[_from], _value);
balances[_to] = SafeMath.add(balances[_to], _value);
allowed[_from][msg.sender] = SafeMath.sub(allowed[_from][msg.sender], _value);
Transfer(_from, _to, _value);
return true;
}
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = SafeMath.add(allowed[msg.sender][_spender], _addedValue);
Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = SafeMath.sub(oldValue, _subtractedValue);
}
Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
강사님이 제공해주신 코드를 복붙했다. 여기서 변경할 사항은
_name = "Rosencrantz-96Coin"; // Set the name for display purposes
_decimals = 18; // Amount of decimals for display purposes
_symbol = "R-9C"; // Set the symbol for display purposes
_totalSupply = 100000000000000000000000000; // Update total supply (100000 for example)
balances[msg.sender] = 100000000000000000000000000; // Give the creator all initial tokens (100000 for example)
}
이 부분이다. 난 위와같이 변경해주었다. _name
을 내 토큰 이름으로 바꿔주고 _symbol
도 바꿔준다.
빨간 체크 표시가 되어있는 부분을 확인해 컴파이 탭의 버전과 맞춰준 후 Compile R-9C
버튼을 눌러 컴파일 해준다. ctrl+s를 눌러도 컴파일이 된다.
ENVIRONMENT 탭 확인! → Injected Provideer - MetaMast
로 내 메타마스크와 연겨해준다. → 나는 Sepolia 테스트 네트워크에서 진행했다. 네트워크가 알맞게 잘 연결 되었는지 확인!
내 지갑 주소 확인!
CONTRACT를 StandardToken
으로 바꾸고 내 토큰 명이 잘 입력 되었는지 확인한다.
(StandartToken으로 변경해야 테스트토큰이 만들어지는 것 같다. 안 바꾸니까 안됐음...)
Deploy를 누르면 메타마스크 지갑이 갑자기 뿅 튀어나온다! 가스비가 얼마인지 알려준다. 확인을 누르면
리믹스의 콘솔창 같은 곳에 진행 상황을 알려준다. 터미널 창에 view on etherscan
이 나오면 성공이니 클릭해주면 된다. 트랜잭션이 정상적으로 실행되었다.
Etherscan 페이지에서 트랜잭션 결과를 확인할 수 있다.
Testnet
에서만 사용할 수 있는 토큰이 발행되었음을 알려준다. Transaction Hash
코드도 알 수 있다. Status
부분이 Sucess라고 뜨면 성공적으로 테스트 코인이 발행된 것이다. From
, To
가 생기는데... 아직 뭐가 뭔지 잘 모르겠지만 각각 'the sending party of the transaction', 'the receiving party of the transation(could be a contract address)'라고 한다... (물음표 위에 마우스 올리면 나옴) To
부분이 계약 주소가 되니 복사해준다. 내 자산에 방금 만든 코인이 바로 보이지 않을 수 있다. 그러면! 토큰 가져오기를 하면 된다. 위에는 전날 팀원들과 주고받은 코인...
위에서 복사한 계약 주소를 복붙하면 기호와 소수점이 자동으로 뜬다. 커스텀 토큰을 추가하면
위와 같이 내 테스트 토큰이 발행되었음을 알 수 있다! 와~ 다른 사람의 지갑 주소를 알면 내가 만든 토큰을 보낼 수도 있다.
따로 지갑을 하나 더 만들어서 토큰을 보내봤다. 2도 나임... 보낸만큼 내 토큰이 줄어들어 있다.
이렇게 거래 내역을 확인할 수 있다.
어제 만든 토큰도 보낸 기록이 잘 남아있다.
나는 강사님이 친절하게 주석도 달아두신 코드를 복사해서 새로 워크스페이스에 파일을 만들었다.
버전 확인 후 컴파일 해준다.
디플로이를 누르면 메타마스크 창이 뜬다. 확인을 누르면 거래 배포 됨. view on etherium을 누르면 아래 창으로 넘어간다.
첫 경매를 등록할 때 verifying & 어쩌구를 등록해야 했다. 이건 어제 한 거라서 사진이 없다. 기억도 잘 안 나네... 리믹스에 작성한 코드를 복사해서 붙여넣어야 한다. 어떻게 과정을 다 거치고 나면
이와 같은 창이 생기고 내가 작성한 코드가 띄워지며 write contract
가 뜬다. 이걸 누르면 비로소 경매 참여 가능해지는 것
bid에 숫자를 입력하고 write를 누르면 경매에 참여할 수 있었던 것 같다.
이것은 어제의 경매 내력이다. 처음에 'Account1' 계정으로 0.1 ETH로 경매에 참여했고 '2' 계정으로 0.13ETH로 경매에 참여했다.
'2' 계정에서 참여한 금액이 더 많기 때문에 원래 있던 0.1ETH는 'Account1' 계정에 다시 돌려준다.
'Account1' 계정이 첫 경매에 참여했을 때는 0.1ETH였는데 '2' 계정이 더 높은 금액으로 경매에 참여한 후에는 0.13ETH로 바뀌어있다. 경매 성공이다.
아직 원리는 잘 모르겠지만... 이런 식으로 흘러가는구나~ 하고 맛보기 정도로 실습해본 것 같다. 꽤 신기했음... 그리고 어려웠다. 하루 특강이었기 때문에 다음에 더 잘 배우겠지! 이런걸 했다~ 하는 기록으로 남겨놓는다.