【初心者】イーサリウムでアプリを作ろう!【準備編】

Ethereum-eyecache-1

今回はイーサリウム利用したアプリを作成するにあたって
必要となる前準備の方法をご紹介いたします。

今回の記事では前準備のご紹介だけ行わせていただきますので、
アプリ作成は後日作成する記事にてご紹介いたします。

BinanceのAPIに関して、
自動トレード方法を準備から実装までの
記事を記載しておりますので興味がある方はご覧いただければ幸いです。
【準備編】簡単、BinanceのAPIを使った自動売買の方法公開!

実行(開発)環境

まずは私が今回使用した開発環境についてご紹介いたします。
私が持っているPCが「Mac」なので「Mac」上で環境を構築します。

スペックは下記の通りです。
my-mac-version-1
mac osx 10.13.6
go ethereum 1.8.17

開発環境の準備

go ethereumのインストール

いくつかの言語が選択できますが、活発に開発が行われている
Go言語のクライアントをインストールします。

2018/10/12現在の最新版である「1.8.17」版をこちらからダウンロードします。
※「go ethereum」を略して「Geth」と呼ばれているようです。
go-ethereum-homepage-1

ダウンロードした下記ファイルを解凍しておきます。
※macの場合ですと、ダブルクリックか「open」コマンドを選択すると
解凍されるはずです。
go-ethereum-download-1

go-ethereum-download-2

解凍が終わりフォルダの準備がされたら、
実行ファイルを任意の場所に設置してコマンドラインから実行出来るように、
パスを通しておきます。

下記の例ではフォルダをホームディレクトリに移動させ、
そこにパスを通しております。

その後リロードする事によって「geth」を実行出来るようになっているはずです。

下記コマンドを実行してください。

# sample code
$ cd ~/Downloads
$ mv geth-darwin-amd64-1.8.17-8bbe7207 geth
$ mv ./geth ~/geth

# set geth binary path.
$ vim ~/.bash_profile

## Following line add at last of this file.
export PATH=$PATH:/Users//geth

# reload .bash_profile
$ . ~/.bash_profile

ヘルプを呼び出してパスが通っているか確認しましょう。

$ geth --help
NAME:
   geth - the go-ethereum command line interface

   Copyright 2013-2018 The go-ethereum Authors

~~~~~~~~~~

MISC OPTIONS:
  --help, -h  show help


COPYRIGHT:
   Copyright 2013-2018 The go-ethereum Authors

上のような表示が出ていましたら、
実行ファイルに正しくパスが通っております。

作業フォルダの初期化

クライアントのインストールを完了しましたので、
次に作業を行うためのフォルダを作成し初期化を行いましょう。

まずは、初期化を行うために必要な「genesis.json」ファイルをダウンロードして保存しておきます。
※私は「Downloads」フォルダに保存しました。

次に、初期化コマンドを実行します。
作業ディレクトリを作成し、先ほど保存した「genesis.json」を作業ディレクトリへ移動させ、
初期化コマンドを実行します。

※下記例では、「private_net」というフォルダを作成し
作業ディレクトリとしました。

$ mkdir private_net/
$ cp ~/Downloads/genesis.json ./
$ geth --datadir ~/geth/private_net/ init ~/geth/private_net/genesis.json
...
INFO [10-12|15:18:06.246] Successfully wrote genesis state ...

「INFO [10-12|15:18:06.246] Successfully wrote genesis state」という表示が出てば
初期化に成功しております。

テストの取引をやってみる

テストアカウントを作成

まずは、先ほどのフォルダにてGethを起動します。

$ geth --networkid "10" --nodiscover --datadir ~/geth/private_net/ --rpc --rpcaddr "localhost" \
--rpcport "8545" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" --targetgaslimit "20000000" \
 console 2>> ~/geth/private_net/error.log

Welcome to the Geth JavaScript console!

instance: Geth/v1.8.16-stable-477eb093/darwin-amd64/go1.11
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

>

Gethのコンソールが立ち上がったら、
アカウントを作成するコマンドを実行します。

> personal.newAccount("password")
"0x912101222cdb8072d2ffbf483f63da611b9849b4"

実行結果として外部アカウントのアドレスとを出力します。
「personal.newAccount」関数のダブルクォーテーション(“)に挟まれた文字列は
アカウントロックを解除する際のパスワードになります。

「アドレス」と「パスワード」は後ほど使用しますので、
メモ帳かどこかに保存しておいてください。

※ちなみに、コマンドを入力する際に「Tab」キーを押すと
コマンドの自動補完を行ってくれます。

取引を実行するためにもう1つアカウントが必要となるため、
作成しておきましょう。

