개발공부일지
BlockChain - truffle, ERC20, remix 본문
목차
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;
}
}
※ 추천받은 솔리디티 깨부수기 강의 들으면서 용어 익히기!!!!!!
'BlockChain' 카테고리의 다른 글
BlockChain - 메타마스크 네트워크 추가하기 (0) | 2024.01.31 |
---|---|
BlockChain - react web3 hook, openzeppelin, ERC20, Token (0) | 2024.01.30 |
BlockChain - RPC 통신, ganache, web3, Solidity (0) | 2024.01.25 |
BlockChain - Ethereum (0) | 2024.01.24 |
BlockChain - Transaction, UTXO(Unspent Transaction Output), jest 테스트하기 (0) | 2024.01.24 |