로컬 프라이빗 네트워크에 hardhat으로 배포하기

김진경·2022년 5월 9일
0

hardhat으로 직접 만든 로컬 프라이빗 네트워크에 배포해보자.

1. hardhat.config.js 에서 network 필드 수정하기.

hardhat에서 원하는 네트워크를 사용하기 위해선 config.js 파일을 수정해야 한다.

아래는 hardhat.config.js 파일의 전체 코드이다.

require("@nomiclabs/hardhat-waffle");
require("dotenv").config();

// This is a sample Hardhat task. To learn how to create your own go to
// https://hardhat.org/guides/create-task.html
task("accounts", "Prints the list of accounts", async (taskArgs, hre) => {
  const accounts = await hre.ethers.getSigners();

  for (const account of accounts) {
    console.log(account.address);
  }
});

// You need to export an object to set up your config
// Go to https://hardhat.org/config/ to learn more

/**
 * @type import('hardhat/config').HardhatUserConfig
 */
module.exports = {
  solidity: "0.8.4",
  paths: {
    artifacts: './src/artifacts',
  },
  networks: {
    // hardhat : {
    //   chainId: 1337,
    // }
    knives : {
      url: process.env.KNIVES_NODE1_URL,
      accounts: [process.env.KNIVES_NODE1_PRIVATE_KEY]
    }
  }
};

코드의 맨 마지막 부분, exports 되는 필드 중에서 network 필드가 수정해야 하는 부분이다. 이곳에 프라이빗 네트워크의 정보를 작성한다.

작성 형식은 다음과 같다.

네트워크 이름 : {
	url : 네트워크의 url.
    accounts : [네트워크 중 채굴을 담당하는 노드 account의 private key].
}

먼저 사용할 네트워크를 객체 형식으로 작성한다. 그리고 해당 네트워크를 구성하는 노드들 중 채굴 노드의 url을 키:밸류의 형태로 작성한다. 같은 형식으로 accounts에 대한 정보도 작성하는데, 밸류에 해당 account의 private key를 작성한다.

이를 기반으로 작성한 나의 network 필드는 다음과 같다.

module.exports = {
  solidity: "0.8.4",
  paths: {
    artifacts: './src/artifacts',
  },
  networks: {
    // hardhat : {
    //   chainId: 1337,
    // }
    knives : {
      url: process.env.KNIVES_NODE1_URL,
      accounts: [process.env.KNIVES_NODE1_PRIVATE_KEY]
    }
  }
};

url정보와 private key는 env파일에 환경변수로 작성하여 보호하고 따로 import하여 사용한다.




2. 네트워크의 채굴노드 private key 확보하기

이제 사용할 networks 필드 중 accounts의 밸류로 쓸 채굴 노드의 private key를 확보해야 한다.

먼저 private key를 얻기 위해선 keystore가 살아있어야 한다. 그리고 이 데이터를 기반으로 private key를 찾아낸다.

먼저 필요한 'keythereum' 모듈을 설치한다.

npm install keythereum

그리고 private key를 찾아낼 JS 파일을 작성한다.

var keythereum = require("keythereum");

var datadir = "/Users/kimjinkyung/Desktop/own_geth_network/node1/data";

var address= "채굴노드의 public address";

const password = "비밀번호";
var keyObject = keythereum.importFromFile(address, datadir);
var privateKey = keythereum.recover(password, keyObject);
console.log(privateKey.toString('hex'));

위의 코드 중 3개의 변수를 자신의 환경에 맞게 바꿔주어야 한다.

'datadir', 'address', 'password'

먼저 'datadir'의 경우는 해당 노드 중 data폴더가 위치한 루트를 의미한다.
'address'는 채굴 노드의 public address이다.
'password'는 채굴 노드 생성시 만들었던 비밀번호이다.

위 JS파일을 실행하면 콘솔창에 private key가 출력된다.




3. 배포 테스트하기.

이제 테스트를 할 차례이다.

먼저 네트워크를 명령어로 활성화한다.

geth --networkid 19444 --datadir "./data" --bootnodes enode://68d9ae9d7752d25ca00d11b682877d0be6ec4e47d49857c4f01596649f0b693a6ff1f0d87ca5e144b894bbaee14b7f0eb8b1f74160103b4945ac8a151f4b41b3@127.0.0.1:30301 --port 30303 --rpcport 8545 --unlock 0x08d4cEE4075b1BBEd80Ec815896C516f4A169447 --password password.txt --mine console --ipcdisable --syncmode full --rpc --allow-insecure-unlock --rpccorsdomain "*" 

네트워크가 활성된 모습이다.


그리고, hardhat 콘솔창에서 다음의 명령어로 컨트랙트를 프라이빗 네트워크에 배포한다.
npx hardhat run scripts/deploy.js --network knives

배포가 성공하면 다음과 같이 컨트랙트의 해쉬값이 주어진다.

주어진 해쉬값 : 0x7065A044B910f929624D7E1197FdAB40d048F618


이 해쉬값은 프라이빗 네트워크에서 확인할 수 있다.

contract=0x7065A044B910f929624D7E1197FdAB40d048F618

또한 private key를 찾기 위해 JS 파일을 작성할 때 입력했던 채굴노드의 address도 확인할 수 있다.

from=0x08d4cEE4075b1BBEd80Ec815896C516f4A169447

Reveiw

이렇게 하드햇과 프라이빗 네트워크를 같이 활용하여 컨트랙트를 로컬에서 배포해보았다. 브라우저의 힘을 빌리지 않고 컴파일과 배포를 했다는 점에서 상당히 의미있었다. 다음엔 함수 호출과 기능구현까지 제대로 되는지 테스트해볼 예정이다

profile
Maktub.

0개의 댓글