hawk, camphora, avocado and so on..

美術展、博物展、神社、旅行、読書、IT関連などの雑感を書いていきます。

ERC-721 トークンを発行する DApp を作ってみました(その3)

アボカドです。前回、前々回と、捨てたものをブロックチェーンに記録するアプリの作り方を書いています。

ERC-721 トークンを発行する DApp を作ってみました(その1) - hawk, camphora, avocado and so on..

ERC-721 トークンを発行する DApp を作ってみました(その2) - hawk, camphora, avocado and so on..

前回は、おおまかな作り方と、Truffle インストール ~ ERC-721 トークンの実装まで説明しました。今回は、コントラクトの動作確認とデプロイ方法について説明します。

コントラクトの動作確認

Remix を使うと、コントラクトを擬似的にデプロイして関数の動作を確認できます。デバッグ機能もあるので、バグを潰すのに役立ちます。

右ペインの [Run] タブ > Environment で "Java VM" を選ぶと Ethereum のプライベートネットなどを用意しなくても動作確認できます。("Injected Web3" を選ぶと、インストール済みの MetaMask などを経由してブロックチェーンにデプロイ等ができるみたいです。プライベートネットを自分で立てている場合は "Web3 Provider" を選択します。)

f:id:takagusu:20180816212605p:plain

ただ、ひとつ課題なのが、Truffle で作ったフォルダ階層がある .sol ファイル群をそのまま読み込めません。すべてフラットになります。そのため、必要な .sol ファイルを読み込んで、import のパスを書き換えるか、または truffle-flattener などを使ってひとつのファイルに結合して読み込む必要があります。

Loom Network が開発している EthFiddle を使うのも良さそうですが、いまのところ複数のファイルには対応していないので、同様にファイルを結合する必要があります。

コントラクトのデプロイ

コマンドと準備

Truffle を使うと比較的簡単にコントラクトをデプロイできます。

まず下記のコマンドを実行して(Windows の場合は .cmd をつけてもつけなくても良いですが、truffle.js などのファイルが実行フォルダにあるときは、それを開いちゃわないように .cmd をつけます)、コントラクトをコンパイルします。コンパイル結果は build フォルダ内に格納されます。

> truffle.cmd compile

次に下記のコマンドを実行すると、migrations フォルダに含まれる js ファイルの処理を順番に実行します。デフォルトでは、コントラクトをデプロイするための処理が書かれた 1_initial_migration.js のみ実行します。

> truffle.cmd migrate

自分で書いたコントラクトをデプロイするには、この migrations フォルダに、「2_」 から始まる js ファイル(例えば「2_deploy_contracts.js」)を作成し、下記のようなコードを書きます。コントラクトの名前は適宜書き換えてください。コントラクトが複数ファイルに分かれている場合、最終的に継承しているコントラクトだけ書けば大丈夫です。

var DiscardedRelicToken = artifacts.require("./DiscardedRelicToken.sol");

module.exports = function(deployer) {
  deployer.deploy(DiscardedRelicToken);
};
プライベートネットへのデプロイ

truffle.js にはデプロイ先の情報を入力します。プライベートネットの場合は、下記のような感じです。上述の `truffle.cmd migrate` コマンドを実行するとデプロイできます。

  module.exports = {
    networks: {
      development: {
        host: "127.0.0.1",
        port: 8545,
        network_id: "*" // Match any network id
      }
    }
  }
テストネットやメインネットへのデプロイ

テストネットやメインネットにデプロイする場合は、自分でノードを立ててそのホストと IP を指定してもいいですが、Infura というサービスのノードを間借りするほうがお手軽です。

手順としては、まず Infura にアクセスしてアカウントを作り、プロジェクトを作成します。すると、API Key、API Secret、Endpoint の情報をもらえます。これらの情報と、トランザクションに署名するための自分の秘密鍵(MetaMask で取得できるニーモニック(12個の単語)から導出します)を使って、デプロイのためのプロバイダーを作ります。具体的には、truffle-hdwallet-provider を使います。まず下記コマンドでインストールします。

> npm install truffle-hdwallet-provider

そして truffle.js に、下記のように実装します。

const HDWalletProvider = require("truffle-hdwallet-provider");
const mnemonic = ""; // デプロイに使う MetaMask ウォレットのニーモニック(12個の単語)を設定する
const accessToken = ""; // Infura の API Key を設定する

module.exports = {
  networks: {
    ropsten: {
      provider: function() {
        return new HDWalletProvider(
          mnemonic,
          "https://ropsten.infura.io/V3/" + accessToken  // Infura の Endpoint を設定(テストネット、メインネットによって異なる)
        );
      },
      network_id: 3,  // テストネットまたはメインネットのネットワーク ID を設定(Ropsten テストネットの場合は 3)
      gas: 6000000
    }
  }
}

上記で定義したネットワーク設定を使ってデプロイする場合は、下記のコマンドを実行します。"ropsten" は上記 json 内で自分で決めた要素名です。

> truffle.cmd migrate --network ropsten

デプロイに成功すると、次のような出力結果が得られます。コントラクトごとに、デプロイした結果のアドレスが表示されています。

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0xd65815f0565f8fb2ec3eeebf6ecde96e8fc58185802f9183461dca6863b9f2ae
  Migrations: 0x7e6b22144e7029ffb81493bae6889e9194384ea5
Saving successful migration to network...
  ... 0xf854f9f409006dcc8b449700ef6e72ebe537014cacba573acddab6c3b55ec59b
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying DiscardedRelicToken...
  ... 0xfdc626352f3ea671b34bd156b1e9f882179b48f2d732bffd230623cc42b887fa
  DiscardedRelicToken: 0xee994142aff67e8332e2ba52ecaefdda16b71b91
Saving successful migration to network...
  ... 0xd3d8c52fd4ee99ba468826a88ea979cc840e3f4b22501ad4854cf24291cbb9e6
Saving artifacts...

Truffle の設定ファイルの詳細は、公式ドキュメントを参照してください。

今回はここまでにしたいと思います。
次の記事では、デプロイしたコントラクトを操作する Web フロントエンドの実装方法を説明します。

🥑