#11 [Blockchain Application DAPP] (05.17) - 실습

sookyoung.k·2023년 5월 17일
1
post-thumbnail

💠 나만의 토큰 만들기

야매 기록입니다. 어차피 다시 배울 것 같기는 한데!! 그냥 어제 한 거 잊어버리지 않으려고 기록으로 남겨둔다. 하루 찍먹한거라 아는 것도 없지만... 신기하기도 해서 한 번 다시 복기할 겸 만들어본다!

1. 🦊 메타마스크 지갑 만들기

나는 이미 지갑을 만들고 크롬에 확장 프로그램도 추가해두었다.

  1. https://metamask.io/에 접속해야 하는데 강사님도 피씽 사이트가 많기 때문에 주의해야 한다고 하셨다. '주의' 혹은 '위험'이라는 단어가 뜬다면 주소를 재확인해야 한다. *저도 다른데서 긁어온 주소입니다.

  2. 크롬에 확장 프로그램 추가하면 크롬 상단 바 오른쪽 귀퉁이에 귀여운 여우 아이콘이 뜬다.

  3. 메타마스크 지갑을 만들고 접속 비밀번호를 설정한다.

  4. 지갑마다 부여되는 고유의 문양 확인한 후 이용 약관 확인하고 개인 정보 보호 정책에 동의하고... 여기까지는 다른 사이트에 가입하는 것과 다를 것 없는데

  5. 이용약관 동의 후 백업 프레이즈라는 것을 받는다!!! 이 부분이 매우 중요한데!!! 잘 저장해 두어야 한다. 이 단어들을 다른 사람이 볼 경우에 해킹이 가능하기 때문에... 꼭 나만 알 수 있도록 저장을 잘 해두어야 한다.

이런 식으로 12개의 단어가 주어진다.

성질 급한 한국인인 나는 ^^... 확인 확인 연타를 누르다가 비밀 복구 구문을 그냥 지나쳐버렸었다. (친구가... '언니는 일단 냅다 눌러보는 편?' 이라고 코멘트 함 ㅋㅋㅋ) ㅎㅎ... 어제 토큰 만들기 실습을 하면서 다시 찾을 수 있었다. 소중하게... 캡쳐도 하고 따로 메모장에 복사도 해두고... 잘 저장해 두었다.

2. 🦆 리믹스에 접속 후 파일 생성

리믹스 주소 https://remix.ethereum.org/

워크스페이스에 파일을 생성했다. R-9C이라는 이름으로 sol 파일을 생성했다! 어제는 NGH라는 이름으로 파일을 생성해 토큰을 만들었었다.

3. 🐺 코드를 작성 (난 복붙)

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도 바꿔준다.

3. 🐹 버전을 맞춰준 후 컴파일

빨간 체크 표시가 되어있는 부분을 확인해 컴파이 탭의 버전과 맞춰준 후 Compile R-9C 버튼을 눌러 컴파일 해준다. ctrl+s를 눌러도 컴파일이 된다.

4. 🐶 Deploy

  1. ENVIRONMENT 탭 확인! → Injected Provideer - MetaMast로 내 메타마스크와 연겨해준다. → 나는 Sepolia 테스트 네트워크에서 진행했다. 네트워크가 알맞게 잘 연결 되었는지 확인!

  2. 내 지갑 주소 확인!

  3. CONTRACT를 StandardToken으로 바꾸고 내 토큰 명이 잘 입력 되었는지 확인한다.
    (StandartToken으로 변경해야 테스트토큰이 만들어지는 것 같다. 안 바꾸니까 안됐음...)

5. 🦊 Token 생성

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 부분이 계약 주소가 되니 복사해준다.

6. 🐯 토큰 가져오기

내 자산에 방금 만든 코인이 바로 보이지 않을 수 있다. 그러면! 토큰 가져오기를 하면 된다. 위에는 전날 팀원들과 주고받은 코인...

위에서 복사한 계약 주소를 복붙하면 기호와 소수점이 자동으로 뜬다. 커스텀 토큰을 추가하면

위와 같이 내 테스트 토큰이 발행되었음을 알 수 있다! 와~ 다른 사람의 지갑 주소를 알면 내가 만든 토큰을 보낼 수도 있다.

7. 🐵 토큰 보내기

따로 지갑을 하나 더 만들어서 토큰을 보내봤다. 2도 나임... 보낸만큼 내 토큰이 줄어들어 있다.

이렇게 거래 내역을 확인할 수 있다.

어제 만든 토큰도 보낸 기록이 잘 남아있다.

🪙 경매

1. 💰 Contract 작성 후 컴파일

나는 강사님이 친절하게 주석도 달아두신 코드를 복사해서 새로 워크스페이스에 파일을 만들었다.

버전 확인 후 컴파일 해준다.

2. 💰 Deploy

디플로이를 누르면 메타마스크 창이 뜬다. 확인을 누르면 거래 배포 됨. view on etherium을 누르면 아래 창으로 넘어간다.

3. 💰 경매 등록

첫 경매를 등록할 때 verifying & 어쩌구를 등록해야 했다. 이건 어제 한 거라서 사진이 없다. 기억도 잘 안 나네... 리믹스에 작성한 코드를 복사해서 붙여넣어야 한다. 어떻게 과정을 다 거치고 나면

이와 같은 창이 생기고 내가 작성한 코드가 띄워지며 write contract가 뜬다. 이걸 누르면 비로소 경매 참여 가능해지는 것

4. 💰 경매

bid에 숫자를 입력하고 write를 누르면 경매에 참여할 수 있었던 것 같다.

이것은 어제의 경매 내력이다. 처음에 'Account1' 계정으로 0.1 ETH로 경매에 참여했고 '2' 계정으로 0.13ETH로 경매에 참여했다.

'2' 계정에서 참여한 금액이 더 많기 때문에 원래 있던 0.1ETH는 'Account1' 계정에 다시 돌려준다.

'Account1' 계정이 첫 경매에 참여했을 때는 0.1ETH였는데 '2' 계정이 더 높은 금액으로 경매에 참여한 후에는 0.13ETH로 바뀌어있다. 경매 성공이다.


아직 원리는 잘 모르겠지만... 이런 식으로 흘러가는구나~ 하고 맛보기 정도로 실습해본 것 같다. 꽤 신기했음... 그리고 어려웠다. 하루 특강이었기 때문에 다음에 더 잘 배우겠지! 이런걸 했다~ 하는 기록으로 남겨놓는다.

profile
영차영차 😎

0개의 댓글