Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발공부일지

BlockChain - truffle, ERC20, remix 본문

BlockChain

BlockChain - truffle, ERC20, remix

보람- 2024. 1. 29. 17:46

 


목차

1. truffle

2. remix

3. ERC20


 

 

1. truffle


- Dapps 개발을 쉽게 할수있도록 테스트환경 지원해주는 프레임워크
- 스마트 컨트랙트 파일, 배포 및 테스트 기능

 

npm i truffle
npx truffle init
npx truffle compile
npx truffle migrate



- npx truffle init 하면 초기세팅으로 3개의 폴더 생성
   - contracts : 솔리디티 코드들을 작성한 sol파일 담아놓는 폴더

      - 컴파일 진행하면 build라는 폴더 생성 → 컴파일된 파일들이 json 파일로 생성
   - migrations : 컨트랙트 배포를 진행할 js코드 구문 작성 폴더

   - test : 테스트 작성 폴더

- truffle.config
   - 네트워크 속성과 솔리디티 컴파일 버전 정보 명시

module.exports = {
  networks: {
    development: {
      host: '127.0.0.1',
      port: 8545,
      network_id: '*',
    },
  },

  mocha: {
    // timeout: 100000
  },

  compilers: {
    solc: {
      version: '0.8.13',
    },
  },
};

 

 

 

** 컨트랙트 배포 구문 작성

 

- migrations 폴더안에 배포 내용 컨트랙트이름으로 [번호]_[내용]_[파일명.js] 작성하면 번호순으로 진행됨 (배포가 되는것)

- 1_deploy_Counter.js 을 만들고, json파일이 필요한데 require로 파일지정해주고 배포 구문 작성.

- ganache 네트워크 열고 ( npx ganache-cli )

- npx truffle migrate

   - sendTransaction 으로 바이트코드를 담아 컨트랙트 배포했던 부분이 migrate작업!
       - 그러면 CA를 받을수있음!


- 이전 배운내용과 비교한다면
   - npx truffle commpile == npx solc --abi --bin "파일경로"
   - npx truffle migrate == sendTransation


- 배포한 CA 주소를 잃어버렸을경우
   - npx truffle console을 켜고
   - Counter.address 를 조회하면 마지막 컨트랙트 주소확인가능
   - 런타임 환경 지원해줌!


 

 

2. remix

 

https://remix.ethereum.org/#lang=en&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.22+commit.4fc1097e.js

- 작업하던 파일의 내용을 요청으로 내보내서 remix환경에서 사용하기

 

npm i -g @remix-project/remixd


-  내 파일 폴더 경로의 파일들 요청하기
- remixd -s "어느경로보낼지" --remix-ide "remix페이지"

remixd -s "./contracts" --remix-ide "https://remix.ethereum.org/"
remixd -s . --remix-ide "https://remix.ethereum.org/"


- 페이지에서 요청받아주길 대기중일거고
- remix 페이지로 들어가서 워크스페이스에서 로컬호스트로 연결해주면됌!
- remix를 사용해서 쉽게 배포 가능

 

 

 

 

 

 

3. ERC20


- ERC : Ethereum Request for Comments 의 약자
- ERC20 : 특정 제안에 번호를 매긴것, 토큰의 생성이나 발행 등의 규칙을 의미
  - 코드의 내용이 작성되어있는 제안, 숫자는 제안의 식별용!

 


**  토큰과 코인
- 둘의 차이는 메인넷이 있는지의 여부로 구별함
   - 메인넷이 있으면 코인!
- 토큰을 만들면 해당 네트워크의 체인에 포함됨 → 토큰자체의 메인넷이 구현되어있지않으면 코인이 아님!


- ERC20은 이더리움 네트워크에서 가장 표준이 되는 토큰

  → 대체가능토큰, 가장 기본적인 교환의 기능을 가지고있는 토큰

- ERC721 : 대체 불가능토큰, 고유한 토큰 아이디가 존재함

 

 

 

 

① IERC20.sol

 

