본문 바로가기
IT/이더리움 Ethereum

이더리움 DApp 개발 . Truffle + Ganache 연동 . smart contract 배포

by SidePower 2022. 9. 24.

이전까지 DApp 개발을 위한 필요한 프로그램 설치였다면

이제 이 프로그램들을 연계해서 이더리움 블록체인을 체험해 보겠습니다.

 

Truffle - solidity 개발 환경

Ganache - 이더리움 블록체인 로컬 네트워크 환경

MetaMask - 이더리움 지갑(계정)

 

Truffle로 스마트 계약을 만들어 Ganache 블록체인에 배포해서

Metamask 지갑에 ether가 송금되는지 확인합니다.

 

하나씩 해보겠습니다.

 

 Truffle과 Ganache 연동

트러플과 가나슈 연동을 위해 네트워크 설정을 맞춥니다.

 

ganache를 실행하면 아래처럼

Network ID와 RPC Server 정보가 설정되어 있어요.

가나슈를 기준으로 트러플을 설정하겠습니다.

 

● 우선 이더리움 사설 네트워크의 기본 NETWORK ID인 1337로 바꿔주세요.

 

ganache 오른쪽 끝부분에 설정 메뉴 클릭하세요.

SERVER 메뉴에서 NETWORK ID를 1337로 변경

오른쪽 RESTART 클릭하세요.

 

 gaanche 이더리움 네트워크 

▩ RPC SERVER → HTTP://127.0.0.1:7545

IP(host)가 127.0.01이고 port가 7545입니다.

▩ NETWORK ID → 1337

C:\pjdapp>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: A8FA-0147

 C:\pjdapp 디렉터리

2021-12-21  오후 03:44    <DIR>          .
2021-12-21  오후 03:44    <DIR>          ..
2021-12-21  오후 03:44    <DIR>          build
2021-12-21  오후 03:43    <DIR>          contracts
2021-12-21  오후 03:43    <DIR>          migrations
2021-12-21  오후 03:43    <DIR>          test
2021-12-20  오후 10:59             4,901 truffle-config.js
               1개 파일               4,901 바이트
               6개 디렉터리  71,132,753,920 바이트 남음

 

● truffle-config.js 파일에서 트러플 네트워크를 설정합니다.

 truffle 이더리움 로컬 네트워크 설정

truffle-config.js 파일 열면 아래처럼
networks 밑으로 모두 // 주석처리되어 있어요.
네트워크 설정 부분만 주석을 풀어 사용해도 되지만
너무 지져분한거 같아 다 지우고 필요한것만 지정하도록 할게요.
어차피 다 주석이니 지워도 문제 될거 없어요.ㅋ

 truffle-config.js 기존 내용
networks: {
    // Useful for testing. The `development` name is special - truffle uses it by default
    // if it's defined here and no other network is specified at the command line.
    // You should run a client (like ganache-cli, geth or parity) in a separate terminal
    // tab if you use this network and you must also set the `host`, `port` and `network_id`
    // options below to some value.
    //
    // development: {
    //  host: "127.0.0.1",     // Localhost (default: none)
    //  port: 8545,            // Standard Ethereum port (default: none)
    //  network_id: "*",       // Any network (default: none)
    // },
    // Another network with more advanced options...
    // advanced: {
    // port: 8777,             // Custom port
    // network_id: 1342,       // Custom network
    // gas: 8500000,           // Gas sent with each transaction (default: ~6700000)
    // gasPrice: 20000000000,  // 20 gwei (in wei) (default: 100 gwei)
    // from: <address>,        // Account to send txs from (default: accounts[0])
    // websocket: true        // Enable EventEmitter interface for web3 (default: false)
    // },
    // Useful for deploying to a public network.
    // NB: It's important to wrap the provider as a function.
    // ropsten: {
    // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`),
    // network_id: 3,       // Ropsten's id
    // gas: 5500000,        // Ropsten has a lower block limit than mainnet
    // confirmations: 2,    // # of confs to wait between deployments. (default: 0)
    // timeoutBlocks: 200,  // # of blocks before a deployment times out  (minimum/default: 50)
    // skipDryRun: true     // Skip dry run before migrations? (default: false for public nets )
    // },
    // Useful for private networks
    // private: {
    // provider: () => new HDWalletProvider(mnemonic, `https://network.io`),
    // network_id: 2111,   // This network is yours, in the cloud.
    // production: true    // Treats this network as if it was a public net. (default: false)
    // }
  },


 truffle-config.js 변경 내용
networks 부분만 변경하고 파일 내의 다른부분은 그대로 두세요.
위의 내용이 아래처럼 확 줄었습니다.
  networks: {
    localnw: {        // 네트워크 이름 development -> localnw (local networld 줄임)
      host: "127.0.0.1",     // ganache host
      port: 7545,            // ganache port
      network_id: "1337",       // ganache network id
     }
  },

 

 스마트 계약 배포해서 송금확인

지난번에 작성한 스마트 계약을 배포해서 테스트해볼 거예요.

 

● truffle migrate 

truffle migrate 명령어로 스마트 계약을 간단하게 배포할 수 있네요.

 

migrate(배포)는 migrations 폴더에 배포용 자바스크립트(js)에 의해 진행됩니다.

그래서 배포용 js파일을 만들어줘야 됩니다.

 배포용 JS 샘플
