[DreamChain DApp] #13 Rinkeby 테스트 네트워크 Deploy 스크립트 만들기 1

요즘 엄청나게 달리고 있습니다! 빨리 웹페이지를 만들고 싶은 마음이 커서 그럴까요?

이전글 - [DreamChain DApp] #12 Handling Multiple Stories

본 내용은 Ethereum and Solidity: The Complete Developer's Guide을 참고해서 작성되었습니다.

https://steemitimages.com/0x0/https://ipfs.busy.org/ipfs/QmPKpa7zYtqrDaV1vJv95RvDG5KH3qLtM9j48JKCuR4Ddn


지루한 부분의 마지막을 달리고 있습니다. 이 글이 아마도 솔리디티 코딩과 관련한 마지막 글이 될거 같습니다. 컨트랙트 부분의 기능이 추가면 다시 솔리디티 코딩으로 돌아오겠죠~

지금까지는 로컬 테스트 네트워크에 컨트랙트를 배포하여 작업하고, 테스트를 진행했었습니다. 그러나 이번에는 정말 여러 개발자들이 사용하는 테스트 네트워크에 컨트랙트를 배포하여 돌려볼 수 있는 Deploy 스크립트를 작성해 보겠습니다. 저도 떨립니다~ 정말 개발자 대열에 들어서는 걸까요? ㅋㅋ

테스트 네트워크라고 하지만, 실제 메인 네트워크에 배포하는 것과 큰 차이가 없습니다. 그래서 작업할 부분이 좀 됩니다. 메인넷, 테스트넷, 로컬넷의 차이점은 아래글을 참고하세요.
[처음해 보는 Solidity 코딩] #10 개발환경 구축하기 Local Blockchain

사실 deploy하는 것은 Unit Test하면서 web3를 이용해서 매번 사용했던 기능입니다. 아래 코드를 사용했었습니다.

// setup code before running a test
beforeEach( async () => {
  // get all the accounts
  accounts= await web3.eth.getAccounts();

  // create a contract instance with arguments and deploy it
  // parse the json interface, so the javascript object can be used for contract
  dream_story= await new web3.eth.Contract( JSON.parse( compiled_contract.interface ) )
    // tell web3 that we want to deploy a new conpy of the contract.
    // do not forget about the arguments that the constructor of the contract requires
    // calling deploy does not deploy the contract, it creates an object to be deployed
    .deploy({ data: compiled_contract.bytecode, arguments: [INIT_MIN_DONW_PRICE] })
    // send transaction that creates the contract
    .send( { from: accounts[0], gas: '1000000' } )
});

비교적 간단히 배포를 했는데, Rinkeby 테스트 네트워크에 배표하기 위해서는 몇가지 툴이 필요합니다.

Rinkeby에서 사용가능한 Ether 받기

그전에 테스트 네트워크에 배포하는 것이 때문에 이더가 필요합니다. 비록 테스트용이지만 이것도 채굴을 하던지, 누구한테 받던지 해야 합니다. 이더가 없으면 배포도 안되고, 컨트랙트의 상태변수를 변경하는 함수도 실행할 수 없습니다. Rinkeby에서 사용가능한 이더를 받는 방법은 아래를 참고하세요.
Smart Contract 개발 #2 Deploy를 위한 Mist Browser 설치
그런데 최근에 방법이 조금 변경됐습니다. Github의 gist대신 google+나 facebook에 이더 수신 계정을 포스팅하고 그 주소를 Rinkeby창에 복사하는 식으로 바뀌었습니다. 이부분은 금방 하실 수 있을 것입니다. 저는 개발에 집중해서 글을 써보겠습니다. 혹시 모르시면 문의주세요.

Rinkeby 네트워크 배포 설명

먼저 이전글에서 로컬 테스트 네트워크를 구축할 때 사용한 그림을 다시 보겠습니다.

이때는 로컬 테스트 네트워크 Ganache를 사용했었습니다. Ganache가 별도의 테스트 계정을 만들어 주고, 이더까지 채워줘서 편하게 사용했습니다. 이에 대한 자세한 설명은 아래글을 참고하세요.
[DreamChain DApp] #7 Unit Test 환경구축 2

그러나, Rinkeby 네트워크에 접속하고, 배포하는 것은 이보다 까다롭습니다. 계정도 직접 만들어야 하며, 이더도 채워 넣어야 합니다. 전체적 구성도를 먼저 살펴보겠습니다.

이전구성과 특별히 다른 점은 Infura API, Infura Node 입니다. 이더리움 네트워크에 접속하기 위해서는 이더리움 클라이언트가 필요한데 여기서는 Infura라는 서비스를 이용합니다. 자세한 내용은 이어서 설명하겠습니다.

