Geth + Truffle でテストネットにアカウントを作成しデプロイする

Geth と Truffle を使って、パブリックなテストネットにアカウントを作成し、Ether 取得するところまでやってみました。

テストネットとは、開発者がテストのために使うパブリックなイーサリアムブロックチェーンで、本番稼働しているメインネットとほぼ同様の仕組みを持ち、メインネットのように送金もマイニングも行うことができます。

パブリックなテストネットはいくつもあるようですが、今回は ROPSTEN で試してみました。

環境

  • Geth: 1.8.2-stable

テストネットに接続

geth コマンドを実行し、テストネットに接続します。

$ geth --testnet --syncmode "fast" --rpc --rpcapi db,eth,net,web3,personal --cache=1024 --rpcport 8545 --rpcaddr 127.0.0.1 --rpccorsdomain "*" --bootnodes "enode://20c9ad97c081d63397d7b685a412227a40e23c8bdc6688c6f37e97cfbc22d2b4d1db1510d8f61e6a8866ad7f0e17c02b14182d37ea7c3c8b9c2683aeb6b733a1@52.169.14.227:30303,enode://6ce05930c72abc632c58e2e4324f7c7ea478cec0ed4fa2528982cf34483094e9cbc9216e7aa349691242576d552a2a56aaeae426c5303ded677ce455ba1acd9d@13.84.180.240:30303"

コマンドを実行すると、他のノードと接続され、ブロックチェーンの同期が始まります。

INFO [03-11|09:10:00] Imported new chain segment               blocks=1   txs=131   mgas=4.646   elapsed=76.028ms  mgasps=61.110  number=2810959 hash=9328d0…879510 cache=41.83mB
INFO [03-11|09:10:03] Imported new chain segment               blocks=1   txs=30    mgas=1.168   elapsed=27.840ms  mgasps=41.964  number=2810960 hash=36d21d…04ba18 cache=41.84mB
INFO [03-11|09:10:03] Mining too far in the future             wait=5s
INFO [03-11|09:10:17] Imported new chain segment               blocks=1   txs=18    mgas=2.131   elapsed=26.228ms  mgasps=81.242  number=2810961 hash=7b2a75…1154a4 cache=41.93mB
INFO [03-11|09:10:19] Imported new chain segment               blocks=1   txs=0     mgas=0.000   elapsed=5.079ms   mgasps=0.000   number=2810962 hash=ed320f…38e1ac cache=41.83mB
INFO [03-11|09:10:19] Imported new chain segment               blocks=1   txs=63    mgas=4.652   elapsed=50.821ms  mgasps=91.529  number=2810962 hash=cad7ee…9dbd01 cache=42.06mB
INFO [03-11|09:10:20] Imported new chain segment               blocks=1   txs=3     mgas=0.686   elapsed=9.096ms   mgasps=75.461  number=2810963 hash=1a9b4c…c04208 cache=41.92mB

表示されている number と ROPSTEN の Web サイト上に表示されている Block の数字が一致してきたらほぼ同期が完了したと思って良いようです。

f:id:enomotodev:20180311111720p:plain

ブロックチェーンの同期は、私の場合 30 分くらいかかったので、気長に待ちましょう。

Truffle をインストール

Trulffle をインストールします。

$ npm install -g truffle

インストールが完了したらバージョンを表示して、インストールできているか確認します。

$ truffle version
Truffle v4.1.3 (core: 4.1.3)
Solidity v0.4.19 (solc-js)

Truffle でプロジェクトを作成

Truffle は truffle unbox コマンドで DApp のサンプルテンプレートを色々と作成することができるのですが、今回は truffle init コマンドで初期状態のテンプレートを展開してみたいと思います。

$ mkdir test
$ cd test
$ truffle init
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

  Compile:        truffle compile
  Migrate:        truffle migrate
  Test contracts: truffle test

展開されたファイルを確認してみます。

$ tree .
.
├── contracts
│   └── Migrations.sol
├── migrations
│   └── 1_initial_migration.js
├── test
├── truffle-config.js
└── truffle.js

3 directories, 4 files

展開されたファイルが確認できたので、truffle.jsブロックチェーンへの接続情報を記述します。

  • truffle.js
module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*"
    }
  }
};

テストネットにアカウントを作成する

アカウントの作成方法も色々あるようですが、ここでは Truffle のコンソールを利用して CLI でアカウントを作成したいと思います。

$ truffle console

truffle(development)> web3.eth.newAccount('ここにアカウントのパスワードを設定')
'0xe818b04b53b16f2ce9f27fe04be0b015687b6228'

web3.eth.newAccount() を実行すると新しくアカウントが作成され、アカウントのアドレスが取得できます。

※ テストネットですがパスワードはきちんと設定しましょう

アカウントの保有している Ether を確認してみます。

