오늘의 목표
1. 환경 설정
2. 코드 작성
3. 가나슈 배포(로컬 배포)
4. 테스트넷 배포(테스트넷 이더리움)
블록체인은 불변성이 있다. 하지만 오픈 제펠린을 통해서 컨트랙트를 수정할 수 있다. proxy contract나 logic contract를 수정할 수 있다. 그러나 함수호출을 abi를 통해서가 아닌 직접 호출로 처리하는 방법을 알아야 사용이 용이하다.
GAS 수수료를 소비자가 아닌 smart contract 소유자가 내는 것으로 바뀌었다.
기본적인 함수들이 여기에 구현이 잘 되어 있다.
my ether wallet
https://www.myetherwallet.com/
여기서 메타마스크를 연결하게 될 것이다. 나는 여기서 0이 떴지만 smart contract를 배포하는 데는 문제가 없었다.
npx truffle init
npm init
npm install openzeppelin-solidity
npx truffle version
을 쳐서 확인해본다.
여기서 보면 solidity 버전이 0.5.16으로 되어있음을 확인할 수 있다. 코드를 고치던지 아니면 환경을 바꾸든지 둘 중 하나를 바꾸어주어야 한다. 매번 코드를 바꾸는것보다는 환경을 맞춰주는게 편하다.
truffle-config.js를 수정해준다.
compilers의 버전을 수정해준다.
그러고나서 터미널에 다음과 같이 치면 수정이 되어있는 것을 확인할 수 있다.
npx truffle version
npx truffle create contract PengToken
npx truffle create migration PengToken
을 터미널에 입력한다.
그러면 다음과 같은 파일이 생성됨을 알 수 있다.
// 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 {
}
}
const PengToken = artifacts.require("PengToken");
module.exports = function (_deployer) {
_deployer.deploy(PengToken);
};
다 작성한 후에 터미널에 다음과 같이 입력해준다.
npx truffle compile
npx truffle migrate
contract address: 0x4b2E99cDd65cA52C1dbcF79AeD15cd31765959f0
account: 0x0E903Aba90C9AD79948B858B23bb6e6fBE284dd2
MEW를 사용하면 화면을 그리지 않고도 스마트 컨트랙트의 기능을 확인할 수 있다.
ABI 를 가져와야 한다.
build>contracts>pengtoken에서 abi를 복사한다. 아래 화살표를 눌러서 하면 쉽다.
두번째 칸에느 스마트 컨트랙트 주소를,
세번째에는 abi를 복사한 값을 넣어주면 된다. 이때 콤마까지 복사하지 않도록 주의하자. 그리고나서 interact
를 누른다.
각각 눌러보고 call을 누르면 내용을 알 수 있다.
우리가 선언한 건 5개의 변수인데 4개만 나왔다. text가 나오지 않았다. public을 붙이면 공개되어 남들도 쓸 수 있는 변수이고, public을 안 붙이면 남들도 쓸 수 없다.
node_modules>opnezeppelin-solidity>contracts>token>ERC20의 내용을 가져올 것이다.
import '../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol';
을 추가해준다.
_mint: 생성을 했을 때 초기화 해주는 코드
ERC20.sol에서 있는 _mint의 내용을 한 번 보자.
// 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
MEW에서 작업을 해보자.
interact를 눌러보자.
아까보다 많은 것을 알 수 있다.
import token을 해보자.
아직 내 주소에 넣으면 다시 돌려주는 코드는 구현이 안되어있다. 그건 우리가 직접 만들어서 짜야한다!
계정 2개에 import Token을 해준다.
잘 보내진 걸 확인할 수 있다.
배포자만 실행할 수 있게 해주는 라이브러리
contracts>acceess있음
contracts>security에 있음
메소드를 호출하면 pause() unpause()를 쓸 수 ㅇㅆ게 된다.
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();
}
}
infura.io에 들어간다.
회원가입을 한다. 로그인을 한다.
형광펜으로 표시한 주소가 중요하다.
그래서 truffle-config.js를 수정해야 한다.
2가지 영역을 수정해야 한다.
메타마스크
네트워크
truffle-config.js
21-24번째 주석 풀어준다.
npm i @truffle/hdwallet-provider
.secret파일을 생성해야 한다.
ropsten의 주석을 풀어준다.
YOUR-PROJECT-ID부분에 아까 형광펜으로 칠한 부분을 붙여넣어준다.
이건 메타마스크 시드 문구를 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