트러플 설치하기
install을 한 후에 잘 설치되었으면 truffle version의 결과가 나온다.
$ npm init -y
// 편한대로 둘 중에 하나 골라서 설치
$ npm install truffle
$ npm install -g truffle (전역설치)
$ truffle version // 이게 안되면 아래코드 사용
$ npx truffle version //트러플이 전역설정이 안 되어있어서 npx를 사용하는것
메타마스크에 ganache 네트워크 생성해서 계정 불러오기
트러플 세팅하기
$ npx truffle init
코드를 작성하면 트러플로 개발환경을 만들어주는데, 다음과 같은 파일과 디렉토리가 생성된다.
여기서 트러플을 사용하는 목적이 솔리디티 코드 작성과 배포관리라는 것을 알 수 있다.
- build(나중에 생성됨) : 솔리디티 코드가 컴파일 된 내용을 넣는 공간
- contracts : 솔리디티 코드를 넣는 공간
- migration : deploy 배포를 할 수 있는 코드를 넣는 공간
- test : 배포된걸 실행시켜보는 공간
- truffle-config.json : 네트워크 설정값
truffle-config.js 파일 수정
truffle-config.json에서 어떤 네트워크에서 배포할지 설정해주자.
private 네트워크를 사용한다던가 여러가지를 사용할때 이 곳을 수정해주면된다.
예) ws로 geth를 실행할때, websockets: true로 사용하면 됨.
networks: {
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 8545, // RPC 통신을 위한 포트
network_id: "*", // 사용하고있는 chainId
// websockets: true, 웹소켓 프로토콜을 사용하고 있는 경우
},
트러플로 사용할 코드 작성하기
컴파일을 하기위해 새 솔리디티 파일 HelloWorld와 Migration을 만들어 contracts에 넣어주었다.
// contracts/HelloWorld.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
contract HelloWorld{
// public -> getter파일 생김 -> abi파일이 생겨야함 -> 어디서든지 꺼내쓸 수 있어야하니까
string public value;
constructor(){
value="Hello World";
}
function setValue(string memory _v)public{
value = _v;
}
}
// contract/Migration
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
contract Migration{
address public owner = msg.sender;
uint public last_completed_migration;
modifier restricted(){
require(
msg.sender == owner,
"This function is restricted to the contract's owner"
);
_;
}
function setCompleted(uint completed) public restricted{
last_completed_migration = completed;
}
}
트러플로 솔리디티 compile하기
다음 코드로 컴파일 해주면 아까는 없었던 build 디렉토리가 생기고, abi파일과 바이트코드 같은 정보들이 담겨있는 json 파일들이 생긴다.
$ npx truffle compile
가끔 이 상태에서 컴파일이 안되는 경우가 있는데,
HelloWorld 솔리디티 파일에 적어놓은 솔리디티 버젼과
truffle-config.json에 적혀있는 솔리디티 버젼이 달라서 생기는 이슈일 수 있다.
truffle-config.json에 현재 사용하고 있는 솔리디티 버젼으로 바꿔서 수정해주자.
compilers: {
solc: {
// version: "0.5.4", 수정하기 전
version: "0.8.15", //수정한 코드
migration으로 스마트 컨트랙트 배포하기
build/contracts 디렉토리 안에 있는 json파일을 가져오는 migration 파일을 생성하자.
- articatcts.require("") : 솔리디티 코드를 컴파일한 json 파일 명
- deploy : 트러플이 제공하는 배포를 위한 tool
- deployer.deploy : 위에서 읽어온 계약 내용
// migrations/2_deploy_HelloWorld.js
// build/contracts/HelloWorld를 가져오는 코드
const helloWorld = artifacts.require("HelloWorld");
module.exports = function (deployer) {
//abi파일과 바이트코드가 담겨있는 helloWorld를 배포할것이다.
deployer.deploy(helloWorld);
};
migration 디렉토리를 보면 파일이 하나 만들어져있는데 파일명에 법칙이 있다.
번호만 겹치지 않는다면 다른것들은 중복되어도 괜찮다.
[번호]\_내용\_컨트랙트이름 ----> 1_initial_migration.js
컴파일 후 만들어진 build/contracts 안의 파일들을 불러오는 코드다.
이 파일들 안에는 abi파일과 바이트코드의 내용들이 들어있다.
설정이 끝났으면 다음 코드로 배포를 해주자.
( ganache 서버가 켜져있는지 확인하기! )
배포를 할때, migration.json이 먼저 배포되고 다음으로 다른 파일들이 배포된다.
$ npx truffle migration
// 싱글톤 인스턴스라서 update기능이 없다.
// 수정하려면 새로 배포해야한다.
$ npx truffle migration --reset
다음과 같은 결과가 나왔다면 무사히 스마트컨트랙트가 끝나고 마이닝도 끝났다는 뜻이다.
메타마스크를 확인하면 계정에 잔액이 줄어있는걸 확인할 수 있다.
스마트 컨트랙를 사용해서 거래를 했기때문에 사용료인 gas비를 냈기때문이다.
'프로그래밍 > solidity' 카테고리의 다른 글
[220713] 스마트 컨트랙트 구현하기 - 2) 백엔드에서 요청보내기 (0) | 2022.07.14 |
---|---|
[220713] 스마트 컨트랙트 구현하기 - 1) 트러플로 구현하기 (0) | 2022.07.13 |
[220712] JSON 컴파일을 구현해서 abi, bytecode 파일 생성, 배포하기 (0) | 2022.07.06 |
크립토좀비) 챕터3 개념 (0) | 2022.07.06 |
크립토좀비) 챕터4 개념 / payable, transfer (0) | 2022.07.06 |
댓글