계정 Unlock

Rinkeby 네트워크에서 사용할 계정이 필요합니다. 아래 그림과 같이 Metamask를 설치하여 계정을 생성합니다.

그리고 네트워크를 Rinkeby로 설정합니다. 이 때, 생성한 계정은 Rinkeby뿐만 아니라 메인 네트워크에서도 사용가능합니다. 단, Rinkeby의 이더는 메인넷에서는 사용 불가능합니다. Metamask설치 방법도 생략합니다. 크롬 브라우저에 간단히 설치 가능합니다.
계정을 복구하기 위해서는 Metamask에서 12개의 seed words를 제공합니다. 이것만 있으면 모든 계정을 복구할 수 있습니다. 매우 중요한 정보이죠. 메인네트워크라면 절대 노출해서는 안되는 정보입니다. 이 seed words의 역할은 Provider가 계정을 암호를 묻지 않고 unlock할 수 있게 하는 것입니다. 즉, 특정 계정을 사용하여 deploy할 때, seed words만 있으면 개인키니 공개키를 입력하지 않아도 됩니다. 또 seed words로 무수히 많은 개인키, 공개키를 생성할 수도 있습니다.

Metamask의 setting에서 아래와 같이 seed words를 확인할 수 있습니다.

이더리움 클라이언트 노드

로컬에 이더리움 풀노드를 구성할 수도 있지만, 번거로운 작업입니다. 또 테스트 네트워크라고는 하지만 블락 데이터를 싱크해야 해서 저장공간 및 싱크 시간이 필요합니다. 따라서 여기서는 Infura API와 Infura 노드를 사용합니다. Infura 노드는 이더리움 네트워크의 풀노드로서 Infura API를 이용하면 누구나 접속하여 가능하며, 따라서 이더리움 네트워크에 컨트랙트 배포가 가능합니다. 여기서는 이더리움 메인넷이 아니라 Rinkey 네트워크를 이용할 것입니다. 참고로, Infura를 운영하는 회사는 이더리움 풀노드를 보유하고 있어 사용자가 손쉽게 네트워크를 변경해서 사용할 수 있습니다.
Infura 노드를 이용하기 위해 Infura API key를 얻어야 합니다. 이를 위해 가입 및 몇가지 준비가 필요합니다.

Infura 가입 및 API 키 획득

1. 아래 웹사이트에 접속합니다.

https://infura.io/

2. 가입합니다.

"Get Started for Free"를 클릭합니다.

이메일에 접속하여 인증합니다.

가입이 완료되었습니다.

3. 새 프로젝트 생성 및 API key 획득

Infura도 업데이트가 되는지 사용법이 바뀌고 있습니다. 보다 자세한 사항은 다음 사이트를 참고하세요.
https://medium.com/coinmonks/rpc-access-to-ethereum-with-infura-318854b7732f

로그인 후 infura 홈페이지에서 dashboard로 이동하여 "Create New Project"를 클릭합니다.

적절한 프로젝트 이름을 넣습니다. 여기서는 "DreamFactory"로 합니다.

4. Endpoint 변경

프로젝트가 생성되면 다음과 같은 화면이 나타납니다. 여기서 ENDPOINT를 Rinkeby로 변경 후 API key 저장 또는 복사합니다.

HD Wallet Provider 설치

위 개념도에서 Provider에 HD Wallet Provider라는 것이 보입니다. 이것의 주요 역할은 Seed words를 입력받아 계정을 unlock하고 Infura API key를 이용하여 Infura API를 통해서 Rinkeby 네트워크에 접속, 컨트랙트 배포를 할 수 있게 하는 것입니다. 따라서 다음과 같이 node 모듈 설치가 필요합니다. 설치는 프로젝트 root 디렉터리에서 해야 합니다.

$ cd  <project_root_dir>
$ npm install --save truffle-hdwallet-provider

이것으로 deploy 스크립트 준비가 끝났습니다. 휴~ 아마 내용 따라오기가 쉽지 않을 수 있습니다. 너무 자신을 푸쉬하지 마시고, 당장 이해가 안가더라도 그냥 가볍게 여기고 넘어가 주세요.
다음글에서 Rinkeby 네트워크에 컨트랙트를 배포할 수 있는 deploy 스크립트를 만들어 보겠습니다.

오늘의 실습: 내용을 모두 이해하려고 하시지 마시고, 그저 따라해보세요. 저도 그저 따라하고 직접 프로젝트 꾸미며 이해한 내용입니다.

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now
Logo
Center