사랑하애오
article thumbnail

기본 세팅

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

 

openzeppelin

블록체인은 불변성이 있다. 하지만 오픈 제펠린을 통해서 컨트랙트를 수정할 수 있다.

proxy contract나 logic contract를 수정할 수 있다.

그러나 함수호출을 abi를 통해서가 아닌 직접 호출로 처리하는 방법을 알아야 사용이 용이하다.

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

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

 

MEW 연결

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

 

 


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

 

코드 작성

 

openzeppelin 설치

truffle init

or

npx truffle init
npm init -y
npm install openzeppelin-solidity web3 fs

 

truffle-config 수정

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

매번 코드를 바꾸는것보다는 환경을 맞춰주는게 편하다.
truffle-config.js를 수정해준다.
compilers의 버전을 수정해준다.

 

truffle create contract MimiToken
truffle create migration MimiToken

or

npx truffle create contract MimiToken
npx truffle create migration MimiToken


을 터미널에 입력한다.

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

Migrations 관련은 기본으로 생성되는것임으로 지워도 상관없다.

 

 

 

시작에 앞서 가나슈를 실행시켜 0.0.0.0:8545 포트를 실행해준다.

truffle-config.js에서 network 하위에 있는 develop부분 주석을 풀어준다.

에러가 겁나 뜨는데 아무도 안알려줘서 직접 하나하나 다 찾아보는 수고를 했는데 우리는 그러지 맙시다!

 

Mimi.sol

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

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

  constructor() {
    // constructor() 옆에 public을 써도 되고 안써도 되지만 DOCS에서는 쓰지 않는걸 권장한다.
  }
}

 

1645064810_mimi_token.js

const MimiToken = artifacts.require("MimiToken");

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

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

 

truffle compile
truffle migrate

or

npx truffle compile
npx truffle migrate

 

그러면 이렇게 build/contracts 디렉토리와 안에 compile된 json파일들을 볼 수 있다.

 

그리고 migrate된 것도 확인할 수 있는데 우리는 contract address랑 account만 필요합니다.

 

MEW

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

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


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


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


우리가 선언한 건 5개의 변수인데 4개만 나왔다. text가 나오지 않았다.

public을 붙이면 공개되어 남들도 쓸 수 있는 변수이고, public을 안 붙이면 남들도 쓸 수 없다.

 

opnezeppelin-solidity 사용하기

 

코드 작성하기

 

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

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

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

 

MimiToken.sol 전체코드

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

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


contract MimiToken is ERC20{
  string public _name = "MIMI TOKEN";
  string public _symbol = "MIMI";
  // 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);
  //토큰 생성 끝
  
  }
}

터미널에 다음과 같이 써준다.

truffle compile
truffle migrate

or

npx truffle compile
npx truffle migrate

 

그러면 MimiToken.json 뿐 아니라 다른 것들도 compile 된것을 확인할 수 있다.

그리고 compile이랑 migrate를 다시 했기에 contract address랑 account를 다시 확인해주고,

 

build/contracts/MimiToken.json
여기서 abi를 또 복사한다.

compile이랑 migrate할 때마다 계속 새롭게 복사한다고 생각하면 된다.

 


MEW에서 작업을 해보자.

 


interact를 눌러보자.


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

import token을 해보자.

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

 

계정간 보내보기

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

그리고 토큰 보내기를 실행해준다. 이정도는 스스로 해보자.

 


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

 

Ownable.sol과 Pausable.sol이용하기

 

Ownable.sol

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

../node_modules/openzeppelin-solidity/contracts/access/Ownable.sol

contracts>acceess있음

 

Pausable.sol

../node_modules/openzeppelin-solidity/contracts/security/Pausable.sol

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

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

 

MimiToken.sol 수정하기

 

// 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 MimiToken is ERC20, Ownable, Pausable {
    string public _name = "MIMI TOKEN";
    string public _symbol = "MIMI";
    // 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();
    }
}

 

다 수정했으면 다시 compile 해주고 migrate를 해준다.

truffle compile
truffle migrate

or 

npx truffle compile
truffle migrate

 

그리고 확인해주면 Ownable.json과 Pausable.json이 잘 compile된 것을 확인해줄 수 있다.

그리고 또 contract address랑 abi를 복사해 interact를 해준다.

그러면 우리가 코딩한 것들이 추가 된 것을 확인해 줄 수 있다.

 

testnet에 배포

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

 


박스로 표시한 주소가 중요하다.

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

메타마스크

네트워크

truffle-config.js


21-24번째 주석 풀어준다.

 

npm i @truffle/hdwallet-provider

그리고 위의 모듈을 설치해준다.


.secret파일을 생성해야 한다.

ropsten의 주석을 풀어준다.

 


위의 부분에 아까 박스로 표시한 주소를 붙여넣어준다.

 

그리고 .secret 파일을 만들기 위해서 복구키(니모닉(mnemonic))를 찾아야한다.

 

위 순서대로 하면 쉽게 찾을 수 있다.

 

.secret

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

 

truffle compile

truffle migrate --network ropsten

 


오래 걸린다 ㅎㅎ

https://ropsten.etherscan.io 에 들어간다.
이건 ropsten 테스트넷에서의 이더리움의 활동을 볼 수 있는 사이트이다. 

https://etherscan.io는 그냥 이더리움 메인넷의 내용을 볼 수 있는 사이트이다.
유용하게 잘 쓸 것이다.

 

이렇게 contract address를 복사해 넣어주고 조회해주면

 

이렇게 뜨는데 박스 친 부분을 누르면 상세 내용을 확인해 줄 수 있다.

 

끝!

profile

사랑하애오

@사랑하애

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!