BlockChain> opnezeppelin & Ropsten 테스트넷 배포

YU YU·2021년 10월 20일
0

경일_BlockChain

목록 보기
22/24
post-thumbnail

오늘의 목표
1. 환경 설정
2. 코드 작성
3. 가나슈 배포(로컬 배포)
4. 테스트넷 배포(테스트넷 이더리움)

1.기본 세팅

  • ganache
  • metamask
  • truffle init
  • truffle-config.js 수정하기(네트워크 부분)

2. openzeppelin

블록체인은 불변성이 있다. 하지만 오픈 제펠린을 통해서 컨트랙트를 수정할 수 있다. proxy contract나 logic contract를 수정할 수 있다. 그러나 함수호출을 abi를 통해서가 아닌 직접 호출로 처리하는 방법을 알아야 사용이 용이하다.

GAS 수수료를 소비자가 아닌 smart contract 소유자가 내는 것으로 바뀌었다.

기본적인 함수들이 여기에 구현이 잘 되어 있다.

2. MEW 연결

my ether wallet
https://www.myetherwallet.com/



여기서 메타마스크를 연결하게 될 것이다. 나는 여기서 0이 떴지만 smart contract를 배포하는 데는 문제가 없었다.

3. 코드 작성

3-0.openzeppelin설치

npx truffle init
npm init
npm install openzeppelin-solidity

3-1.truffle-config 수정

npx truffle version을 쳐서 확인해본다.

여기서 보면 solidity 버전이 0.5.16으로 되어있음을 확인할 수 있다. 코드를 고치던지 아니면 환경을 바꾸든지 둘 중 하나를 바꾸어주어야 한다. 매번 코드를 바꾸는것보다는 환경을 맞춰주는게 편하다.
truffle-config.js를 수정해준다.
compilers의 버전을 수정해준다.

그러고나서 터미널에 다음과 같이 치면 수정이 되어있는 것을 확인할 수 있다.
npx truffle version

npx truffle create contract PengToken
npx truffle create migration PengToken
을 터미널에 입력한다.

그러면 다음과 같은 파일이 생성됨을 알 수 있다.

  • PengToken.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

contract PengToken {
  string public name = "PENG TOKEN";
  string public symbol = "PENG";
  uint256 public decimals = 18;
  uint public totalSupply =1000 * (10**decimals);
  string text = "hello world!";

  constructor() public {
    
  }
}
  • 1634691050_peng_token.js
const PengToken = artifacts.require("PengToken");

module.exports = function (_deployer) {
  _deployer.deploy(PengToken);
};

다 작성한 후에 터미널에 다음과 같이 입력해준다.
npx truffle compile
npx truffle migrate

contract address:    0x4b2E99cDd65cA52C1dbcF79AeD15cd31765959f0

account:             0x0E903Aba90C9AD79948B858B23bb6e6fBE284dd2

3-2. MEW

MEW를 사용하면 화면을 그리지 않고도 스마트 컨트랙트의 기능을 확인할 수 있다.

ABI 를 가져와야 한다.
build>contracts>pengtoken에서 abi를 복사한다. 아래 화살표를 눌러서 하면 쉽다.

두번째 칸에느 스마트 컨트랙트 주소를,
세번째에는 abi를 복사한 값을 넣어주면 된다. 이때 콤마까지 복사하지 않도록 주의하자. 그리고나서 interact를 누른다.

각각 눌러보고 call을 누르면 내용을 알 수 있다.





우리가 선언한 건 5개의 변수인데 4개만 나왔다. text가 나오지 않았다. public을 붙이면 공개되어 남들도 쓸 수 있는 변수이고, public을 안 붙이면 남들도 쓸 수 없다.

3. opnezeppelin-solidity 사용하기

3-1. 코드 작성하기

node_modules>opnezeppelin-solidity>contracts>token>ERC20의 내용을 가져올 것이다.

import '../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol'; 을 추가해준다.

_mint: 생성을 했을 때 초기화 해주는 코드
ERC20.sol에서 있는 _mint의 내용을 한 번 보자.

  • contracts>PengToken 전체코드
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

import '../node_modules/openzeppelin-solidity/contracts/token/ERC20';


