본문 바로가기
Ethereum/부동산 Dapp

부동산Dapp_(2)트러플 & 컨트랙 배포

by rooney-l3 2019. 8. 30.

<트러플 구조>

 

[step1]

PowerShell 커맨드

트러플 실습을 진행 할 폴더를 생성하도록 합니다.  저는 BlockChain폴더안에 truffle 폴더를 만들어 실습을 진행하였습니다.

 

생성한 폴더로  이동한 후 truffle init 커맨드를 입력해줍니다. 이는 해당 폴더안에 프로젝트를 초기화 하기 위함입니다. 

초기화가 완료되면 해당 폴더안에 여러 파일들이 생성됩니다. VSC로 해당 폴더를 열어보고 어떤 파일들이 생성되었는지 살펴보겠습니다. 

 

[step2]

truffle init 후 생성된 파일들

 

 

Contracts 디렉토리 : 솔리디티 contract들을 보관하는 곳입니다. 디렉토리 안에 Migration.sol 파일이 생성되어있습니다. 이 파일은 contract를 배포할 때 migrations 폴더 안에 있는 script 파일들을 실행하게합니다.

 

migrations 디렉토리 : script 파일들이 보관되는 곳입니다. script파일에는 배포하는 과정이 담긴 로직이 들어있습니다. 앞에 접두사를 주목해야하는데 앞서 설명한 Migration.sol이 contract를 배포 할 때 앞에 분여진 숫자를 보면서 순차적으로 script파일들을 실행하게 됩니다. 따라서 새로운 script를 생성할 경우 순차적으로 진행되는 숫자를 붙여줘야합니다. 

디렉토리 안에 생성되어있는 1_initial_migration.js파일은 Migration.sol을 노드에 배포하는 로직이 담겨있습니다. 

 

test 디렉토리 : contract를 테스트하는데 쓰이는 디렉토리입니다.

 

truffle-config.js : truffle-config.js 혹은 truffle.js 파일이 생성됩니다. 이 둘은 동일한것이므로 truffle-config.js 이 생성되었다면 이름을 truffle.js 로 바꿔주도록 하고 truffle.js파일이 생성된 경우 truffle-config.js 파일을 지워주도록 합니다. (윈도우 커맨드 창에서 truffle.js파일이 문제를 일으켜 이름을 truffle-config.js로 바꾼것이라고 합니다. 저는 PowerShell에서 실습을 진행할 것이므로 앞서 설명한것과 같이 truffle.js로 이름을 바꿔서 진행하려고 합니다.) 이 파일에는 어느 네트워크에 배포할지 정의를 내리는 코드가 담겨져 있습니다. 뒤에 설명할 ganache네트워크에 배포하려는 경우 이 파일의 코드를 수정해야합니다. 

 

 

<컨트랙트 배포>

 

[step1]

Contract 배포 실습을 위해 아래 사진과 같이 contract디렉토리에 Mycontract.sol 파일을 생성하고 migrations디렉토리에 2_deploy_contract.js파일을 생성해줍니다. 

실습파일 생성

Migrations.sol 파일의 코드는 아래와 같습니다.

pragma solidity ^0.4.24;

contract MyContract {
    struct Student {
        string studentName;
        string gender;
        uint age;
    }
   
    mapping(uint256 => Student) studentInfo;
   
    function setStudentInfo(uint _studentId, string _name, string _gender, uint _age) public {
        Student storage student = studentInfo[_studentId];
       
        student.studentName = _name;
        student.gender = _gender;
        student.age = _age;
    }
   
    function getStudentInfo(uint256 _studentId) public view returns (string, string, uint) {
        return (studentInfo[_studentId].studentName, studentInfo[_studentId].gender, studentInfo[_studentId].age);
    }
}

 

2_deploy_contract.js 파일의 코드는 아래와 같습니다.

const MyContract = artifacts.require("./MyContract.sol");

module.exports = function(deployer) {
  deployer.deploy(MyContract);
};

 

 

[step 2]

truffle develop 입력

새로운 PowerShell창을 열고 truffle 초기화한 폴더로 이동합니다. 이동 후 truffle develop 커맨드를 입력하게 되면 truffle 내부에서 이더리움 노드를 실행시키게 되고 테스트 계정 10개를 생성하게 됩니다. 그러면서 맨 밑에 보이는 것과 같이 truffle JavaScript 콘솔이 실행되는 것을 볼 수 있습니다. 

 

