truffle-hdwallet With Infura

#truffle-hdwallet-providerとは
mnemonic（ニーモニック）からウォレットを作成し、ウォレットのアカウントを使って簡単にトランザクションを発行できる仕組み

truffle-hdwallet-provider
https://github.com/trufflesuite/truffle-hdwallet-provider

#使われているモジュール
引用元：https://tomokazu-kozuma.com/about-the-mechanism-of-truffle-hdwallet-provider/

###bip39
Bitcoin Improvement Proposal 39をJavascriptで実装したものです。これは決定性キーを生成するプログラム

###ethereumjs-wallet/hdkey
Bitcoin Improvement Proposal 32をJavascriptで実装したもので階層的決定性ウォレット（Hierarchical Deterministic Wallets：HD Wallets）を作成するプログラム

truffle-hdwallet-provider内ではbip39を使ってmnemonicからシードを作成し、そのシードから鍵を生成するHD Walletsインスタンスを作成しています。このインスタンスから秘密鍵やアドレスを生成できる

###web3-provider-engine
Web3 ProviderEngineは独自のweb3プロバイダを作成するためのツール

###web3
EtherumブロックチェーンとJSON RPC経由でデータの読み書きができるライブラリ


#実際に使ってみる
※truffle/npm/ganache などは事前にインストールしておく

###1. mkdir sample-truffle-hdwallet  
###2. cd sample-truffle-hdwallet  
###3. truffle init  
###4. npm init

###5. atom . package.jsonを編集
devDependenciesに以下を追加


````package.json
    {  
    "name": "sample-truffle-hdwallet",  
    "version": "1.0.0",  
    "description": "",  
    "main": "truffle.js",    
    "directories": {  
    "test": "test"  
    },  
    "scripts": {  
    "test": "echo \"Error: no test specified\" && exit 1"  
    },  
    "devDependencies":{  
    "dotenv": "^4.0.0",  
    "truffle-hdwallet-provider": "0.0.5"  
    },  
    "author": "",  
    "license": "ISC",  
    },  
`````

####6. npm install  

####7. InfuraでAPIキー取得
Ethereum用の開発環境を提供してくれるもの

Ropstenテストネットを利用するので必要なAPIキーを取得
<img width="1595" alt="スクリーンショット 2018-11-03 1.40.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/210201/abe076ab-ed6b-aed1-933d-68ee362789d6.png">



####8. 環境変数用ファイル作成
````.env
INFURA_API_KEY=InfuraのAPIキー
MNEMONIC=""

````
####9.コントラクトSimpleStorage.solを書く
簡単なGetter/Setterのみのコントラクト

````SimpleStorage.sol
pragma solidity 0.4.24;

//Sample Smart Contract
contract SimpleStorage{
  string value;

  function set(string x) public{
    value = x;
  }

  function get() public view returns(string){
    return  value;
  }

}
````

####10. truffle.jsを作成


````truffle.js
require('dotenv').config();
const HDWalletProvider = require('truffle-hdwallet-provider');

module.exports = {
  solc:{
    optimizer:{
      enabled: true,
      runs: 200
    }
  }
};
````


####11.truffle compile
contract配下にSimpleStorage.jsonが生成される
<img width="1669" alt="スクリーンショット 2018-11-03 1.55.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/210201/6233f0f4-b034-9fb8-3488-544b0f0295da.png">


####12. Deploy Contractを作る

````2_deploy_contracts.js
const SimpleStorage = artifacts.require("./SimpleStorage.sol")

module.exports = function(deployer) {
  // body...
  deployer.deploy(SimpleStorage);
};

````

####13. Ropstenテストネットへのデプロイ準備
````truffle.js
require('dotenv').config();
const HDWalletProvider = require('truffle-hdwallet-provider');

module.exports = {
  // See <http://truffleframework.com/docs/advanced/configuration>
  // to customize your Truffle configuration!
  networks: {
    ropsten: {
      provider: function(){
        return new HDWalletProvider(
          process.env.MNEMONIC,
          'https://ropsten.infura.io/${process.env.INFURA_API_KEY}'
        )
      },
      gasPrice: 500000, //23000000000
      network_id: 3
    },
    development:{
      host: "127.0.0.1",
      port: 8545,
      network_id: "*" //Match any network id
    }
  },
  solc:{
    optimizer:{
      enabled: true,
      runs: 200
    }
  }
};
```` 
gasPriceが大きすぎるとガス不足のエラーがでるので要注意

####14. ganache-cli 
````
$ganache-cli
````
※未インストールの場合（npm） 　npm install ganache-cli 

####15. HDWalletProvider生成

コンソールからwalletを作ってみる。ここが実は一番大事。
MNEMONIC 'apple banana coffee'が登録されたWalletがつくられていることがわかる

````
$ truffle console
````
<img width="1125" alt="スクリーンショット 2018-11-03 2.04.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/210201/6f3cc371-6012-3608-9b0b-e5650041e549.png">



####16. truffle migrate --network ropsten

Ropstenへデプロイ

````
$ truffle migrate --network ropsten
````

エラーが出る場合：
RopstenのETHが不足していることが原因。Metamaskへログインし、Ropstenへ切り替えた上で、faucetでETHをゲットする
https://faucet.metamask.io/

うまくいくとこんな感じになり、デプロイされる。このSimpleStorageがコントラクトのアドレスなのでコピーする
<img width="618" alt="スクリーンショット 2018-11-03 2.11.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/210201/b23a206a-5fa0-7c91-69b7-f017647e3d71.png">

####17.　コントラクト確認
Ether　Scanへアクセスして、コントラクトのaddressを貼り付ける
<img width="1183" alt="スクリーンショット 2018-11-03 2.12.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/210201/bfd58d8f-86a5-39ab-f01a-62988a1d0e55.png">

https://ropsten.etherscan.io/tx/0x27b16c8571668cf2b46f1d90d28c2ec0c58dab437401c979d130cd4342853cc0

以上、今回はMNEMONICを使ったwalletをHDwallet-providerから生成し、Ropstenテストネットにデプロイするところまで。