contract PengToken is ERC20{
  string public _name = "PENG TOKEN";
  string public _symbol = "PENG";
  // uint256 public _decimals = 18; 함수여서 그냥 갖다 쓰기만 하면 된다. 
  uint256 public _totalSupply =1000 * (10**uint256(decimals()));//형변환한다. 
  string _text = "hello world!";
//_ 붙이는 이유 ERC20.sol에서 함수명을 똑같이 쓰고 있어서 ㅎㅎㅎ
  constructor() ERC20(_name,_symbol) {
    _mint(msg.sender,_totalSupply);
  //토큰 생성 끝
  
  }
}

터미널에 다음과 같이 써준다.
npx truffle compile
npx truffle migrate

contract address: 0x9766EadBcB42938849D39116C5177B7ed5Ffd707
account: 0x0E903Aba90C9AD79948B858B23bb6e6fBE284dd2

  • build>contracts>PengToken.json
    여기서 abi를 복사한다.


MEW에서 작업을 해보자.

interact를 눌러보자.

아까보다 많은 것을 알 수 있다.

import token을 해보자.

아직 내 주소에 넣으면 다시 돌려주는 코드는 구현이 안되어있다. 그건 우리가 직접 만들어서 짜야한다!

3-2. 계정간 보내보기

계정 2개에 import Token을 해준다.

잘 보내진 걸 확인할 수 있다.

4. Ownable.sol과 Pausable.sol이용하기

4-1.Ownable.sol

배포자만 실행할 수 있게 해주는 라이브러리
contracts>acceess있음

4-2.Pausable.sol

contracts>security에 있음
메소드를 호출하면 pause() unpause()를 쓸 수 ㅇㅆ게 된다.

  • pause(): 컨트랙트 동작을 잠시 멈춤
  • unpause() : 컨트랙트 동작을 다시 실행

4-3.PengToken.sol 수정하기

ownable

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

import '../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol';
import '../node_modules/openzeppelin-solidity/contracts/access/Ownable.sol';
import '../node_modules/openzeppelin-solidity/contracts/security/Pausable.sol';


contract PengToken is ERC20,Ownable,Pausable{
  string public _name = "PENG TOKEN";
  string public _symbol = "PENG";
  // uint256 public _decimals = 18; 함수여서 그냥 갖다 쓰기만 하면 된다. 
  uint256 public _totalSupply =1000 * (10**uint256(decimals()));//형변환한다. 
  string _text = "hello world!";
//_ 붙이는 이유 ERC20.sol에서 함수명을 똑같이 쓰고 있어서 ㅎㅎㅎ
  constructor() ERC20(_name,_symbol) {
    _mint(msg.sender,_totalSupply);
  //토큰 생성 끝
  
  }
  function pause() public onlyOwner{
    _pause();
  }

  function unpause() public onlyOwner{
    _unpause();
  }


}

5.testnet에 배포

infura.io에 들어간다.
회원가입을 한다. 로그인을 한다.


형광펜으로 표시한 주소가 중요하다.

그래서 truffle-config.js를 수정해야 한다.
2가지 영역을 수정해야 한다.

  • 메타마스크

  • 네트워크

  • truffle-config.js
    21-24번째 주석 풀어준다.

npm i @truffle/hdwallet-provider
.secret파일을 생성해야 한다.


ropsten의 주석을 풀어준다.
YOUR-PROJECT-ID부분에 아까 형광펜으로 칠한 부분을 붙여넣어준다.

.secret

이건 메타마스크 시드 문구를 root디렉토리에(truffle-config.js와 같은 위치에) .secret이라는 파일을 생성해서 넣어준다.

시드문구 찾는 방법

truffle compile
truffle migrate --network ropsten

오래 걸린다 ㅎㅎㅎㅎ😁

contract address: 0xaD32C2CC822EBB079d6621FFC2975Bd9C5333abf

https://ropsten.etherscan.io 에 들어간다.
이건 ropsten 테스트넷에서의 이더리움의 활동을 볼 수 있는 사이트이다. https://etherscan.io는 그냥 이더리움 메인넷의 내용을 볼 수 있는 사이트이다. 유용하게 잘 쓸 것이다.


내가 만든 스마트 컨트랙트의 주소이다.

https://ropsten.etherscan.io/tx/0x470d62b9b78ace4c4d8273ec7b7ce7f69bbe0eed1252eee3aa0299c2d5edd752

profile
코딩 재밌어요!

0개의 댓글