[step3]

truffle develop --log

또 새로운 PowerShell창을 열고 truffle develop --log 커맨드를 입력해줍니다. 이는 현재 트러플 네트워크에서 실행중인 노드에 접속하여 그 노드의 로그 상태를 확인하기 위함입니다. 

 

[step4]

truffle JavaScript 콘솔이 실행되어있던 PowerShell로 돌아와서 migrate 커맨드를 입력하여 배포를 진행해봅니다. 트러플 이더리움 노드에 두개의 contract를 배포한 것을 확인 할 수 있습니다. 1번 네모안의 내용이 migration contract를 배포하면서 생긴 트렌젝션의 해쉬값입니다. 2번 네모안의 내용은 네트워크의 어느 주소에 해당 contract가 배포되었는지를 나타냅니다.

 

이전에 켜놓았었던 log창을 보면 2개의 트렌젝션이 발생한것을 볼 수 있습니다. 앞에서 migate커맨드를 입력했을 때 나온 2개의 트렌젝션의 해쉬값이 log창의 트렌젝션의 해쉬값과 같은것을 확인 할 수 있습니다. 

 

[step5]

migrate를 하고나면 truffle폴더안에 build라는 새로운 폴더가 생성 된것을 확인 할 수 있습니다. 각각의 파일은 해당 contract의 abi정보와 contract과 관련된 모든 정보를 담고 있습니다. 우리가 constract에서 쓰는 변수들과 함수들이 json형식으로 저장되어있습니다. 

 

<트러플 콘솔 사용>

 

[step1]

truffle 콘솔에서도 web3를 사용할 수 있습니다. 계정을 조회해봤습니다.

 

[step2]

계정의 잔고를 조회합니다. 끝에 toNumber()를 붙이면 보기쉽게 잔액을 나타내줍니다.

 

[step3]

 

우리가 truffle 노드에 배포했던 MyContract를 불러오고 MyContract에서 정의했던 함수를 사용하기 위해서 먼저 전역변수에다가 MyContract의 instance를 저장해야합니다. MyContract가 배포가 되었으면 전역변수 app에다가 MyContract의 instance를 저장하라는 의미입니다. 

 

[step4]

truffle 노드에 학생 정보를 입력하기 위해 Mycontract에 정의했던 setStudentInfo 함수를 사용해봅니다. 우리가 정의했던 4개의 인자 외에 from 인자를 추가해주어야합니다. setStudentInfo 함수를 사용할 때 어느 계정에서 불러와서 사용하는건지 정의해줘야하기 때문입니다. 따라서 해당 함수를 실행할 때 gas수수료는 정의해준 계정에서 나가게 됩니다.

 

account[1]계정에서 가스가 나간것을 확인 할 수 있다.

 

[step5]

getStudentInfo 함수를 사용하여 학생 정보를 불러옵니다. 해당 함수는 view 함수이르모 가스를 소모하지 않습니다. 

 

 

<ganache 네트워크 사용>

 

[step1]

오타 networkid => network_id 입니다.

ganache 네트워크에 접속하기위해서는 truffle.js파일의 코드를 변경해 주어야 합니다. 

코드는 아래와 같습니다.

module.exports = {
  networks: {
    ganache:{
      host : "localhost",
      port : 8545,
      network_id : "*"
    }
  }
}

ganache를 실행시켰을 때 위의 정보와 같게 입력해준것입니다. networkid에 "*"을 입력한것은 어떠한 네트워크 아이디를 입력하더라도 접속할 수 있게 하겠다는 의미입니다. 

 

 

[step2]

contract을 ganache 노드에 배포했습니다. 

 

노드에 contract를 배포하면 MyContract.json 파일안에 새로운 네트워크 "5777"이 생긴것을 확인 할 수 있습니다. 5777은 위의 ganache 정보의 networkid에 써있던 것입니다. 

 

ganache의 transactions 창에 가면 배포하면서 생긴 트렌젝션을 확인 할 수 있습니다.

 

 

[step3]

ganache 네트워크에 연결하기위해 커맨드를 입력하였습니다.

 

[step4]

위에서 했던것과 마찬가지로 전역변수 app에 Mycontract의 instance를 저장해주고 Mycontract의 함수를 사용해봅니다. 

 

 

블록체인 공부중에 있습니다. 잘못된 정보가 있으면 댓글로 남겨주세요. 한번 더 배우겠습니다. 

감사합니다. 

댓글