const Migrations = artifacts.require("Migrations");

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

샘플과 동일하게 만들고 contract 이름만 바꿔주면 되며
contract에 생성자에 인자값을 전달해야 된다면 아래처럼 기입해주시면 됩니다.
deployer.deploy(Migrations,인자값...);

전에 만들어 둔 Hello.sol 을 그대로 사용할게요.

 Hello.sol의 배포 js파일 만들기
const Hello = artifacts.require("Hello");

module.exports = function (deployer) {
  deployer.deploy(Hello,"nice to meet you");
};

 배포 JS파일 명칭
migrations 폴더에 있는 배포 JS 파일이름 규칙이 있습니다.
숫자_파일.js

아래 보시면 1_initial_migration.js이 있어요. 1_ 라는 prefix가 있죠.

C:\pjdapp\migrations 디렉터리
2021-12-21  오후 03:43    <DIR>          .
2021-12-21  오후 03:43    <DIR>          ..
2021-12-20  오후 10:57               126 1_initial_migration.js
               1개 파일                 126 바이트
               2개 디렉터리  71,140,007,936 바이트 남음

저는 2_hello_contract.js로 만들었어요.
prefix 숫자는 기존 다음 순번으로 2로 정했습니다. 

 C:\pjdapp\migrations 디렉터리
2021-12-21  오후 09:24    <DIR>          .
2021-12-21  오후 09:24    <DIR>          ..
2021-12-20  오후 10:57               126 1_initial_migration.js
2021-12-21  오후 09:24               114 2_hello_contract.js

 

● truffle 배포

배포 전의 ganache 상태를 볼게요.

 

▩ ACCOUNTS

지갑(계정) 10개(INDEX 0~9)와 각 지갑마다 100 ETH가 갖게 되네요.

▩ BLOCKS

블록 0으로 아무것도 없네요.

▩ TRANSACTIONS

트랜젝션 발생도 전혀 없는 상태예요.

배포 후에 어떤 변화가 있는지 볼게요.

 

 truffle 배포(deployer) 명령어

truffle migrate --network [네트워크 이름]

네트워크 이름은 truffle-config.js에 지정한 localnw입니다.


 deployer (배포) 하기

C:\pjdapp>truffle migrate --network localnw

Compiling your contracts...
===========================
> Compiling .\contracts\Hello.sol
> Compiling .\contracts\Migrations.sol
> Artifacts written to C:\pjdapp\build\contracts
> Compiled successfully using:
   - solc: 0.8.10+commit.fc410830.Emscripten.clang


Starting migrations...
======================
> Network name:    'localnw'
> Network id:      1337
> Block gas limit: 6721975 (0x6691b7)

1_initial_migration.js
======================

   Replacing 'Migrations'
   ----------------------
   > transaction hash:    0x4454004c657ec8de6a76c06f41de6f3988c56f5b7fb8fb0eb3c6fdf9029f9c67
   > Blocks: 0            Seconds: 0
   > contract address:    0x6dc277D2e071b8E6DF08da6Db95544cb49F1A26e
   > block number:        1
   > block timestamp:     1640096411
   > account:             0xf91A58a2853Ed340cE39962fd83d62CCe5f35061
   > balance:             99.99502292
   > gas used:            248854 (0x3cc16)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00497708 ETH

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.00497708 ETH


2_hello_contract.js
===================

   Deploying 'Hello'
   -----------------
   > transaction hash:    0x71af52be8e859ce42e520ea9f64fd7d3cd8bab057f40ee46516799e7620e2026
   > Blocks: 0            Seconds: 0
   > contract address:    0x58C117e2046cbE6Fe040Ee16bF93fD82D9f68838
   > block number:        3
   > block timestamp:     1640096414
   > account:             0xf91A58a2853Ed340cE39962fd83d62CCe5f35061
   > balance:             99.98649866
   > gas used:            383700 (0x5dad4)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.007674 ETH

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:            0.007674 ETH

Summary
=======
> Total deployments:   2
> Final cost:          0.01265108 ETH

C:\pjdapp>

 배포과정을 보니 compile를 먼저 하고 migrations 처리되네요.
migrations 폴더안에 있는 배포 JS파일을 모두 배포대상으로 하며
1_initial_migration.js
2_hello_contract.js
각 배포 JS별로 트랜젝션 hash와 block number (블록 생성 개수) 그리고
gas 비용까지 잘 보여줍니다.
마지막에 Summary까지 Total 2개 배포했고 최종 비용 0.01265108 ETH 까지 굿입니다.

 

배포 후에 ganache 상태를 볼게요.

▩ ACCOUNTS

첫번째 지갑(0xf91A58a2853Ed340cE39962fd83d62CCe5f35061)의 잔액이

100에서 99.99 ETH가 되었으며 TX COUNT (트랜젝션 개수)가 4로 바꿨어요.

수신 지갑을 정하지 않고 truffle 배포를 하면

ganache의 첫번째 지갑으로만 처리가 되네요.

▩ BLOCKS

블록이 4개 생겼네요.

▩ TRANSACTIONS

트랜젝션 hash (TX HASH)와 송신과 수신 지갑 주소까지 보여주며

각 트랜젝션별 Gas까지 표시되네요.

드디어 뭔가를 해낸 거 같네요.^^;;

 

반응형

댓글