- 이미 배포되어 있는 표준 규칙의 코드를 가져와서 사용
- 오픈제플린에서 사용만 하면 되지만 코드를 파악하고 사용하기!!!!
- 호환성, 보안 이슈등의 이유로 작성되어있는 규칙에 맞는 코드로 작업해야함

- function totalSupply() external view returns(uint); : 총 토큰의 발행량 조회

- function balanceOf(address account) external view returns(uint); : 해당 지갑이 가지고 있는 토큰의 양

- function transfer(address to, uint amount) external returns(bool); : 지갑에서 토큰을 다른 지갑으로 소유권 이전 

   (실행결과만 알려주는), 보내는사람은 msg.sender이고, 받는사람은 to, 토큰양은 amount  

- function approve(address spender, uint256 value) external returns (bool); : 소유권을 위임 (대행 업체가 받음)


- function allowance(address owner, address spender) external returns(uint); : 얼마만큼 누가 위임을 받았는지 

- function transferFrom(address spender, address to, uint amount) external returns(bool); : 소유권을 위임받은 사람이 ≫≫≫ 다른 지갑에 토큰의 소유권을 이전할 때 사용, (소유권을 가지고있는지 확인하고→ trnasfer()호출함 )

- event

    - 이벤트 로그로 확인가능 ( log로 확인 )
    - event Tranfer(address from, address to, uint value);
    - event Approval(address from, address spender, uint value);

 

 

더보기
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

// ERC20 interface sol
interface IERC20{
    function totalSupply() external view returns(uint);
    
    function balanceOf(address account) external view returns(uint);

    function transfer(address to, uint amount) external returns(bool);

    function approve(address spender, uint256 value) external returns (bool);

    function allowance(address owner, address spender) external returns(uint);

    function transferFrom(address spender, address to, uint amount) external returns(bool);

    event Transfer(address from, address to, uint value);
    event Approval(address from, address spender, uint value);

}

 

 

 

② ERC20.sol

 

- interface로 작성한 IERC20 import하고 상속해서 사용한다.
- 토큰의 내용을 작성
- 오픈제플린 설치
  https://www.npmjs.com/package/@openzeppelin/contracts

$ npm install @openzeppelin/contracts


- 설치하면 node_modules 폴더에 @openzeppelin > token > ERC20 > ERC20.sol / IERC20.sol 생성되어있음

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import "./IERC20.sol";

contract ERC20 is IERC20 {
  string public name; 

  string public symbol;

  uint8 public decimals = 18;

  uint public override totalSupply;

  address private owner;

  mapping(address => uint) public balaces;

  mapping (address=>mapping(address => uint)) public override allowance; 

  constructor(string memory _name, string memory _symbol, uint256 _amount) {
    owner = msg.sender;
    name = _name;
    symbol = _symbol; 

    mint(_amount * (10 ** decimals)); 
  } 

  function mint(uint amount) internal {
    balaces[msg.sender] += amount;
    totalSupply += amount;
  }

  function transfer(address to, uint amount) external override returns(bool) {
    balaces[msg.sender] -= amount;
    balaces[to] += amount;
    emit Tranfer(msg.sender, to, amount);

    return true;
  }

  function approve(address spender, uint amount) external override returns(bool) {
    allowance[msg.sender][spender] = amount;
    emit Approval(msg.sender, spender, amount);

    return true;
  }

  function transferFrom(address spender, address to, uint amount) external override returns(bool) {
    require(allowance[spender][msg.sender] >= amount);

    allowance[spender][msg.sender] -= amount;

    balaces[spender] -= amount;

    balaces[to] += amount;

    return true;
  }

  function balanceOf(address account) external view returns(uint) {
    return balaces[account];
  }

  receive() external payable {
    uint amount = msg.value * 20;
    if(msg.sender == owner) {
      mint(amount);
    }  

    require(balaces[owner] >= amount);
    balaces[owner] -= amount;
    balaces[msg.sender] += amount;
  }
}

 

 

 

 


※ 추천받은 솔리디티 깨부수기 강의 들으면서 용어 익히기!!!!!!