hardhat으로 직접 만든 로컬 프라이빗 네트워크에 배포해보자.
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하여 사용한다.
이제 사용할 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가 출력된다.
이제 테스트를 할 차례이다.
먼저 네트워크를 명령어로 활성화한다.
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 "*"
네트워크가 활성된 모습이다.
npx hardhat run scripts/deploy.js --network knives
배포가 성공하면 다음과 같이 컨트랙트의 해쉬값이 주어진다.
주어진 해쉬값 : 0x7065A044B910f929624D7E1197FdAB40d048F618
이 해쉬값은 프라이빗 네트워크에서 확인할 수 있다.
contract=0x7065A044B910f929624D7E1197FdAB40d048F618
또한 private key를 찾기 위해 JS 파일을 작성할 때 입력했던 채굴노드의 address도 확인할 수 있다.
from=0x08d4cEE4075b1BBEd80Ec815896C516f4A169447
이렇게 하드햇과 프라이빗 네트워크를 같이 활용하여 컨트랙트를 로컬에서 배포해보았다. 브라우저의 힘을 빌리지 않고 컴파일과 배포를 했다는 점에서 상당히 의미있었다. 다음엔 함수 호출과 기능구현까지 제대로 되는지 테스트해볼 예정이다