truffle(development)> web3.eth.getBalance('0xe818b04b53b16f2ce9f27fe04be0b015687b6228').toLocaleString()
'0'

もちろん 0 ですね!

ROPSTEN の Web サイト上でもアカウントのアドレスで検索すると、保有 Ether などのアカウントの状態を確認することができます。

f:id:enomotodev:20180311111809p:plain

アカウントの作成が終わったので、一旦 Truffle のコンソールから抜けます。

truffle(development)> .exit

テストネットでイーサリアムを取得する

ROPSTEN では、Ether 取得用に API を公開しているので、その APICurl で叩きます。

$ curl -X POST  -H "Content-Type: application/json" -d '{"toWhom":"アカウントのアドレス"}' https://ropsten.faucet.b9lab.com/tap

実行すると

{
  "txHash" : "0xbabe3bd79df83928a91f2ec33b7ac30a0803940ced9a10aa420308dcc4e29d3b"
}

このような形でトランザクションのアドレスが返ってくるので、ROPSTEN の Web サイトでアドレスを検索します。

f:id:enomotodev:20180311111913p:plain

TxReceipt StatusSuccess になったらブロックチェーン上に取り込まれたことになるので、アカウントの保有イーサリアムを確認してみます。

f:id:enomotodev:20180311111940p:plain

ETH Balance0.5 Ether になっていることが確認できました!

コントラクトをテストネットにデプロイする

先ほど、API を叩いて Ether を取得できたので、テストネットに truffle init して展開されたコントラクトをデプロイしてみたいと思います。

イーサリアムではデプロイするのに Ether が必要です。

まずは、コントラクトをデプロイするにあたり、どのアカウントがデプロイするのかと Gas の量をそれぞれ from, gas に記述します。

  • truffle.js
module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*",
      from: "自分のアカウントのアドレス",
      gas: 470000
    }
  }
};

初期テンプレートでマイグレーションファイルしかないので、適当にコントラクトファイルと、マイグレーションファイルを追加しておきます。

  • contracts/Test.sol
pragma solidity ^0.4.17;

contract Test {
  address public owner;

  function Test() public {
    owner = msg.sender;
  }
}
  • migrations/2_deploy_test.js
var Test = artifacts.require("./Test.sol");

module.exports = function(deployer) {
  deployer.deploy(Test);
};

ファイルを追加したら、デプロイする際に Ether を消費するので、Truffle のコンソールからアカウントをアンロックします。

$ truffle console

truffle(development)> web3.personal.unlockAccount('自分のアカウントのアドレス', '設定したパスワード', 1800)
true

truffle(development)> .exit

※ 第3引数にはアンロックする時間を秒単位で設定できるようです。(ここでは 30 分に設定しました)

アカウントのアンロックができたので、コントラクトをデプロイします。

デプロイにはだいたい 1 分ほどかかりました。

$ truffle migrate
Compiling ./contracts/Migrations.sol...
Compiling ./contracts/Test.sol...
Writing artifacts to ./build/contracts

Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0x5b1389de71421cb1f31702de77bcb0fa51f539efc6e3f7bdb5c0d8a812a3de1b
  Migrations: 0xfe23a9f6287c53fa9ab529f6057f09611e61fe6e
Saving successful migration to network...
  ... 0x6b2557ab1feb459bd6aaee98fc872d7ed2a8029e685e992fb2231057d98c7dcf
Saving artifacts...
Running migration: 2_deploy_test.js
  Deploying Test...
  ... 0x949a75cc5157bccb505bcf332f4969419fe5656c101b3bd4672c1067c3b3cec0
  Test: 0x0eb4ef05ea371ba59fa8152342954588385617b3
Saving successful migration to network...
  ... 0xda5aee9f79b40ee472983e798527c460af7e7204e23a3606cb3f8a2092f25c23
Saving artifacts...

出力を見てみると、デプロイする際にコンパイルも自動的に行ってくれているのが確認できると思います。

デプロイが無事成功すると、それぞれのトランザクションのアドレスが返されます。

ROPSTEN の Web サイトでアカウントを確認するとトランザクションブロックチェーンに取り込まれ、Ether の残高も減っていることが確認できると思います。

f:id:enomotodev:20180311112015p:plain

まとめ

Geth + Truffle でテストネットに新しくアカウントを作成しデプロイするところまでやってみました。

Truffle を使うと面倒なコンパイルやデプロイが簡単にできました!

まだまだ手探り状態ですが、DApps 周りを引き続き勉強していきたいと思います。

ブロックチェーンアプリケーション開発の教科書

ブロックチェーンアプリケーション開発の教科書

お金2.0 新しい経済のルールと生き方 (NewsPicks Book)

お金2.0 新しい経済のルールと生き方 (NewsPicks Book)