> personal.newAccount("password")
"0xb7cb16dcaf0923f1405d8ac1ff7cb4a40af4d22f"

「eth.accounts」で作成した全てのアカウントを確認でき、
「eth.accounts[number]」コマンドの「number」に作成した順番の番号を
入れると特定のアカウントを確認できます。

> eth.accounts
["0x912101222cdb8072d2ffbf483f63da611b9849b4", "0xb7cb16dcaf0923f1405d8ac1ff7cb4a40af4d22f"]
> eth.accounts[0]
"0x912101222cdb8072d2ffbf483f63da611b9849b4"

コインベースの変更は下記のコマンドになります。

コインベースとは?

採掘報酬(コインベース:Coinbase)とは採掘(マイニング)により新たなブロックを生成した採掘者(マイナー)がその報酬として得るビットコインの取引のことです。

ーーbitflyerより抜粋ーー

> miner.setEtherbase(eth.accounts[1])
true
> eth.coinbase
"0xb7cb16dcaf0923f1405d8ac1ff7cb4a40af4d22f"

# restore account 0
> miner.setEtherbase(eth.accounts[0])
true

マイニング開始

現在作成したアカウントには残高がない状態なので、
マイニングを行い残高を増やしてみます。

まずはeth.getBlockコマンドを実行し、最初のブロック(genesis block)を確認します。
その後miner.startコマンドでマイニングを行います。
eth.miningコマンドでマイニングが実行されているか確認できます。(trueならマイニング実行中です)
※私の環境では残高が増えるまで5分ほど時間がかかりました。

eth.getBalanceで残高を確認できます。
ただし、eth.getBalanceだとwei(1018)の値で表示されてしまうので、
web3.fromWeiコマンドを使用し、”ether”単位で表示するようにして確認しました。

> eth.getBlock(0)
...
  timestamp: 0,
  totalDifficulty: 256,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}

> miner.start(1)
null
> eth.mining
true
> eth.getBalance(eth.accounts[0])
0
# after few minutes.
> eth.getBalance(eth.accounts[0])
455000000000000000000
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")
455

マイニングが完了し、残高が増えましたので
別なアカウントに送金してみたいと思います。

> eth.sendTransaction({from:eth.accounts[1], to:eth.accounts[0], value:web3.toWei(50, "ether")})
Error: authentication needed: password or unlock

どうやらアカウントがロックされていて送金出来ないようなので、
先ほどのパスワードを入力してアンロックします。

> personal.unlockAccount(eth.accounts[0])
> eth.sendTransaction({from:eth.accounts[1], to:eth.accounts[0], value:web3.toWei(50, "ether")})
"0x7b1bf017cebc37e5a47b1bd32fcfd20f07cc0bc7281b4e98bbc605ce8a55df8c"
> eth.getTransactionReceipt("0x7b1bf017cebc37e5a47b1bd32fcfd20f07cc0bc7281b4e98bbc605ce8a55df8c")
{
  blockHash: "0xef5e18afaf11ef3c360fc7bfd448c181b1c18e5b51f4ccd79b043d27709f5dfa",
  blockNumber: 296,
  contractAddress: null,
  cumulativeGasUsed: 21000,
  from: "0x912101222cdb8072d2ffbf483f63da611b9849b4",
  gasUsed: 21000,
  logs: [],
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  root: "0xcd50425c82abc7b63ce05d90dcc005ce8e57e08f15c58a6ed0461712997f85bb",
  to: "0xb7cb16dcaf0923f1405d8ac1ff7cb4a40af4d22f",
  transactionHash: "0x7b1bf017cebc37e5a47b1bd32fcfd20f07cc0bc7281b4e98bbc605ce8a55df8c",
  transactionIndex: 0
}
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")
405
> web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")
50

本来は「gas」といった手数料が設定されており、
マイニングを行いブロックを獲得した人へ支払われる手数料が引かれるのですが、
今回送金した「アカウント0」は自身がマイニングしたブロックを送金したので
差し引きと戻ってきた手数料で相殺されております。

さいごに

少々内容のボリュームが多かったため、
説明しきれていない部分があったかもしれません。

何かわからないことがありましたら、
コメント等にてご質問などいただければ幸いです。

今回は導入部分のご紹介のみでしたので
アプリの作成は行いませんでしたが、
次回の記事では簡易的なアプリの作成方法を
ご紹介する予定です。

参考文献

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUTこの記事をかいた人

日々、ひたすららくして生きる為に試行錯誤しながら生きております。

ブログでは主に仮想通貨やコンピュータの話題が中心と
なりますがたまにそれた内容を書くこともしばしば。

温かい目で見守ってくだされば幸いです。