6. Deploy Contract

  1. Truffle 환경 설정

  2. Deploy setup

  3. Deploy

1) Truffle 환경 설정

truffle-config.js는 컨트랙트 코드를 배포하는 것에 대한 파일입니다. truffle-config.js에서 다음 항목들을 설정할 수 있습니다.

1) 컨트랙트 배포 주체 (컨트랙트 배포 Klaytn 계정) **2) 컨트랙트 배포할 네트워크 ** **3) 컨트랙트 배포를 위해 지불할 가스의 양 **

컨트랙트를 배포하는 데에는 개인키를 이용하는 방법과 잠금 해제된 계정을 이용하는 방법 두 가지가 있습니다.

배포 방법 1: 개인키

경고: 개인키를 노출하면 안 됩니다. 만약 노출할 경우 계정이 해킹될 수도 있습니다.

개인키를 사용하여 컨트랙트를 배포하려면 provider 옵션이 필요합니다.

1) 개인키를 new HDWalletProvider()의 첫 번째 인자로 전달하세요.<code> 2\) Klaytn 노드의 URL을 new HDWalletProvider()의 두 번째 인자로 전달하세요.

예시)

{
 ...,
 provider: new HDWalletProvider(
   'YOUR PRIVATE KEY',
   'https://public-en-baobab.klaytn.net', // If you're running full node you can set your node's rpc url.
  ),
 ...
}
const HDWalletProvider = require("truffle-hdwallet-provider-klaytn");

const NETWORK_ID = '1001'
const GASLIMIT = '8500000'

/**
 * `URL`, `PRIVATE_KEY`을 상수로 설정하여 쉽게 값을 설정하도록 해줍니다.
 * 여기에 개인키와 Klaytn 노드의 URL을 설정하세요.
 */
const URL = `https://public-en-baobab.klaytn.net`
const PRIVATE_KEY = '0x48f5a77dbf13b436ae0325ae91efd084430d2da1123a8c273d7df5009248f90c'

module.exports = {
  networks: {
    /**
     * DEPLOY METHOD 1: By private key.
     * 개인키를 노출하지 마세요. 노출할 경우 계정이 해킹될 수도 있어요!!
     */
    baobab: {
      provider: () => new HDWalletProvider(PRIVATE_KEY, URL),
      network_id: NETWORK_ID,
      gas: GASLIMIT,
      gasPrice: null,
    },
  },
}

위의 코드에서 networks 속성을 봐주세요. 이 속성에는 baobab 키가 있는데, 이 키에는 또 다시 provider, network_id, gas, gasPrice 등 4개의 속성이 있습니다.

provider: new HDWalletProvider(PRIVATE_KEY, URL) 행은 컨트랙트를 배포하는 계정과 배포 대상 네트워크의 노드 URL을 받아옵니다.

network_id: NETWORK_ID 행은 Klaytn에서의 네트워크 ID를 지정합니다. Baobab 네트워크(testnet)는 1001입니다.

gas: GASLIMIT 행은 컨트랙트를 배포하는 데에 얼마까지 가스를 지불할 것인지 한도를 지정합니다.

gasPrice: null 행은 1 가스당 지불할 금액을 트러플에 전달합니다. 현재 Klaytn에서는 가격이 25000000000으로 고정되어 있습니다. 이 부분을 null로 설정하면 트러플에서 자동적으로 고정 가스 가격으로 설정합니다.

DEPLOY METHOD 2: By unlocked account (difficult)

To deploy a contract by unlocked account, you should have your Klaytn full node. Access your Klaytn node console by typing $ klay attach http://localhost:8551 If you don't have a Klaytn account in the node, generate it by typing personal.newAccount() on the console. If you already have one, unlock your account through personal.unlockAccount().

After ensuring account is unlocked, you should set the properties, host, port, network_id, and from. 1) Which network to deploy (host, port, network_id) 2) Who will deploy (from) 3) How much gas will you endure to deploy your contract (gas)

Put your unlocked account address on from. If you're running your own Klaytn full node, set the node's host to host and node's port to port.

example)

{
  host: 'localhost',
  port: 8551,
  from: '0xd0122fc8df283027b6285cc889f5aa624eac1d23',
  network_id: NETWORK_ID,
  gas: GASLIMIT,
  gasPrice: null,
}

2) Deploy setup (Which contract do you want to deploy?)

migrations/2_deploy_contracts.js:

const Count = artifacts.require('./Count.sol')
const fs = require('fs')

module.exports = function (deployer) {
  deployer.deploy(Count)
    .then(() => {
    // 'deployedAddress' 파일에 최근에 배포된 컨트랙트의 주소를 기록합니다.
    if (Count._json) {
      // deployedABI에 abi 파일을 저장합니다.
      fs.writeFile(
        'deployedABI',
        JSON.stringify(Count._json.abi, 2),
        (err) => {
          if (err) throw err
          console.log(`The abi of ${Count._json.contractName} is recorded on deployedABI file`)
        })
    }

    fs.writeFile(
      'deployedAddress',
      Count.address,
      (err) => {
        if (err) throw err
        console.log(`The deployed contract address * ${Count.address} * is recorded on deployedAddress file`)
    })
  })
}

You can specify which contract code will you deploy in your contracts/ directory. First, you should import your contract file (Count.sol) in this file through const Count = artifacts.require('./Count.sol') And use deployer to deploy your contract, through deployer.deploy(Count). If you want to run some logic after deploying your contract, use .then(). We want to store the contract ABI and the deployed address in files. fs node.js module is used to do it. (fs.writeFile(filename, content, callback)) Through this post-process, we save our contract address and ABI as deployedABI and deployedAddress in the directory. For further information about artifacts., visit truffle document site, https://trufflesuite.com/docs/truffle/getting-started/running-migrations#artifacts-require-

3) Deploy

You need KLAY to deploy a contract. You can receive testnet KLAY on faucet.

Type $ truffle deploy --network baobab. It will deploy your contract according to the configurations defined in truffle-config.js and migrations/2_deploy_contracts.js.

cf) --reset option After deploying your contract, if you type $ truffle deploy --network baobab again, nothing will happen. Because truffle deploys a contract only when there are changes in the contract, otherwise truffle will not do anything.\ If you want to re-deploy your contract anyway, there is an option --reset. If you provide this option, truffle will deploy your contract even the content of contract hasn't changed.\ ex) $ truffle deploy --reset --network baobab

To recap, truffle-config.js configures the target network, deployer account, and the gas limit. migrations/2_deploy_contracts.js configures the contract to deploy. target network: We deploy our contract to the node https://public-en-baobab.klaytn.net. deployer account: '0xd0122fc8df283027b6285cc889f5aa624eac1d23' will deploy this contract. gas limit: We can endure up to '20000000' gas for deploying our contract. contract: We will deploy the Count contract.

From the terminal output, you can see if the deployment has been succeeded and find the deployed address.

Last updated