You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Ethereum 入 門<br />
<strong>Table</strong> <strong>of</strong> <strong>Contents</strong><br />
本 書 について<br />
Ethereumとは 何 か?<br />
ブロックチェーン 革 命<br />
Ethereum とは<br />
まずは Ethereum に 触 れてみる<br />
Gethをインストールしてみる<br />
テスト・ネットに 接 続 してみる<br />
etherを 採 掘 してみる<br />
etherを 送 金 してみる<br />
Contractを 作 成 してみる<br />
ライブ・ネットに 接 続 してみる<br />
コントラクト・プログラミング 言 語 :Solidity<br />
基 本 的 な 記 法<br />
変 数 とデータ 型<br />
演 算 子<br />
制 御 命 令<br />
Ethereumの 内 部<br />
さらに 詳 しく 知 るために<br />
0<br />
1<br />
1.1<br />
1.2<br />
2<br />
2.1<br />
2.2<br />
2.3<br />
2.4<br />
2.5<br />
2.6<br />
3<br />
3.1<br />
3.2<br />
3.3<br />
3.4<br />
4<br />
5<br />
2
Ethereum 入 門<br />
Ethereum 入 門<br />
本 ドキュメントは、 分 散 アプリケーションプラットフォーム「Ethereum」の 技 術 入 門 書 で<br />
す。 Ethereumがどのように 動 作 するのか、Ethereumを 用 いてどのように 分 散 アプリケー<br />
ションを 開 発 していくか、について 解 説 していきます。<br />
Ethereumプロジェクトは 現 在 βリリース(Frontier)であり、 今 後 仕 様 が 変 更 になる 場 合 が<br />
あります。 仕 様 変 更 に 伴 い 本 書 も 逐 次 内 容 を 変 更 していきます。<br />
また 本 ドキュメントは2015/12/20 現 在 、 制 作 中 です。<br />
本 ドキュメントはオープンなプロジェクトであり、そのため 協 力 者 を 広 く 求 めています。<br />
本 書 のソースコードはGitHub 上 で 公 開 されています。<br />
本 書 への 追 記 や 修 正 などありましたら、 上 記 GitHub 上 のレポジトリにIssueの 発 行 、または<br />
Pull requestをお 願 いいたします。<br />
本 ドキュメントは Creative Commons Attribution-ShareAlike 4.0 International License のも<br />
とで 公 開 されています。<br />
本 書 について<br />
3
Ethereum 入 門<br />
Ethereumとは 何 か?<br />
Ethereum(イーサリアム)は 分 散 アプリケーションのためのプラットフォームであり、<br />
2013 年 12 月 以 降 からオープンソースプロジェクトとして 開 発 が 進 められているものです。<br />
現 在 Pro<strong>of</strong> <strong>of</strong> Conceptの 第 9フェーズ(Frontier)にあり、 近 々にも 正 式 リリースが 成 される<br />
予 定 です。<br />
インターネットの 登 場 以 来 、 私 たちは、メール、SNS、 電 子 決 済 、クラウド・ファンディ<br />
ングなど 数 えきれないほどのWebサービスを 利 用 して 日 々を 生 活 しています。これらの<br />
サービスのほぼ 全 てにおいて、その 運 営 に 何 らかの 中 央 管 理 システム( 組 織 )の 存 在 が 必<br />
須 でした。<br />
例 えばSNSでは、 個 人 がアップロードしたデータをFacebookやTwitterといった 企 業 が 中 央<br />
で 一 元 管 理 することでサービスが 成 り 立 っています。またクラウド・ファインディングで<br />
は、Kickstarterのような 企 業 が、 資 金 調 達 の 仲 立 ちをし、その 中 で 集 まった 資 金 についての<br />
管 理 ( 資 金 調 達 希 望 者 が 提 示 した 最 低 金 額 以 上 の 資 金 が 集 まれば 資 金 調 達 希 望 者 に 渡 し、<br />
そうでなければ 渡 さない 等 )を 行 うことで、サービスが 成 り 立 っています。 また、イン<br />
ターネットの 基 盤 であるドメイン 名 も、ICANNを 中 心 とした 管 理 組 織 によって 管 理 がなさ<br />
れています。<br />
このような 中 央 管 理 システムの 存 在 するサービスは 以 下 の 点 で 欠 点 があります。<br />
可 用 性 : 中 央 管 理 システム( 組 織 )が 存 在 する 以 上 、その 中 央 組 織 が 何 らかの 理 由 で<br />
潰 れればサービスは 存 続 できません。また、 組 織 が 存 続 している 場 合 でも 実 際 に<br />
Evernoteでもあったように、 障 害 によるデータ 消 失 の 危 険 が 避 けられません。<br />
プライバシー: 例 えばSNSなど、 個 人 の 生 活 (プライバシー)のデータを 私 的 企 業 が<br />
一 手 に 握 ることは、データ 漏 洩 の 危 険 性 、 企 業 によるデータの 不 正 利 用 の 危 険 性 を 考<br />
えると 好 ましい 物 ではありません。<br />
検 閲 : 中 央 の 組 織 により 管 理 されたサービスは、そのサービス 提 供 者 による 独 自 の 検<br />
閲 が 少 なからず 入 ります。 検 閲 するかしないかは、「サービス 提 供 者 ( 中 央 管 理<br />
者 )」の 手 に 握 られ、たとえそれが 公 序 良 俗 に「 反 しない」ものであっても 検 閲 の 対<br />
象 になる 可 能 性 があります。<br />
Ethereumは、「ブロックチェーン」と 呼 ばれる 技 術 をベースに、なんら 特 別 な 管 理 者 のい<br />
ないP2Pシステム 上 で 様 々なサービスを 実 現 するための 基 盤 を 提 供 するものです。つまり、<br />
FacebookやTwitter、KickstarterやICANNといったような、 中 央 で 管 理 する 機 関 ( 私 的 企<br />
業 )の 存 在 を 必 要 とせずに 同 様 のサービスを 実 現 する 基 盤 をEthereumは 提 供 します。<br />
Ethereumがどのようなものかを 詳 しく 見 ていくために、まずはベースとなる「ブロック<br />
チェーン」 技 術 の 革 新 性 について 見 ていきます。<br />
Ethereumとは 何 か?<br />
4
Ethereum 入 門<br />
ブロックチェーン 革 命<br />
中 央 機 関 の 存 在 しない 通 貨 :ビットコイン<br />
2008 年 のNakamoto 氏 による 論 文 「Bitcoin: A Peer-to-Peer Electronic Cash System」の 発 表<br />
と、その 後 の 有 志 によるビットコインの 開 発 は、 通 貨 の 世 界 に 革 新 を 起 こしました。<br />
ビットコインを 利 用 するためのソフトはオープンソースで 提 供 され、PCからスマートフォ<br />
ンまで 様 々なデバイス 上 で 動 作 します。ユーザーはネットワークを 通 じてビットコインを<br />
やり 取 りすることで、 従 来 の 通 貨 で 行 うほぼ 全 てのこと、つまり 物 品 の 売 買 から 個 人 や 組<br />
織 への 送 金 、そして 融 資 も 行 なうことが 可 能 です。ビットコインには 国 境 や 地 域 の 概 念 が<br />
なく 世 界 共 通 通 貨 であること、それにより 海 外 への 送 金 も 非 常 に 高 速 かつ 安 全 で 低 コスト<br />
に 行 えるます。 以 上 のような 理 由 からビットコインは 通 貨 の 理 想 形 と 考 えれられていま<br />
す。<br />
このような 通 貨 としての 利 便 性 はもちろんですが、ビットコインの 最 も 重 要 な 革 新 性 は、<br />
従 来 の( 電 子 マネーを 含 む) 通 貨 とは 異 なり、 通 貨 発 行 や 決 済 にいかなる 中 央 機 関 や 管 理<br />
者 も 必 要 としないP2Pの 通 貨 システムであることにあります。<br />
冒 頭 に 挙 げたNakamoto 氏 の 論 文 は、「ビザンチン 将 軍 問 題 」と 呼 ばれる 分 散 コンピュー<br />
ティングの 分 野 での 難 問 に 初 めて 実 用 的 な 解 を 与 えるものでした。そしてこの 発 明 こそ<br />
が、 中 央 機 関 の 必 要 としない 通 貨 システムの 実 現 の 鍵 となるものでした。<br />
「ビザンチン 将 軍 問 題 」とは、 不 特 定 多 数 のノードで 構 成 され 潜 在 的 に 悪 意 のあるノード<br />
も 含 まれるようなP2Pネットワークの 中 で、 各 ノードの 情 報 交 換 によって 通 貨 の 取 引 情 報<br />
( 例 えば 誰 から 誰 にいくら 支 払 った 等 )にネットワーク 全 体 で 合 意 を 形 成 することは 可 能<br />
か? 可 能 である 場 合 はどのように 行 えばよいのか?という 問 題 です。<br />
P2Pは 不 特 定 多 数 のノードがランダムに 接 続 されたネットワークです。 例 えば、P2Pのネッ<br />
トワーク 内 で 悪 意 のあるノードがAに$100を 送 金 したという 情 報 をそのノードに 繋 がってい<br />
るノードの 一 つに 送 り、 同 時 に 同 じ$100をBに 送 金 したいう 情 報 を 別 のノードに 送 信 したと<br />
したらどうなるでしょう( 二 重 支 払 問 題 )。それぞれの 情 報 を 受 け 取 ったノードがそれら<br />
の 情 報 を 信 じて 動 作 すると、ネットワーク 内 の 資 金 の 流 れの 情 報 に 整 合 性 が 無 くなり、た<br />
ちまちこの 通 貨 システムは 破 たんしてしまいます。<br />
Nakamoto 氏 はブロックチェーンとプルーフ・オブ・ワークという 仕 組 みを 導 入 すること<br />
で、P2Pのシステム 上 で 通 貨 システム 実 現 しようとする 際 に 生 まれるこの 問 題 を 解 決 するこ<br />
とに 成 功 しました。 次 節 以 降 で、ビットコインの 動 作 の 概 略 とともに、どのように 解 決 し<br />
たのかについて 見 ていきましょう。<br />
ビットコインでの 送 金 の 仕 組 み<br />
ブロックチェーン 革 命<br />
5
Ethereum 入 門<br />
技 術 的 には、ビットコインの 世 界 では、 実 際 に 何 らかの 電 子 的 なコインが 存 在 しそれをや<br />
り 取 りしているわけではありません。「 送 信 者 から 受 信 者 へある 一 定 量 の 額 面 を 移 動 させ<br />
る」という 取 引 (トランザクション)の 中 で 各 ユーザーのビットコインの 保 有 額 が 暗 に 示<br />
されるものです。<br />
つまり、ある 時 点 でのあるユーザー(のアドレス)が 保 持 するビットコインの 量 は、その<br />
時 点 より 以 前 にそのユーザーに 向 けて 支 払 われたトランザクションのうち、まだ 他 の 誰 か<br />
に 支 払 うために 使 われていないトランザクション(UTXO: Unspent Transaction Output )<br />
を 寄 せ 集 め、そのそれぞれのUTXOの 額 面 の 総 和 になります。<br />
例 えば、 太 郎 がビットコインを 始 めようとアカウント(アドレス)を 作 成 し、その 後 、 友<br />
人 Aから 10 BTC、 友 人 Bから 20 BTC のビットコインを 送 ってもらったとします。それ 以<br />
降 、 太 郎 は 誰 にもビットコインを 支 払 っていないとすると、 太 郎 は2つのUTXO 1 を 持 って<br />
いることになります。そしてその 総 額 が 30 BTCなので、 太 郎 はビットコイン30 BTC を 保<br />
有 しているということになります。<br />
さて、ここで 太 郎 が 花 子 に 25 BTC を 送 金 したいとするとどうなるでしょうか? UTXO 自<br />
体 はトランザクションの 情 報 なので、その 額 面 を 分 割 することはできません。そのため 太<br />
郎 は「 自 分 の 持 っている2つのUTXO ( 計 30 BTC)を 使 って、25 BTC を 花 子 のアドレス<br />
に、5 BTC を 自 分 自 身 のアドレスに 送 金 する」という 新 しいトランザクションを 生 成 しま<br />
す。これにより 花 子 と 太 郎 はそれぞれ 25 BTC、5 BTC のUTXOを 新 たに 得 ることになりま<br />
す。これは 現 実 世 界 で950 円 支 払 うのに 千 円 札 で 支 払 い、50 円 のお 釣 りを 受 け 取 ることに 似<br />
ています。<br />
ブロックチェーン<br />
従 来 のように 中 央 管 理 機 関 が 存 在 している 通 貨 システムであれば、 太 郎 は 自 ら 生 成 したト<br />
ランザクションの 情 報 をその 中 央 機 関 に 送 信 し、その 機 関 は 受 信 したトランザクションの<br />
情 報 に 基 づいて、 自 ら 管 理 する 取 引 台 帳 にその 情 報 を 更 新 すればよいだけです。<br />
システムの 参 加 者 は、この 信 用 に 足 る 中 央 機 関 の 管 理 する 台 帳 が「 正 」であると 皆 で「 合<br />
意 」することができます。また、たとえ 太 郎 に 悪 意 があって、 花 子 に 25 BTC を 送 った 後<br />
に 同 じUTXOを 使 って 25BTC を 別 の 人 に 送 ろうとしても、 中 央 機 関 はそのUTXOは 使 用 済<br />
みと 知 っているので、「 使 えない」とすればよいだけです。 非 常 にシンプルです。<br />
一 方 、P2Pのネットワーク 上 で 動 作 するビットコインは、 代 表 して 台 帳 を 管 理 する 中 央 機 関<br />
(システム)が 存 在 しません。そのため、 各 ノードが「ブロックチェーン」と 呼 ばれる 取<br />
引 台 帳 をネットワークへの 参 加 者 間 で 共 有 ・ 管 理 し、その 台 帳 を「 正 」とする 合 意 をとり<br />
ます。<br />
ビットコインのシステムでは、 参 加 者 間 でビットコインの 送 金 (=トランザクション)が<br />
行 われるとその 情 報 がP2Pネットワーク 全 体 に 伝 搬 します。ネットワーク 内 には「 採 掘 者 」<br />
と 呼 ばれるノードが 多 数 参 加 しており、これら 採 掘 者 は、ある 時 点 からある 時 点 までの 間<br />
ブロックチェーン 革 命<br />
6
Ethereum 入 門<br />
に 行 われたトランザクションの 情 報 を1つの「ブロック」と 呼 ばれるパッケージを 生 成 する<br />
「 採 掘 」という 作 業 を 行 います。そのブロックには、 前 に 作 成 されたブロックへの 参 照 2 を<br />
含 めることで、そのブロックが 時 系 列 に 連 なった 一 本 のチェーン(ブロックチェーン)が<br />
連 なっていきます。このブロックチェーンは、ビットコインが 始 まって 以 来 の 全 てのトラ<br />
ンザクション 情 報 が 含 まれ、かつネットワークへの 参 加 者 全 員 が 参 照 可 能 なものです。い<br />
わば 公 開 取 引 台 帳 の 役 割 を 果 たします。<br />
「 採 掘 者 」はブロックを 生 成 時 、<br />
UTXOの 所 有 者 以 外 が、そのUTXOを 用 いて 送 金 を 行 っていないか?<br />
同 じUTXOを 複 数 回 使 用 するようなトランザクションがないか?<br />
といった、ブロックに 含 めるトランザクションの 正 当 性 を 確 認 してブロック 生 成 します。<br />
また、その「 採 掘 者 」 生 成 したブロックを 他 のノードが 受 け 取 った 際 にも 同 様 の 確 認 を<br />
し、 新 しいブロックが 追 加 されたブロックチェーンを「 正 」として 合 意 するという 仕 組 み<br />
で、 取 引 台 帳 としてのブロックチェーンの 正 当 性 を 合 意 していく 仕 組 みをとっています。<br />
プルーフ・オブ・ワーク<br />
さて、P2Pシステムの 性 質 上 、このブロックを 生 成 する「 採 掘 者 」は 特 別 な 権 限 を 与 えられ<br />
た 参 加 者 ではなく、 任 意 の 参 加 者 が「 採 掘 者 」になることが 可 能 です。しかし 一 方 で、 誰<br />
でも 何 の 制 限 もなくブロックが 生 成 できるとなると、 皆 が 好 き 勝 手 にブロックチェーンを<br />
連 ねていき、どのブロックチェーンが 皆 が 合 意 する「 正 」のブロックチェーンかが 分 から<br />
なくなる 事 態 になります。<br />
そこでビットコインでは、「プルーフ・オブ・ワーク」という 仕 組 みを 導 入 します。これ<br />
は、ブロックを 採 掘 する 際 の 条 件 に、その 生 成 するブロックのヘッダ・データのSHA256<br />
ハッシュ 値 が、 規 定 された 値 以 下 でなければならないという 条 件 を 課 すものです。この 制<br />
限 を 満 たすために、 採 掘 者 はnonce(ノンス)と 呼 ばれる 付 加 データをヘッダに 追 加 するこ<br />
とで、ハッシュ 値 が 規 定 された 値 以 下 になるように 調 整 を 行 います。SHA256のような 暗 号<br />
学 的 ハッシュ 関 数 は、 出 力 されるハッシュ 値 が 元 のデータからは 予 見 できないように 設 計<br />
されている 関 数 のために、 採 掘 者 は 条 件 を 満 たすハッシュ 値 が 出 力 される(= 採 掘 に 成 功<br />
する)までナンスの 値 を 変 更 しながら 試 行 錯 誤 を 繰 り 返 します。<br />
多 数 参 加 している 採 掘 者 の 中 で 最 初 に 採 掘 に 成 功 した 採 掘 者 は、その 情 報 をビットコイ<br />
ン・ネットワーク 内 に 発 信 します。それを 受 信 した 他 の 参 加 者 は 採 掘 されたブロックを 調<br />
べ、<br />
前 のブロックの 参 照 が 含 まれているか<br />
プルーフ・オブ・ワークの 条 件 を 満 たしているか<br />
ブロックに 含 まれているトランザクションに 不 整 合 はないか<br />
などを 確 認 し、 問 題 がないことが 分 かればそのブロックが「 正 」として 合 意 します。<br />
ブロックチェーン 革 命<br />
7
Ethereum 入 門<br />
採 掘 に 成 功 したノードには、インセンティブとして25 BTC の 報 酬 が 与 えられます。この 報<br />
酬 を 目 当 てに 多 数 の 採 掘 者 がビットコイン・ネットワークに 参 加 し、 常 に 採 掘 競 争 を 行 っ<br />
ています。<br />
プルーフオブワークの 制 限 は、ネットワーク 全 体 で「 採 掘 者 」 達 が10 分 に1 回 程 度 の 頻 度<br />
でその 条 件 に 合 うハッシュ 値 を 見 つけられる 生 成 するノンスを 見 つけ、 新 しいブロック 採<br />
掘 できる 程 度 に 動 的 に 調 整 されます。<br />
2 重 支 払 問 題 の 解 決<br />
このブロックチェーンとプルーフオブワークの 組 み 合 わせにより、 悪 意 のある 参 加 者 ( 攻<br />
撃 者 )が2 重 支 払 を 行 うことを 防 ぐことが 可 能 になります。 少 し 具 体 的 な 例 として 攻 撃 者<br />
が 以 下 のように2 重 支 払 いを 行 って 商 品 をだまし 取 ろうとした 場 合 のケースを 考 えましょ<br />
う。<br />
1. 攻 撃 者 が、あるEC 業 者 から 商 品 を 購 入 し100BTCを 送 金 する。<br />
2. EC 業 者 は100BTCが 送 金 されたことをブロックチェーンの 記 録 を 見 て 確 認 する。 送 金<br />
されたことが 確 認 できたら 商 品 を 発 送 する。<br />
3. 攻 撃 者 が 商 品 を 受 け 取 る。<br />
4. 攻 撃 者 が 業 者 に 支 払 った100BTCをなかったことにするために、 同 じ100BTCを 自 分 自<br />
身 に 送 金 したというように、ブロックチェーンを 書 き 換 える。<br />
ステップ1の 送 金 の 事 実 が、ここでは 仮 にブロック 番 号 2000 番 のブロックに 記 録 されてい<br />
たとします。ブロックが 生 成 され、ネットワークがそれを 受 け 入 れた 時 点 ( 他 の 採 掘 者 が<br />
そのブロックに 連 なる 次 のブロックを 採 掘 し 始 めた 時 点 )でビットコイン・ネットワーク<br />
内 で「 攻 撃 者 からEC 業 者 への100BTCの 送 金 した」という 事 実 が 存 在 するという 合 意 が 得<br />
られたことになります。 攻 撃 者 が 送 金 の 事 実 を 消 そうとした 場 合 、このブロック 番 号 2000<br />
番 のブロックに 含 まれるトランザクション 情 報 を 書 き 換 える 必 要 があります。トランザク<br />
ションの 中 身 が 変 わっているために 既 に 存 在 するブロック 番 号 2000のハッシュ 値 も 替 るた<br />
め、 攻 撃 者 はこの 書 き 換 えたトランザクションの 内 容 で 番 号 2000のブックを 再 び 採 掘 する<br />
必 要 があります。また、 採 掘 しなおしたブロックはオリジナルのブロックとは 異 なるハッ<br />
シュ 値 を 持 っているため、 他 の 採 掘 者 が 採 掘 した2001 番 以 降 のブロックはもはや 攻 撃 者 が<br />
書 き 換 えたブロックの 方 を 参 照 しません。<br />
ビットコインのブロックチェーンのルールとして、Forkができた 場 合 は、 最 も 長 いForkを<br />
生 とするというルールがあるため、 攻 撃 者 が2,000 番 のブロックを 採 掘 したとしても 他 の 採<br />
掘 者 はそれに 連 なるブロックを 採 掘 しようとはせず、 正 当 な 方 の 分 岐 の 採 掘 を 行 おうとし<br />
ます。 一 方 で 攻 撃 者 は、 自 分 のみで2,000 番 のブロックに 続 くブロックを 採 掘 していこうと<br />
するのですが、 攻 撃 者 が 自 分 のブロックチェインが 正 統 なほうのチェーンより 長 く 連 ねる<br />
には、 正 当 な 方 のチェーンを 採 掘 し 続 けている 残 りのネットワーク 全 部 の 計 算 パワーを 上<br />
回 る 必 要 があります。ビットコイン・ネットワークに 十 分 な 採 掘 者 が 参 加 していれば、 攻<br />
ブロックチェーン 革 命<br />
8
Ethereum 入 門<br />
撃 者 単 独 で 残 りの 採 掘 者 達 の 計 算 パワーには 勝 つことは 容 易 ではありません。( 攻 撃 者 が<br />
単 独 で 全 採 掘 者 の 計 算 パワーの51%を 占 める 必 要 があります。)そのため、2 重 支 払 が 出<br />
来 ない 仕 組 みとなっているのです。<br />
ブロックチェーンの 応 用<br />
Nakamoto 氏 の 発 明 の 本 質 は、いかなる 中 央 機 関 も 存 在 しないP2Pネットワーク 上 で、「 合<br />
意 」の 形 成 を 行 うことを 可 能 にしたことにあります。 送 金 の 事 実 についての 合 意 形 成 を 実<br />
現 することで、P2Pネットワーク 上 に「 通 貨 」を 実 現 したビットコインは、このブロック<br />
チェーンによる 革 新 の 一 つの 応 用 に 過 ぎません。 事 実 2009 年 以 降 、ブロックチェーンによ<br />
る 合 意 形 成 を 応 用 した 様 々なサービスが 生 み 出 されています。<br />
一 つの 例 がNamecoinです。Namecoinは 名 前 登 録 を 分 散 システム 上 で 行 うものです。 例 え<br />
ば、Webサイトなどに 用 いられるドメイン 名 は 現 在 ICANNという 組 織 を 中 心 に 管 理 されて<br />
いるものです。このようなドメイン 名 の 管 理 をブロックチェーンを 利 用 してP2Pシステム 上<br />
で 実 現 しようとするのがNamecoinです。「いつ 誰 がどのドメイン 名 を 登 録 した」という 事<br />
実 をブロックチェーンに 登 録 し、それをネットワーク 参 加 者 の 誰 もが 参 照 可 能 な 公 開 ドメ<br />
イン 登 録 台 帳 として 管 理 していきます。Namecoinは、ブロックチェーンの 応 用 の 中 でも 最<br />
も 古 く 成 功 した 例 として 知 られていあmす。<br />
この 他 にも、Storj( 分 散 ストレージ)、Pro<strong>of</strong> <strong>of</strong> Existence(ドキュメント 存 在 証 明 )など<br />
の 様 々な 応 用 サービスがローンチされてきています。ブロックチェーンを 用 いたP2Pの 分 散<br />
型 のサービスは 現 在 の 時 点 では 思 いつかないアイデアのサービスに 広 がっていくかもしれ<br />
ません。<br />
脚 注<br />
1 Aから 10 BTC 送 金 を 受 けたトランザクションと、Bから 20 BTC 送 金 を 受 けたトランザ<br />
クションの2つ。<br />
2 技 術 的 には、 参 照 先 ブロックのヘッダ・データのHash 値 。<br />
ブロックチェーン 革 命<br />
9
Ethereum 入 門<br />
Ethereum とは<br />
分 散 アプリケーション 開 発 の 障 壁<br />
前 節 で、ブロックチェーン 技 術 の 革 新 性 と、 通 貨 (ビットコイン)だけに 収 まらない 応 用<br />
の 可 能 性 について 述 べてきました。<br />
ブロックチェーン 技 術 を 用 いた 新 たな 応 用 サービスをローンチするためには、2つの 選 択<br />
肢 があります。1つは 新 たなサービスのために 新 しいブロックチェーンを 構 築 しそれを<br />
使 ってサービスを 行 うこと。2つめは、ビットコインのような 既 存 のブロックチェーンを<br />
利 用 しその 上 にサービスを 構 築 するというものです。 前 節 に 挙 げた 応 用 例 では、Storj や<br />
Namecoin は 前 者 のタイプであり、Pro<strong>of</strong> <strong>of</strong> Existence は 後 者 のタイプになります。<br />
新 しいブロックチェーンを 構 築 することは、 非 常 に 敷 居 の 高 い 方 法 です。 実 装 に 相 当 の 工<br />
数 がかかります。さらに 重 要 なのは、ブロックチェーンを 用 いた 合 意 形 成 がサービスの<br />
ローンチ 当 初 から 安 定 して 動 作 するためには、 相 当 数 の 参 加 者 が 事 前 に 集 まっている 必 要<br />
があるからです。これは 需 要 の 少 ないニッチなサービスを 展 開 する 際 には、 非 常 に 致 命 的<br />
な 問 題 になります。<br />
一 方 で、 既 存 のビットコインのブロックチェーンを 利 用 したサービス 提 供 する 場 合 は、あ<br />
くまでビットコイン 自 体 の 設 計 上 の 制 限 に 従 う 必 要 があり、 非 常 に 不 自 由 なものとなって<br />
しまします。<br />
Ethereumとは<br />
Ethereumは「 分 散 アプリケーションプラットフォーム」です。 分 散 アプリケーションが 動<br />
作 する 基 盤 を 用 意 することで、 上 述 のような 分 散 アプリケーションを 開 発 する 際 の 障 壁 を<br />
取 り 除 くことを 目 的 としています。<br />
Ethereumは 任 意 の 処 理 が 記 述 可 能 (チューリング 完 全 )な、 組 み 込 みのプログラミング 言<br />
語 を 備 えます。 分 散 アプリケーションの 開 発 者 は、この 組 み 込 みの 言 語 を 用 いてプログラ<br />
ミングを 行 い 開 発 を 行 います。 分 散 アプリケーションのコードは、ブロックチェーンに 組<br />
み 込 まれビットコインと 同 様 にプルーフ・オブ・ワークの 仕 組 みにより、 改 ざん 不 可 能 に<br />
なります。このコードはEthereumネットワークに 参 加 する 各 ( 採 掘 者 の)ノード 上 で 実 行<br />
され、その 結 果 の 状 態 もブロックチェーンに 組 み 込 まれ、やはり 改 ざんが 不 可 能 になりま<br />
す。<br />
Ethereumのプラットフォーム 上 で 動 作 するよう 開 発 された 様 々な 分 散 アプリケーション<br />
は、Ethereumのブロックチェーンを 共 有 して 利 用 します。そのため 利 用 者 が 少 ないニッチ<br />
な 分 散 アプリケーションでも、 分 散 システム 上 での「 合 意 形 成 」が 安 定 して 動 作 すること<br />
が 可 能 です。<br />
Ethereum とは<br />
10
Ethereum 入 門<br />
ここで、 少 しEthereumの 仕 組 みの 概 略 を 見 ていきましょう。( 詳 細 は「Ethereumの 内 部 」<br />
の 章 で 解 説 します。)<br />
内 部 通 貨 :ether<br />
Ethereumでは、「ether」という 独 自 の 内 部 通 貨 が 規 定 されています。ビットコインと 同<br />
様 、それ 自 体 が 価 値 を 持 つ 通 貨 としての 利 用 も 可 能 ですが、より 重 要 な 事 はetherが<br />
Ethereum 内 で 分 散 アプリケーションやスマート・コントラクトを 実 行 するための「 燃 料 」<br />
の 役 割 を 果 たすという 事 です。Ethereumは 上 述 のように、このプラットフォーム 上 で 動 作<br />
する 分 散 アプリケーションに 対 して 任 意 の 処 理 を 可 能 にしており、それぞれの 分 散 アプリ<br />
ケーション 間 でその 動 作 に 必 要 な 計 算 資 源 の 量 は 異 なってきます。そこで、Ethereumで<br />
は、 分 散 アプリケーションを 実 行 するためには、その 処 理 の 重 さに 応 じた 燃 料 が 必 要 」と<br />
することによって、Ethereum 上 で 動 作 する 分 散 アプリケーション 間 での 計 算 資 源 の 割 り 当<br />
ての 平 等 性 を 確 保 しています。<br />
内 部 通 貨 etherの 単 位 は 通 貨 名 と 同 じでether(またはETH)ですが、 米 国 の 通 貨 で 1 doller<br />
$$=$$ 100 cent と 規 定 されているように、etherも 利 便 性 のために、より 少 額 のetherに 対 し<br />
て 下 記 のように 単 位 名 が 決 められています。<br />
1 ether $$=$$ 10 3 finney<br />
1 ether $$=$$ 10 6 szabo<br />
1 ether $$=$$ 10 18 wei<br />
アカウント<br />
Ethereumには、「アカウント」と 呼 ばれるオブジェクトが 既 定 されています。アカウント<br />
は 20 Byte のアドレス( 例 :0x4c84913cc41f2aad9c24d82bfde598c91cdd33d3) 1 により<br />
参 照 されます。アカウントは 主 に 次 の4つのフィールドを 持 ちます。<br />
nonce:そのアカウントが 送 信 した 累 積 トランザクション 数<br />
ether balance:そのアカウントが 所 有 するether 量<br />
contract code:コントラクト・コード(EOAの 場 合 は 空 )<br />
storage:そのアカウントが 保 持 する 任 意 のデータ<br />
この 各 フィールドのデータ( 詳 細 は「Ethereumの 内 部 」 章 で 解 説 します)は、アカウント<br />
間 でトランザクションが 発 生 することにより 変 化 します。つまり、アカウントの「 状 態 」<br />
がトランザクションによって 変 化 していきます。<br />
「アカウント」には2つのタイプが 存 在 します。 一 つは「Externally Owned<br />
Account(EOA)」、もう 一 つは「Contract」です 2 。EOAは、 我 々ユーザーにより 生 成 さ<br />
れコントロールされるアカウントです。ユーザーの 任 意 のタイミングでトランザクション<br />
Ethereum とは<br />
11
Ethereum 入 門<br />
を 生 成 し、 他 EOAへのetherの 送 金 、 新 しい Contract の 生 成 やコントラクト・コードの 実 行<br />
を 行 います。<br />
一 方 でContract は、EOAからトランザクションを 介 して 生 成 されます。Contractは 一 種 の<br />
自 動 エージェントであり、EOAが 発 信 するトランザクションをトリガに、コントラクト・<br />
コードを 実 行 します。<br />
トランザクション<br />
EthereumではEOAから 任 意 のタイミングでトランザクションを 送 信 することで、 各 アカウ<br />
ントの 状 態 が 変 化 します 3 。EOAがトランザクションを 生 成 しそれをEthereumネットワー<br />
ク 上 に 送 信 します。 採 掘 者 は 受 信 したトランザクションの 正 当 性 をチェックし 問 題 なけれ<br />
ば、そのトランザクションの 情 報 とトランザクションの 内 容 に 基 づいて 変 化 した 最 新 のア<br />
カウントの 状 態 をブロックチェーンに 埋 め 込 みます 4 。<br />
トランザクションには 主 に 以 下 の 情 報 が 含 まれます。<br />
ether 送 金 額<br />
相 手 先 アドレス<br />
送 信 アカウント 署 名<br />
任 意 データ<br />
STARTGAS 値<br />
GASPRICE 値<br />
最 初 の3つはビットコインのような 暗 号 通 貨 のトランザクションと 同 じで、それぞれ、<br />
Ethereumの 内 部 通 貨 であるetherの 送 金 額 と 相 手 のアドレス、そしてトランザクションの 送<br />
信 者 がether 送 金 元 アドレスの 所 有 者 であることを 証 明 するデジタル 署 名 です。<br />
「 任 意 データ」はトランザクションの 相 手 先 が Contract である 場 合 に、そのコントラク<br />
ト・コードに 引 き 渡 すデータ 格 納 します。<br />
例 えばIPアドレスとドメイン 名 の 紐 づけを 管 理 するドメイン 管 理 の 分 散 アプリケーション<br />
を 考 えてみましょう。その 場 合 にユーザーは、 自 分 が 登 録 したいIPアドレスとドメイン 名<br />
の 情 報 を 分 散 アプリに 対 して 引 き 渡 し、 分 散 アプリ 側 でその 登 録 情 報 を 管 理 することにな<br />
ります。このようなことを 実 現 するために、ユーザーは 分 散 アプリの 処 理 (ここではドメ<br />
インの 登 録 情 報 の 管 理 )を 担 う Contract のアドレスを「 相 手 先 アドレス」に、かつ、 自 分<br />
の 登 録 したい 情 報 (ここではIPアドレスとドメイン 名 )を「 任 意 データ」に 格 納 したトラ<br />
ンザクションを 発 生 させます。 一 方 そのトランザクションにより「 任 意 データ」に 格 納 さ<br />
れたデータを 入 力 値 としてコントラクト・コードが 実 行 され、 今 回 引 き 渡 されたデータが<br />
すでに 登 録 済 みのものではない 場 合 、Contract の storage フィールドに 格 納 された 登 録 済<br />
みドメインリストに 今 回 の 登 録 情 報 が 追 加 されることになります。<br />
Ethereum とは<br />
12
Ethereum 入 門<br />
STARTGAS 値 と、GASPRICE 値 は、トランザクション 手 数 料 として 支 払 うetherの 量 を 規 定<br />
する 情 報 です。トランザクションに 必 要 な 手 数 料 は、トランザクションが 実 行 するコード<br />
の 処 理 の 数 や、トランザクションのデータの 大 きさに 応 じて「gas」という 単 位 で 計 算 され<br />
ます。トランザクションで 支 払 う 最 大 のgas 量 がSTARTGAS 値 であり、そしてその「gas」<br />
と 内 部 通 貨 etherとの 交 換 レートがGASPRICE 値 になります。<br />
トランザクションの 処 理 の 流 れ<br />
ここでトランザクションによりどのようにアカウントの 状 態 が 変 更 されていくのかの 処 理<br />
の 流 れを 見 ていきます。 大 まかに 以 下 のようになります。<br />
1. EOAがトランザクションを 生 成 し、Ethereumネットワーク 上 に 送 信 する。<br />
2. ネットワーク 内 の 採 掘 者 がトランザクションを 受 信 する。<br />
3. 採 掘 者 は、 署 名 の 正 当 性 など、 受 信 したトランザクションのデータに 問 題 がないかを<br />
チェック。 問 題 がある 場 合 はエラーとして 以 降 の 処 理 を 行 わない。<br />
4. 採 掘 者 はトランザクション 内 のSTARTGAS 値 とGASPRICE 値 を 参 照 。「STARTGAS 値<br />
× GASPRICE 値 」の 量 のetherを、 前 払 い 手 数 料 として、トランザクションを 送 信 した<br />
アカウントの 保 有 するetherから 引 く。もしetherの 保 有 量 が「STARTGAS 値 ×<br />
GASPRICE 値 」よりも 少 なければエラーとして 以 降 の 処 理 を 行 わない。<br />
5. 残 りGAS = STARTGAS 値 とする。<br />
6. トランザクション・データの 大 きさ1バイト 当 たり5 gasを 残 りGASから 引 く。<br />
7. トランザクション 内 で 指 定 された 相 手 に 対 して、 指 定 された 額 のetherを 送 金 。また<br />
「トランザクションの 相 手 」が Contract の 場 合 は、Contract の 持 つコードを 実 行 。<br />
8. 送 金 額 のetherを 送 金 者 が 保 有 していない、または、コードを 実 行 中 に 残 りGASがゼロ<br />
になった 場 合 には、 手 数 料 の 支 払 情 報 のみを 残 し、 元 の 状 態 にロールバックさせる。<br />
トランザクション 実 行 前 の 状 態 から、トランザクション 実 行 のための 手 数 料 分 だけト<br />
ランザクションの 送 信 者 の 保 有 etherから 引 き、 採 掘 者 の 保 有 額 にそれを 足 した 状 態 を<br />
終 状 態 とする。<br />
9. 送 金 、またはコードの 実 行 が 正 常 に 終 了 し、GASが 余 っている 場 合 は、その 余 った<br />
GASをトランザクションの 送 信 者 に 対 して 戻 す。<br />
ブロックチェーンと 採 掘<br />
ビットコインのシステムで、ブロックチェーンはビットコイン・ネットワーク 上 で 発 生 し<br />
たすべてのトランザクションを 記 録 した、 誰 でも 参 照 可 能 な 公 開 取 引 元 帳 の 役 割 を 果 たし<br />
ていました。<br />
Ethereumのブロックチェーンも 同 様 に 公 開 元 帳 の 役 割 を 果 たします。ただビットコインの<br />
場 合 とは 異 なり、Ethereumのアカウントのブロックチェーンには、トランザクションだけ<br />
でなくEthereumネットワークの 全 アカウントの 最 新 の 状 態 に 関 する 情 報 も 記 録 されます。<br />
Ethereum とは<br />
13
Ethereum 入 門<br />
つまり、ブロックチェーンにはトランザクションとアカウントの 状 態 が 記 録 されていき、<br />
そのブロックチェーンに 書 き 込 まれた 状 態 を「 正 」とするEtherumネットワーク 内 の 合 意 が<br />
形 成 されていきます。<br />
Ethereumネットワーク 内 の 採 掘 者 は、etherの 報 酬 を 目 当 てに、ブロックの 採 掘 競 争 を 続 け<br />
ます。Ethereumでは、 新 しいブロックが 平 均 して12 秒 に1 回 採 掘 されるように 動 的 にプ<br />
ルーフ・オブ・ワークの 難 易 度 を 調 整 されるように 設 計 されています。<br />
Ethereum では、 採 掘 が 成 功 すると、<br />
1 採 掘 当 たり 固 定 で5 ether<br />
ブロックに 含 まれる 全 てのcontractのコードを 実 行 した 際 に 消 費 したgasに 相 当 する<br />
ether<br />
ブロックに 含 んだ1つのUncleブロック 当 たり1/32 ether<br />
の 報 酬 が 採 掘 者 に 与 えられます。<br />
脚 注<br />
1 ここで 先 頭 の「0x」は16 進 数 を 表 わすプレフィックスです。<br />
2 Ethereum White Paper では「Contract Account」という 呼 び 方 をしていますが、 例 えばこ<br />
のTutorial などのように、 最 近 は 単 に「Contract」と 呼 ぶことが 多 いようです。<br />
3 実 際 には、 状 態 の 遷 移 はトランザクションだけでなく、「メッセージ」によっても 遷 移 が<br />
行 われますがここでは 説 明 を 省 きます。「トランザクション」はEOAにより 生 成 / 送 信 され<br />
るのに 対 して「メッセージ」はContract により 生 成 / 送 信 されます。<br />
4 ビットコインの 場 合 、ブロックチェーンにはトランザクションのみが 記 録 されましたが、<br />
Ethreumではトランザクションによって 変 化 したアカウントの 状 態 もブロックチェーンに 記<br />
録 されます。<br />
Ethereum とは<br />
14
Ethereum 入 門<br />
Ethereum 事 始 め<br />
前 の 章 では、ブロックチェーン 技 術 の 革 新 性 と、Ethereumがブロックチェーン 技 術 を 用 い<br />
た 分 散 アプリケーションやスマート・コントラクトの 開 発 を 容 易 にするプラットフォーム<br />
であることを 説 明 してきました。<br />
では 実 際 にEthereum 上 で 分 散 アプリケーションやスマート・コントラクトを 開 発 していく<br />
流 れを 見 ていきましょう。<br />
この 章 では 最 初 にEthereumのフル・クライアントであるgethのインストールの 方 法 を 解 説<br />
します。そしてgethを 使 ってetherの 採 掘 と 送 金 を 行 う 方 法 を 解 説 します。 最 後 に、 最 も 単<br />
純 なContractdを 開 発 し、 実 際 に 動 作 させるところまでを 解 説 していきます。<br />
まずは Ethereum に 触 れてみる<br />
15
Ethereum 入 門<br />
Gethをインストールして 起 動 してみる<br />
Ethereumを 利 用 する 場 合 、まずはEthereumのP2Pネットワークに 参 加 する 必 要 がありま<br />
す。ネットワークへの 参 加 はEthereumクライアントをインストールし 起 動 することで 参 加<br />
が 可 能 になります。<br />
Ethereumでは、Ethereumの 仕 様 を 実 装 した 幾 つかのEthereumクライアントが 存 在 します<br />
が 1 、 現 在 のところ 推 奨 されているクライアントは「Geth」です。Gethはプログラミング 言<br />
語 Goにより 実 装 されたCUIクライアントであり、GethをインストールすることでEthereum<br />
ネットワークにフル・ノードとして 参 加 し、<br />
etherの 採 掘<br />
etherの 送 金<br />
スマート・コントラクトの 生 成<br />
トランザクションの 生 成<br />
ブロックチェーンの 確 認<br />
といった 動 作 が 可 能 になります。<br />
本 節 では、Gethのインストール 手 順 を 解 説 します。<br />
Ubuntu、Debian、Mac OS X へのGethのインストール<br />
Unix 系 であるUbuntu、Debian、Mac OS X のOSを 使 用 している 場 合 、Gethのインストール<br />
は 極 めて 容 易 です。 コンソールを 立 ち 上 げ、<br />
$ bash
Ethereum 入 門<br />
$ bash Looking for geth<br />
Geth is missing<br />
==> Checking dependencies<br />
apt-get<br />
apt 1.0.1ubuntu2 for amd64 compiled on Aug 1 2015 19:20:48<br />
Supported modules:<br />
*Ver: Standard .deb<br />
( 中 略 )<br />
==> This script will install:<br />
==> Ethereum:\n -> /usr/bin/geth\n<br />
==> Before installing Geth (ethereum CLI) read this:<br />
-> Frontier is a live testnet, it is not the 'main release' <strong>of</strong> Ethereum, but rather an initial beta<br />
-> You'd be mad to use this for anything approaching important or valuable. Expect dragons;<br />
-> If you're in any doubt, stand back and enjoy the show. It's so unstable, even Chuck Norris would<br />
-> We fully expect instability and consensus flaws in the client, some <strong>of</strong> which may be exploitable;<br />
==> I understand, I want to install Geth (ethereum CLI) (Y/n)<br />
Ethereumはまだテスト 段 階 であり、 非 常 に 不 安 定 である 旨 の 警 告 が 表 示 され、それを 理 解<br />
したうえでインストールを 望 むか、と 質 問 されるので、 「Y」とコンソールに 入 力 する<br />
と、 以 下 のように、 実 行 環 境 に 合 わせたインストールが 開 始 されます。 また、sudoコマン<br />
ドの 実 行 のためにパスワードが 求 められる 場 合 があるので、その 場 合 はパスワードを 入 力<br />
します。<br />
Gethをインストールしてみる<br />
17
Ethereum 入 門<br />
==> Installing ethereum<br />
==> Installing common s<strong>of</strong>tware properties<br />
$ sudo apt-get install -q -y s<strong>of</strong>tware-properties-common<br />
Reading package lists...<br />
Building dependency tree...<br />
Reading state information...<br />
( 中 略 )<br />
==> Verifying installation<br />
Found geth: /usr/bin/geth<br />
Geth<br />
Version: 1.0.1<br />
Protocol Versions: [61 60]<br />
Network Id: 1<br />
Go Version: go1.4.2<br />
OS: linux<br />
GOPATH=<br />
GOROOT=/usr/lib/go<br />
==> Installation successful!<br />
==> Next steps<br />
==> Run `geth help` to get started.<br />
「Install successful!」のように、インストールが 成 功 した 旨 が 表 示 されれば、インストール<br />
完 了 です。<br />
実 際 にgethがインストールされたかを 確 認 するために、<br />
$ geth help<br />
のコマンドを 実 行 してみましょう。gethコマンドのオプション 情 報 が 表 示 されれば、 正 し<br />
くインストールされています。<br />
Windows へのGethのインストール<br />
Windows 環 境 へのインストールはUnix 系 統 のOSへのインストールと 異 なり、 若 干 手 順 が 煩<br />
雑 です。Windows 環 境 へのインストールはこちらに 詳 しく 記 載 されているので、 参 考 くだ<br />
さい。<br />
Gethのアップデート<br />
Ethereumの 開 発 は 現 在 Pro<strong>of</strong> <strong>of</strong> Concept の 第 9フェーズであり、 正 式 リリースではありませ<br />
ん。そのため、クライアント・ソフトにおいても 頻 繁 にアップデートが 行 われておりま<br />
す。 Gethをアップデートする 際 には apt-get コマンドにより、 以 下 の 手 順 で 行 います。<br />
Gethをインストールしてみる<br />
18
Ethereum 入 門<br />
$ sudo apt-get update<br />
$ sudo apt-get upgrade<br />
脚 注<br />
1 C++で 実 装 されたcpp-ethereum、Pythonで 実 装 されたpyethereum、Javaで 実 装 され<br />
たethereumjなどが 存 在 します。<br />
Gethをインストールしてみる<br />
19
Ethereum 入 門<br />
テスト・ネットに 接 続 してみる<br />
Gethのインストールが 完 了 したら 早 速 Gethを 起 動 します。<br />
Frontier(PoC-9)から、Ethereumの 本 番 ネットワーク(ライブ・ネット)の 稼 働 が 開 始 さ<br />
れました。しかしライブ・ネットには 既 に 多 くの 参 加 者 が 参 加 しており、 採 掘 を 行 っても<br />
なかなか 採 掘 できないことや、まだ 試 験 段 階 でありセキュリティ 脆 弱 性 なども 存 在 する 可<br />
能 性 があることから、Ethereumの 動 作 を 調 べるなど 個 人 的 な 作 業 を 行 うには、テスト・<br />
ネットを 立 ち 上 げてそこでいろいろ 弄 ってみると 便 利 です。<br />
そこで 本 節 では、インストールしたGethを 起 動 し、テスト・ネットに 接 続 までを 解 説 して<br />
いきます 1 。<br />
Gethの 起 動 し、テスト・ネットへ 接 続 する<br />
事 前 に 任 意 の 場 所 にGethのデータ 用 のディレクトリを 準 備 します。 ここでは、ログイン・<br />
ユーザー( 今 回 の 例 ではtest_u)のhomeディレクトリ 直 下 に 作 成 します。<br />
$ mkdir /home/test_u/eth_data<br />
データ 用 ディレクトリを 作 成 したら、 以 下 のコマンドでGethを 起 動 します。<br />
$ geth --networkid "10" --datadir "/home/test_u/eth_data" --logfile "/home/test_u/geth_01.log" --olym<br />
ここで 各 オプションの 意 味 は 以 下 のとおりです。<br />
--networkid "10" : --networkid オプションで 任 意 の 正 の 整 数 のIDを 指 定 すること<br />
で、 個 人 用 テストネットを 立 ち 上 げることが 可 能 です(ここでは10を 指 定 )。<br />
Frontier(PoC-9)から、Ethereumの 本 番 ネットワークの 稼 働 が 開 始 されましたが、 個<br />
人 的 な 試 験 などを 行 うにはテスト・ネットを 立 ち 上 げると 非 常 に 便 利 です。 自 分 だけ<br />
が 参 加 者 のネットワークなので、 採 掘 なども 非 常 に 短 時 間 で 可 能 です。<br />
--datadir "/home/test_u/eth_data" :データ 用 ディレクトリとして、 事 前 に 作 成 してお<br />
いたディレクトリのパスを 指 定 しています。データ 用 ディレクトリにはブロック<br />
チェーン 情 報 やノード 情 報 など 各 種 データが 保 存 されます。<br />
--logfile "/home/test_u/geth_01.log" :ログファイルの 指 定 。<br />
--olympic :テスト・ネットでの 採 掘 を 容 易 にするために Olympic(PoC-8)のプロト<br />
コルを 使 用 することを 指 定 しています。Frontier(PoC-9)に 移 行 した 際 に、 初 期 の 採<br />
掘 の 難 易 度 (Difficulty)が 非 常 に 高 く 設 定 されたため、テスト・ネットでも 採 掘 が 非 常<br />
に 困 難 になりました。 主 な 仕 様 はOlympicとFrontierで 大 きく 異 なることがないので、<br />
テスト・ネットに 接 続 してみる<br />
20
Ethereum 入 門<br />
個 人 的 な 試 験 ではOlympicプロトコルを 使 用 することで 問 題 はありません。(ライブ・<br />
ネットに 接 続 する 際 には、このフラグは 外 します。)<br />
console :Gethには 採 掘 やトランザクションの 生 成 などを 対 話 的 に 進 めることができ<br />
るコンソールが 用 意 されています。 console サブ・コマンドを 指 定 することで、Geth<br />
の 起 動 時 に 同 時 にコンソール 立 ち 上 げることが 可 能 です。なお、 console サブ・コマ<br />
ンドを 付 加 せずに、Gethのプロセスをバックグラウンドで 起 動 させておき、 後 からそ<br />
のプロセスのコンソールを 起 動 する 事 も 可 能 です( 下 記 TIP 参 照 )。<br />
上 記 コマンドを 実 行 すると、 下 記 の 実 行 結 果 のように、 幾 つかの 情 報 の 表 示 の 後 に「>」の<br />
プロンプトが 表 示 され、コンソールが 起 動 されます。 今 後 、 特 にことわりのない 限 り、こ<br />
のように 起 動 したGethプロンプト 上 で 作 業 していく 前 提 で 進 めていきます。<br />
instance: Geth/v1.0.1/linux/go1.4.2<br />
datadir: /home/test_u/eth_testnet_10<br />
coinbase: null<br />
at block: 0 (1970-01-01 09:00:00)<br />
modules: admin:1.0 db:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 shh:1.0 txpool:1.0 web3:1<br />
><br />
■■ TIP ■■<br />
今 後 Gethを 使 用 していくなかで、 採 掘 等 のためにGethをバックグラウンドで 常 時 起 動 して<br />
おき、 必 要 に 応 じてそのGethプロセスに 対 してコンソールを 用 いて 対 話 的 に 操 作 をしたい<br />
といった 場 合 が 発 生 します。その 際 は、 下 記 のように attach サブ・コマンドを 利 用 するこ<br />
とで、 既 に 起 動 されたGethプロセスのコンソールを 起 動 することが 可 能 です。<br />
$ # gethプロセスをconsoleサブ・コマンドを 付 加 せず、かつ 最 後 に"&"を 付 加 することで、バックグラウンドで 起 動 します。<br />
$ # この 場 合 、 起 動 時 にはコンソールは 立 ち 上 がりません。<br />
$ geth --networkid "10" --datadir "/home/test_u/eth_data" --logfile "/home/test_u/eth_data/geth_01.lo<br />
$<br />
$ # attachサブ・コマンドを 用 いて 先 に 立 ち 上 げたプロセスのコンソールを 立 ち 上 げます。<br />
$ # ここで、ipc: 以 降 に 先 に 立 ち 上 げたgethプロセスのデータ 用 ディレクトリ 以 下 のgeth.ipcファイル( 実 際 はソケット)のパスを<br />
$ geth --datadir "/home/test_u/eth_data" attach ipc:/home/test_u/eth_data/geth.ipc<br />
instance: Geth/v1.0.1/linux/go1.4.2<br />
( 実 行 結 果 中 略 )<br />
modules: admin:1.0 db:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 shh:1.0 txpool:1.0 web3:1.<br />
><br />
脚 注<br />
1 ライブ・ネットへの 接 続 方 法 は「ライブ・ネットに 接 続 してみる」 節 で 解 説 します。<br />
テスト・ネットに 接 続 してみる<br />
21
Ethereum 入 門<br />
etherを 採 掘 してみる<br />
前 節 までで、Ethereumの 代 表 的 なクライアントであるGethをインストールし、テストネッ<br />
トへの 接 続 、 対 話 型 のコンソールの 立 ち 上 げ 方 法 を 解 説 しました。Ethereumは 内 部 通 貨<br />
etherが 規 定 されており、Ethereumでトランザクションを 発 生 させるためにはetherの 手 数 料<br />
が 必 要 になります。この 節 ではetherを 採 掘 する 手 順 を 見 ていきます。<br />
アカウントの 作 成<br />
Gethのコンソール 上 で 新 規 のアカウントを 作 成 します。Ethereumには2 種 類 のアカウント<br />
が 存 在 します。 一 つはEOA(Externally Owned Account)、もう 一 つはContractです。<br />
EOAは 私 たちユーザーによりコントロールされるアカウントであり、 我 々ユーザーによる<br />
任 意 のタイミングで、EOAがトランザクションを 発 生 させ、 他 のアカウントへのetherの 送<br />
金 、コントラクト・コードの 実 行 などを 行 います。また、etherの 採 掘 もこのEOAアカウン<br />
トにより 行 われます。<br />
一 方 Contractは 一 種 の 自 動 エージェントであり、EOAにより 発 生 したトランザクションをト<br />
リガにContractアカウントが 内 部 に 持 つコントラクト・コードが 実 行 されます。それにより<br />
Contractのフィールドのデータも 更 新 されます。オブジェクト 指 向 言 語 に 馴 染 みのある 人 に<br />
は、「Contractは 一 種 のクラスのようなもので、EOAによりContractのメソッドが 呼 ばれ、<br />
そのメソッドが 実 行 されるとContractの 持 つクラス 変 数 が 書 き 換 えられる」というアナロ<br />
ジーでの 説 明 が 分 かりやすいかもしれません。<br />
ここでは、EOAを 新 規 に 作 成 していきます。 前 節 の 手 順 に 従 い、Gethが 起 動 されコンソー<br />
ルが 表 示 された 状 態 を 前 提 とします。<br />
まず、このノードに 登 録 されたアカウント(EOA)を 表 示 させてみましょ<br />
う。 eth.accounts コマンドはこのノード 内 で 作 成 されたEOAのリストを 表 示 するもので<br />
す。 現 時 点 ではアカウントを 作 成 していないため、 下 記 のように 実 行 しても 空 のリストが<br />
表 示 されるのみです。<br />
> eth.accounts<br />
[ ]<br />
EOAの 作 成 は personal.newAccount("passwd") コマンドで 行 います。ここでpasswdの 部 分 は<br />
作 成 するEOAのパスワードです。 実 行 時 には 適 宜 書 き 換 えて 実 行 してください。 実 行 する<br />
と、 作 成 されたEOAの20バイトのアドレスが 表 示 されます。ま<br />
た、 personal.listAccounts コマンドの 実 行 結 果 にも 作 成 したアカウントのアドレスが 表 示<br />
されるようになります。<br />
etherを 採 掘 してみる<br />
22
Ethereum 入 門<br />
> personal.newAccount("hogehoge01")<br />
'0x24afe6c0c64821349bc1bfa73110512b33fa18e1'<br />
> eth.accounts<br />
['0x24afe6c0c64821349bc1bfa73110512b33fa18e1']<br />
ここで、もう 一 つアカウントを 作 成 しましょう( 後 で 使 用 します)。<br />
> personal.newAccount("hogehoge02")<br />
'0x59c444d6c4f4187d1dd1875ad74a558a2a3e20b6'<br />
> eth.accounts<br />
['0x24afe6c0c64821349bc1bfa73110512b33fa18e1', '0x59c444d6c4f4187d1dd1875ad74a558a2a3e20b6' ]<br />
【 注 意 】パスワードを 忘 れると 復 元 する 手 段 はありません。 絶 対 にパスワードは 忘 れない<br />
ようにしてください。また、 上 記 の 例 では 簡 易 なパスワードを 用 いましたが、 実 際 には、<br />
セキュリティの 観 点 から 半 角 英 数 記 号 を 含 む 長 い 複 雑 なパスワードを 設 定 するようにして<br />
ください。<br />
etherbase<br />
ここで、 eth.coinbase コマンドを 実 行 してみます。すると 下 記 のとおり 実 行 結 果 には 先 ほ<br />
ど 作 成 した2つのEOAのうちの 一 つが 表 示 されます。このコマンドはetherbase(coinbase<br />
とも 呼 ばれます 1 )を 表 示 するコマンドで、etherbaseとは、 各 ノードで 採 掘 を 行 う 際 にそ<br />
の 報 酬 を 紐 づけるEOAのアドレスを 示 します。<br />
> eth.coinbase<br />
'0x24afe6c0c64821349bc1bfa73110512b33fa18e1'<br />
etherbaseはデフォルトではプライマリーのアカウント( eth.accounts[0] コマンドを 実 行<br />
して 表 示 されるアドレスのEOA)が 設 定 されますが、 下 記 のよう<br />
に miner.setEtherbase(new_adress) コマンドで 変 更 することも 可 能 です。<br />
> miner.setEtherbase(eth.accounts[1])<br />
> eth.coinbase<br />
'0x59c444d6c4f4187d1dd1875ad74a558a2a3e20b6'<br />
etherの 採 掘<br />
etherを 採 掘 してみる<br />
23
Ethereum 入 門<br />
作 成 したEOAのアドレスがetherbaseとしてセットされていれば、etherの 採 掘 が 可 能 です。<br />
etherの 採 掘 は miner.start(thread_num) コマンドで 開 始 します。ここでthread_num は 採 掘<br />
を 何 本 のスレッドで 同 時 実 行 するかを 指 定 するパラメータです 2 。 指 定 しない 場 合 は 動 作 環<br />
境 でのCPUコア 数 に 設 定 されます。ここではthread_numは 指 定 せず、 以 下 のコマンドで 採<br />
掘 を 開 始 します。<br />
> miner.start()<br />
true<br />
また、 採 掘 を 停 止 したい 場 合 は miner.stop() コマンドを 実 行 すれば 停 止 できます。<br />
> miner.stop()<br />
true<br />
採 掘 状 況 の 確 認<br />
テスト・ネット 上 で 採 掘 を 開 始 すると、ブロックが 次 々と 採 掘 されていきます。ブロック<br />
チェーンに 何 番 目 のブロックまで 連 なっているのか(=ブロック 高 )を 確 認 するに<br />
は、 eth.blockNumber コマンドを 用 います。 採 掘 開 始 後 しばらく 3 すると、<br />
> eth.blockNumber<br />
145<br />
といったように、ブロックが 採 掘 されていることが 確 認 できます。 今 回 の 結 果 の 場 合 、145<br />
個 のブロックが 採 掘 されています。( 今 は 自 分 だけが 参 加 しているテストネットで 採 掘 を<br />
行 っているので、この145 個 のブロックは 全 て 自 分 が 採 掘 したことになります。)<br />
■TIP■<br />
なかなか 採 掘 に 成 功 しない 場 合 、 実 際 にGethで 採 掘 処 理 が 行 われているのか 不 安 になるこ<br />
とが 多 くあります。 処 理 が 行 われているかを 確 認 する 一 つの 方 法 は、 miner.hashrate コマ<br />
ンドで、 現 在 の 採 掘 処 理 のハッシュ・レートを 確 認 することです。ハッシュ・レートがゼ<br />
ロよりも 大 きければ、 採 掘 処 理 が 行 われていると 考 えてよいでしょう。<br />
> miner.start()<br />
true<br />
> miner.hashrate // 採 掘 処 理 実 行 時<br />
445445<br />
> miner.stop()<br />
true<br />
> miner.hashrate // 採 掘 処 理 が 行 われていない 場 合 、ハッシュ・レートは0となる。<br />
0<br />
etherを 採 掘 してみる<br />
24
Ethereum 入 門<br />
採 掘 したブロックの 内 容 を 調 べる<br />
eth.getBlock(number) コマンドは、numberに 任 意 のブロック 高 を 指 定 すると、そのブロッ<br />
ク 高 のブロック 情 報 を 表 示 することができます。 以 下 に、ブロック 高 が100と101のブロッ<br />
クの 情 報 を 表 示 してみます。<br />
> eth.getBlock(100)<br />
{<br />
difficulty: '137447',<br />
extraData: '0x476574682f76312e302e312f6c696e75782f676f312e342e32',<br />
gasLimit: 3141592,<br />
gasUsed: 0,<br />
hash: '0x4d3063b91cbaa12bf2de81014c1319febc9f197c93f81b0746afaffaa9496620',<br />
logsBloom: '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000<br />
miner: '0x24afe6c0c64821349bc1bfa73110512b33fa18e1',<br />
nonce: '0x28fda83cb19ed497',<br />
number: 100,<br />
parentHash: '0x5885cdec1d1410580eaaf1fb7ef9db245a735822d48e816c73d926b7c9872f15',<br />
sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',<br />
size: 536,<br />
stateRoot: '0xacf2c3dfc512373ae6d9693207b3ac43fd4811791fec994c2eecd8fdd3333699',<br />
timestamp: 1439451765,<br />
totalDifficulty: '13551548',<br />
transactions: [ ],<br />
transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',<br />
uncles: [ ]<br />
}<br />
> eth.getBlock(101)<br />
{<br />
difficulty: '137514',<br />
extraData: '0x476574682f76312e302e312f6c696e75782f676f312e342e32',<br />
gasLimit: 3141592,<br />
gasUsed: 0,<br />
hash: '0xca9b241dabe753ed83d6242f226c0ad6b559c722edf5d24baff126670f70a30c',<br />
logsBloom: '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000<br />
miner: '0x24afe6c0c64821349bc1bfa73110512b33fa18e1',<br />
nonce: '0x06024dfb81cc05ef',<br />
number: 101,<br />
parentHash: '0x4d3063b91cbaa12bf2de81014c1319febc9f197c93f81b0746afaffaa9496620',<br />
sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',<br />
size: 536,<br />
stateRoot: '0xbd43f9a44f2064c564060e585a23f7183036d83b411e14ad6b346de9d8dead02',<br />
timestamp: 1439451766,<br />
totalDifficulty: '13689062',<br />
transactions: [ ],<br />
transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',<br />
uncles: [ ]<br />
}<br />
etherを 採 掘 してみる<br />
25
Ethereum 入 門<br />
各 項 目 については、「Ethereumの 内 部 」 章 で 詳 しく 説 明 しますが、ここで<br />
は、 miner 、 number 、 hash 、 parentHash 、 transactions の 項 目 に 着 目 します。<br />
miner の 項 目 はそのブロックを 採 掘 したEOAのアドレスを 示 しています。 今 回 は 採 掘 者 は<br />
自 分 一 人 の 環 境 のテスト・ネットなので、 採 掘 者 は 自 分 のEOAのアドレス(eth.coinbaseで<br />
得 られるアドレス)が 採 掘 者 として 記 録 されているはずです。<br />
number はそのブロックのブロック 高 を 示 しています。( 今 回 はブロック 高 を 指 定 して 情 報<br />
を 表 示 しているので、 指 定 したブロック 高 と 同 一 の 値 が 表 示 されているはずです。<br />
hash はそのブロックのブロック・ヘッダ・ハッシュを 表 示 しています。ブロック・ヘッダ<br />
情 報 をSHA-3アルゴリズム 適 用 して 得 られた32-byteのハッシュ 値 です。この hash はブ<br />
ロックを 指 し 示 すユニークなIDとして 利 用 されます。ここで、 hash は、 当 該 ブロックの<br />
データ 構 造 の 中 に 含 まれないことに 注 意 してください。 hash を 知 る 必 要 がある 場 合 には 各<br />
自 がブロック・ヘッダのデータを 元 に 計 算 することになります。<br />
parentHash は、 親 ブロックのブロック・ヘッダ・ハッシュを 示 しています。parentHashは<br />
ブロック・ヘッダのデータ 構 造 の 中 に 含 まれており、つまりは、 子 ブロックから 親 ブロッ<br />
クを 参 照 していることになります。このような 参 照 の 連 鎖 が 連 なることでブロックの<br />
チェーン「ブロックチェーン」が 形 成 されていることになります( 下 図 参 照 )。<br />
報 酬 の 確 認<br />
採 掘 者 が、 自 身 の 持 つ 計 算 資 源 を 費 やして 採 掘 を 行 うインセンティブは、Ethereumの 内 部<br />
通 貨 であるetherを 報 酬 として 得 られることにあります。 実 際 に 採 掘 をしたことによりether<br />
が 得 られているかを 確 認 してみましょう。<br />
各 アカウントのetherの 持 ち 高 を 参 照 するには eth.getBalance(address) コマンドを 用 いま<br />
す。 持 ち 高 を 確 認 したいアカウントのアドレスをaddressパラメータに 引 き 渡 すことで 確 認<br />
が 可 能 です。 先 の 手 順 で、2つのアカウントを 作 成 していました。それぞれのetherの 持 ち<br />
高 を 確 認 してみましょう。<br />
> eth.accounts // 作 成 したアカウントのアドレスを 再 確 認<br />
['0x24afe6c0c64821349bc1bfa73110512b33fa18e1', '0x59c444d6c4f4187d1dd1875ad74a558a2a3e20b6' ]<br />
><br />
> eth.coinbase == eth.accounts[0] //etherbaseは0 番 目 のアカウントに 紐 づいている。<br />
true<br />
> eth.getBalance(eth.accounts[0])<br />
'51500000000000000000'<br />
> eth.getBalance(eth.accounts[1])<br />
'0'<br />
etherを 採 掘 してみる<br />
26
Ethereum 入 門<br />
先 に 解 説 したとおり、coinbaseに 紐 づいたアカウントに 採 掘 の 報 酬 が 与 えられているのが<br />
わかります。 eth.getBalance(address) は「wei」の 単 位 4 で 持 ち 高 が 表 示 されます。 以 下 の<br />
変 換 用 のコマンドを 使 うことでetherの 単 位 で 表 示 することも 可 能 です。<br />
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")<br />
'515'<br />
脚 注<br />
1 ビットコインから 踏 襲 されたcoinbaseという 名 称 からEthereumに 固 有 のetherbaseという<br />
名 称 にしていく 議 論 がなされていますが、 完 全 には 統 一 されていないのが 実 情 です。<br />
2 採 掘 を 高 速 化 するために、 自 身 のノードの 環 境 に 応 じてこの 値 を 変 えてチューニングを 行<br />
うことが 可 能 です。 環 境 のメモリ 量 やCPUコア 数 に 依 存 し 最 適 な 値 は 環 境 により 異 なりま<br />
す。<br />
3 環 境 によって 採 掘 の 速 度 は 異 なります。 最 初 の 採 掘 開 始 後 は、 最 初 の10 分 〜30 分 の 間 、<br />
DAGの 生 成 (「Ethereumの 内 部 」の 章 を 参 照 )が 行 われ、その 間 はブロックは 採 掘 されま<br />
せん。DAGの 生 成 が 完 了 次 第 、ブロックの 採 掘 が 自 動 的 に 開 始 されます。<br />
4 1 ether $$=$$ 10 18 wei<br />
etherを 採 掘 してみる<br />
27
Ethereum 入 門<br />
etherを 送 金 してみる<br />
先 の 節 で、 採 掘 の 報 酬 としてEthereumの 内 部 通 貨 であるetherを 取 得 することができました<br />
1 。この 節 では、 採 掘 で 得 たetherを 他 のEOAへ 送 金 する 方 法 と、その 際 に 発 生 するトラン<br />
ザクションとその 手 数 料 について 見 ていきます。<br />
etherの 送 金<br />
まず 最 初 にもう 一 度 、 今 回 作 成 したアカウントのetherの 持 ち 高 を 確 認 しておきましょう。<br />
> eth.accounts // 登 録 されている2つのアカウントを 表 示 。<br />
['0x24afe6c0c64821349bc1bfa73110512b33fa18e1', '0x59c444d6c4f4187d1dd1875ad74a558a2a3e20b6' ]<br />
> eth.getBalance(eth.accounts[0]) // etherbaseである1 番 目 のアカウントにetherの 持 ち 高 がある( 採 掘 の 報 酬 )。<br />
'72500000000000000000'<br />
> eth.getBalance(eth.accounts[1]) // 2 番 目 のアカウントにはetherの 持 ち 高 はない。<br />
'0'<br />
accounts[0] のEOAは、725 ether を 保 有 している 一 方 で、もう 一 方 の accounts[1] のEOA<br />
はetherを 保 有 していないのがわかります。<br />
この 状 態 で accounts[0] から、 accounts[1] へ、5 ether を 送 金 します。 送 金 は 以 下 のコマ<br />
ンドを 用 います。ここで from に 送 金 元 アドレス、 to に 宛 先 アドレス、 value に 送 金 額 を<br />
指 定 します。なお、 送 金 時 に 送 金 元 のアカウントのパスワードが 求 められるので 指 示 に<br />
従 って 入 力 します。<br />
> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")}) //<br />
Please unlock account 24afe6c0c64821349bc1bfa73110512b33fa18e1.<br />
Passphrase:<br />
Account is now unlocked for this session.<br />
'0xc86c2a5bdf651f54095eca87e487d4f68f12030dd559f0377e9e7bf1566b9b28'<br />
送 金 額 はweiの 単 位 での 指 定 のため、 単 位 変 換 関 数 であるweb.toWeiを 用 いています。この<br />
コマンドを 実 行 すると、 実 行 結 果 としてトランザクションIDが 返 されます。コマンド 実 行<br />
後 、しばらくして 送 金 先 のether 保 有 額 を 確 認 すると、 下 記 のように、 問 題 なく5 ether<br />
($$=$$ 5 × 10 18 wei) が 送 金 されていることが 分 かります。<br />
> eth.getBalance(eth.accounts[1])<br />
'5000000000000000000'<br />
etherを 送 金 してみる<br />
28
Ethereum 入 門<br />
【 注 意 】 送 金 の 際 は、 採 掘 処 理 をバックグラウンドで 実 行 しておく 必 要 があります。 今 回<br />
の 例 ではテスト・ネットでの 送 金 であり、 採 掘 者 は 自 分 自 身 しかいないため、 自 身 が 採 掘<br />
を 実 行 中 でないとトランザクションが 処 理 されません。<br />
トランザクション 手 数 料<br />
同 じように 今 度 は 逆 に、'0x59c44...'のアカウントから、'0x24afe...'に 3 ether 送 金 してみま<br />
しょう。<br />
> eth.getBalance(eth.accounts[1]),"ether" // 保 有 額 を 確 認 。 最 初 に 送 金 された 5 ether を 保 有 している。<br />
'5000000000000000000'<br />
><br />
> eth.sendTransaction({from: eth.accounts[1], to: eth.accounts[0], value: web3.toWei(3, "ether")}) //<br />
'0x5fd0bdcccb379a8b4034668464ad9a499a8a6b7801ed66ac23e4df3d67ec64a5'<br />
><br />
> eth.getBalance(eth.accounts[1]) // 送 金 後 の 保 有 額 を 確 認 。 5 - 3 = 2 ether のはずが・・・・<br />
'1998825500779091000'<br />
5 ether 保 有 していた 状 態 から、3 ether 送 金 したため、'0x59c44...' のアカウントの ether 保<br />
有 額 は 2 ether と 予 想 されるのですが、 実 際 には 2 ether よりも 小 さい 額 になっています。<br />
実 は、この 送 金 額 以 上 に 引 かれた 差 額 分 (1,174,499,220,909,000 wei)がトランザクション<br />
を 生 成 した 際 に 採 掘 者 に 対 して 支 払 うトランザクション 手 数 料 となっており、 採 掘 者 の 報<br />
酬 に 加 えられます。<br />
トランザクション 情 報 を 調 べる。<br />
ここで、トランザクションについてもう 少 し 詳 しく 調 べてみましょう。トランザクション<br />
の 情 報 は eth.getTransaction(tx_id) コマンドで 調 べることができます。 先 ほど 行 っ<br />
た accounts[1] のアドレスから 3 ether 送 金 した 際 のトランザクションの 情 報 を 見 てみま<br />
す。パラメーター、 tx_id には、 送 金 実 行 時 に 返 されたトランザクションIDを 指 定 しま<br />
す。<br />
etherを 送 金 してみる<br />
29
Ethereum 入 門<br />
> eth.getTransaction('0x5fd0bdcccb379a8b4034668464ad9a499a8a6b7801ed66ac23e4df3d67ec64a5')<br />
{<br />
blockHash: '0xeef0f74bc51ecb9f3d64099fa4f3c1651af36a632380d41dd987e8e7064a5276',<br />
blockNumber: 11076,<br />
from: '0x868d840e872df5134a3be6f7b68e52cb680fe3ac',<br />
gas: 90000,<br />
gasPrice: '55928534329',<br />
hash: '0x5fd0bdcccb379a8b4034668464ad9a499a8a6b7801ed66ac23e4df3d67ec64a5',<br />
input: '0x',<br />
nonce: 0,<br />
to: '0x2efbdc840746c862b63077643e5b7dd8bebb8448',<br />
transactionIndex: 0,<br />
value: '3000000000000000000'<br />
}<br />
主 な 項 目 について 簡 単 に 見 ていきましょう。<br />
blockHash & blockNumber :このトランザクションを 含 んだブロックのヘッダ・ハッ<br />
シュとブロック 高 を 示 しています。まだこのトランザクションを 含 んだブロックが 採<br />
掘 されていないときには、これらのフィールドは 空 の 状 態 で 表 示 されます。<br />
gas :トランザクションの 処 理 時 のgasの 使 用 量 の「 最 大 値 」を 示 しています。( 実 際<br />
のトランザクション 処 理 時 のgasの 使 用 量 ではないので、 注 意 してください。 実 際 にト<br />
ランザクション 処 理 時 に 使 用 されたgasの 量 を 知 る 方 法 は 下 記 のTIPを 参 照 くださ<br />
い。)<br />
gasPrice :トランザクションの 処 理 時 に 採 掘 者 に 支 払 う1 gas 当 たりの 手 数 料 (wei)<br />
を 示 しています。<br />
from & to & value :それぞれ、トランザクションにより 送 金 する 送 金 元 、 宛 先 、<br />
送 金 額 (wei)を 示 しています。<br />
TIP<br />
上 記 のようにトランザクション 情 報 で 表 示 される gas の 量 はは、トランザクションの 処 理<br />
時 に 許 容 する「 最 大 」gas 使 用 量 を 示 していました。では、 実 際 に 今 回 のトランザクション<br />
にどれだけののgasを 使 用 したのかを 知 るためにはどうしたらよいのでしょうか? 今 回 のト<br />
ランザクションの 手 数 料 は 先 に 書 いたとおり、1,174,499,220,909,000 wei でした。またト<br />
ランザクションの 情 報 から1 gas 当 たりの 手 数 料 gasPrice は 55,928,534,329 wei と 分 かる<br />
ので、 実 際 に 今 回 のトランザクションで 使 用 したgasの 量 は、(1,174,499,220,909,000 /<br />
55,928,534,329) $$=$$ 21,000 となり、 21,000 gas が 使 用 されたことがわかります。<br />
脚 注<br />
1 テスト・ネット 上 での 採 掘 のため、Ethereumの 本 番 ネットワークであるライブ・ネット<br />
上 では 利 用 できませんのでご 注 意 ください。<br />
etherを 送 金 してみる<br />
30
Ethereum 入 門<br />
Contractを 作 成 してみる<br />
Ethereumは、 分 散 アプリケーション・プラットフォームです。Ethereumにおいて 分 散 アプ<br />
リケーションは、 単 一 のContract、または 複 数 のContractが 連 携 して 実 現 されるものとなっ<br />
ています。この 章 では 最 も 単 純 なContractを 作 成 し、それを 動 作 させる 手 順 を 追 うことで、<br />
Contractとは 何 か、どのようにContractを 作 成 しデプロイするのか、そしてどのように<br />
Contractを 利 用 するのかを 見 ていきます。<br />
Contractとは<br />
先 に 述 べたように、Ethereumには2つのタイプのアカウントが 存 在 します。<br />
一 つはEOA(Externally Owned Account)です。 我 々ユーザーがそのアカウントを 作 成 し、<br />
任 意 のタイミングでそのアカウントを 通 じてEthereumネットワークとのやり 取 りを 行 うも<br />
のです。<br />
そしてもう 一 つがContractです。JavaやPythonなどオブジェクト 指 向 言 語 になじみがある<br />
人 であればContractは、オブジェクト 指 向 言 語 での「クラス」に 似 たものと 考 えるとイメー<br />
ジがつかみやすいかもしれません。それぞれのContractは、 各 自 にクラス 変 数 に 相 当 するよ<br />
うな、 内 部 状 態 を 保 持 するストレージ 部 分 と、メソッドに 相 当 するような、 実 行 コードで<br />
ある「コントラクト・コード」を 持 っています。<br />
「etherを 送 金 してみる」 節 で 見 たように、EOAが、 他 のEOAのアドレスを 宛 先 としたトラ<br />
ンザクションを 生 成 することで、 他 のEOAに 対 してetherを 送 金 することができました。 同<br />
様 にEOAがContractのアドレスを 宛 先 とするトランザクションを 生 成 することも 可 能 です。<br />
この 場 合 、EOAを 宛 先 とした 場 合 と 同 様 にContractへのetherの 送 金 も 可 能 ですが、 同 時 に<br />
コントラクト・コードの 実 行 を 指 示 することが 可 能 です。<br />
コントラクト・コードに 様 々な 動 作 をプログラムすることで、そのContractにより 名 前 管 理<br />
やトークン 管 理 のようなアプリケーションが 実 現 できます。コントラクト・コードの 実 行<br />
は 採 掘 者 によって 行 われ、 実 行 結 果 は 公 開 元 帳 であるブロックチェーンに 書 き 込 まれてい<br />
き、 特 定 の 中 央 機 関 なくアプリケーションが 動 作 していきます。<br />
Solidity<br />
コントラクト・コードは、Ethereumネットワーク 上 では「Ethereum Virtual Machine<br />
Code」または 略 して「EVM Code」と 呼 ばれる、バイトコードの 形 式 で 記 述 され 処 理 され<br />
ます。 このようなバイトコードの 形 式 は 低 水 準 の 機 械 言 語 であって、 人 間 にとっては 可 読<br />
性 が 悪 く、また 開 発 の 生 産 性 も 悪 いものとなっています。<br />
Contractを 作 成 してみる<br />
31
Ethereum 入 門<br />
そこでEthereumでは、 可 読 性 と 生 産 性 が 高 く、コントラクト・コードを 記 述 することに 特<br />
化 した 高 水 準 言 語 と、それを EVM Code に 翻 訳 するためのコンパイラが 幾 つか 開 発 されて<br />
います。<br />
その 代 表 的 なものとして「Solidity」が 挙 げられます。Solidityは Java Script に 似 た 構 文 を<br />
もつ 言 語 です。<br />
ここでは、ContractをこのSolidityを 使 って 開 発 していくものとして、まずは、Solidityのコ<br />
ンパイラである「solc」を 準 備 しましょう。<br />
Solidityコンパイラ(solc)の 導 入<br />
まずは、Gethにsolcが 導 入 されているかを 確 認 するために、Gethのコンソール 上 で、Geth<br />
にリンクされているコンパイラのリストを 表 示 する eth.getCompilers() コマンドを 実 行 し<br />
てみましょう。 solc 等 のコンパイラがリンクされていない 場 合 は、 以 下 のような 結 果 にな<br />
ります。(Solcがリンクされていると 結 果 に ['Solidity' ] と 表 示 されます。)<br />
> eth.getCompilers()<br />
['' ]<br />
solcのインストール<br />
Gethにsolcが 導 入 されていないことが 分 かれば、まずはシステムへsolcのインストールを 行<br />
います。solcのインストールは、Gethのコンソールから 抜 けてそれぞれのプラットフォー<br />
ム(OS)のコンソール 上 で 行 います。<br />
Ubuntuへのインストール<br />
以 下 のコマンドを 実 行 してください。<br />
$ sudo add-apt-repository ppa:ethereum/ethereum<br />
$ sudo apt-get update<br />
$ sudo apt-get install solc<br />
以 下 のコマンドでsolcのバージョン 情 報 が 表 示 されれば 問 題 なくインストールされていま<br />
す。<br />
$ solc --version<br />
また、 以 下 のコマンドを 実 行 し、その 結 果 に 表 示 されるsolcへのパスをメモしておいてくだ<br />
さい。Gethとsolcをリンクさせるために 後 ほど 利 用 します。<br />
Contractを 作 成 してみる<br />
32
Ethereum 入 門<br />
$ which solc<br />
Mac OS Xへのインストール<br />
以 下 のコマンドを 実 行 し、cpp-ethereumをインストールしてください 1 。Mac OS Xへのイ<br />
ンストールには、Homebrew が 事 前 にインストールされている 必 要 があります。<br />
$ brew install cpp-ethereum<br />
$ brew linkapps cpp-ethereum<br />
以 下 のコマンドでsolcのバージョン 情 報 が 表 示 されれば 問 題 なくインストールされていま<br />
す。<br />
$ solc --version<br />
また、 以 下 のコマンドを 実 行 し、その 結 果 に 表 示 されるsolcへのパスをメモしておいてくだ<br />
さい。Gethとsolcをリンクさせるために 後 ほど 利 用 します。<br />
$ which solc<br />
Windowsへのインストール<br />
このページの 手 順 を 参 考 にcpp-ethereumをインストールしてください。<br />
Gethへsolcをリンクする<br />
solcのシステムのインストールが 完 了 したら、 次 にGethとsolcのリンクを 行 います。これに<br />
より、Gethから 直 接 solcによるコンパイルを 行 うことが 可 能 になります。<br />
Gethのコンソールを 開 き 2 、 以 下 のコマンドを 実 行 します。ここでパラメーターの<br />
「path_to_your_solc」の 部 分 は 各 人 のsolcインストール 時 の which コマンドの 実 行 結 果 に<br />
書 き 換 えてください。<br />
> admin.setSolc("path_to_your_solc")<br />
以 下 にUbuntu 環 境 での 実 行 結 果 を 表 示 します。<br />
> admin.setSolc("/usr/bin/solc")<br />
'solc v0.1.1<br />
Solidity Compiler: /usr/bin/solc<br />
'<br />
Contractを 作 成 してみる<br />
33
Ethereum 入 門<br />
確 認 として、Gethにリンクされているコンパイラのリストを 表 示 してみましょう。 下 記 の<br />
ようにSolidityが 表 示 されれば、 正 しくリンクされています。<br />
> eth.getCompilers()<br />
['Solidity' ]<br />
Contractの 作 成 から 利 用 までの 流 れ<br />
コンパイラの 導 入 が 完 了 し、 最 初 のContractを 作 成 する 準 備 が 整 いました。Contractを 作 成<br />
し、それにアクセスして 利 用 するまでの 流 れは 次 のようになります。<br />
1. Contractの 作 成<br />
Solidity 言 語 でコントラクト・コードをプログラミングする。そしてプログラムし<br />
たコントラクト・コードを、solcを 使 ってコードをコンパイルする。<br />
2. Contractのブロックチェーンへの 登 録<br />
コンパイル 結 果 を 用 いて、Contract を 生 成 するトランザクションをEthereumネッ<br />
トワークに 送 信 する。そのトランザクションを 受 信 した 採 掘 者 は、トランザク<br />
ションをブロックチェーンに 登 録 する(=Contractをブロックチェーンに 登 録 す<br />
る)。この 時 Contractのアドレスが 発 行 される。<br />
3. Contractへアクセス<br />
i. Contractを 利 用 するユーザーは、Contract 作 成 者 からContractへのアクセス 情 報 の<br />
取 得 する。その 情 報 をもとにContractへアクセスし、コントラクト・コードの 実 行<br />
等 を 行 う。<br />
以 上 の 手 順 を、 最 も 単 純 なContractを 用 いて 実 際 に 行 って 行 きましょう。<br />
Contractの 作 成<br />
最 も 単 純 なContract(OneNumRegister)<br />
最 初 のContractとして1つの 整 数 値 を 登 録 ・ 管 理 するContractを 作 成 してみましょう。ある<br />
利 用 者 が「3」を 登 録 すると、 他 の 利 用 者 が 登 録 情 報 を 参 照 した 時 には「3」が 表 示 され、<br />
また 別 の 利 用 者 がその 整 数 値 を「10」と 更 新 すれば、 他 の 利 用 者 が 登 録 情 報 を 参 照 した 時<br />
には 新 しい 登 録 内 容 の「10」が 表 示 されるものです 3 。<br />
非 常 にシンプルな 機 能 ですが、このようなものも 以 前 までは 何 らかの 登 録 情 報 を 管 理 する<br />
中 央 機 関 やシステムが 必 要 でした。Ethereumはこのように 従 来 ではデータの 整 合 性 を 保 つ<br />
ために 中 央 管 理 が 必 要 だったアプリケーションをP2Pのシステムで 行 う 事 を 可 能 にするので<br />
す。<br />
Contractのコード<br />
Contractを 作 成 してみる<br />
34
Ethereum 入 門<br />
さて、 上 記 のようなContract(SingleNumRegisterと 名 付 けます)は、Solidity 言 語 を 使 って<br />
記 述 すると 以 下 のコードになります。<br />
contract SingleNumRegister {<br />
uint storedData;<br />
function set(uint x) {<br />
storedData = x;<br />
}<br />
function get() constant returns (uint retVal) {<br />
return storedData;<br />
}<br />
}<br />
Solidityの 言 語 仕 様 の 詳 細 は 後 の「コントラクト・プログラミング 言 語 :Solidity」の 章 で 解<br />
説 します。そのため、 今 ここで、このコードの 意 味 を 全 て 把 握 する 必 要 はありません。し<br />
かしコードを 眺 めると 大 きく 以 下 の 特 徴 があることが 見 て 取 れると 思 います。<br />
Contractの 名 前 はcontractの 宣 言 で 規 定 されること。<br />
storedDataというuint 型 の 変 数 が 定 義 されており、この 変 数 に 登 録 数 値 が 格 納 されるこ<br />
と。<br />
setとgetの2つの 関 数 が 定 義 されていること。<br />
setという 名 前 の 関 数 は、 引 き 渡 されたパラメータの 内 容 で、storedData 変 数 が 更<br />
新 すること。<br />
getという 名 前 の 関 数 は、 登 録 されているstoredData 変 数 の 内 容 を 返 却 すること。<br />
solcによるコンパイル<br />
Gethコンソール 上 で 以 下 のコマンドを 実 行 し 上 記 のソースコードをsolcでコンパイルしま<br />
す。source 変 数 に 入 れる 文 字 列 は 上 記 のソースコードから 改 行 を 抜 いた 文 字 列 を 代 入 しま<br />
す 4 。<br />
> var source = "contract SingleNumRegister { uint storedData; function set(uint x) { storedData = x;<br />
> var sourceCompiled = eth.compile.solidity(source)//ソースファイルをコンパイル<br />
これで、sourceCompiledという 変 数 にコンパイル 済 みのContract 情 報 が 格 納 されました。<br />
Contractのブロックチェーンへの 登 録<br />
コントラクト・コードのコンパイルは 完 了 しましたが、コンパイルしたコードはContract 作<br />
成 者 のノード 上 にあるだけで、まだEthereumネットワーク 内 の 誰 もこのContractにアクセ<br />
スできません。このコンパイル 済 みコードをEthereumネットワークに 送 信 し、 採 掘 者 に<br />
よってブロックチェーンに 登 録 してもらって 初 めて 他 のユーザーがこのContractにアクセス<br />
出 来 るようになります。<br />
Contractを 作 成 してみる<br />
35
Ethereum 入 門<br />
EOAからトランザクションを 生 成 し 送 信 することで、 作 成 したContractをEthereumネット<br />
ワークに 送 信 できます。 先 ほどのコンパイルのコマンドに 続 いて、 以 下 のコマンドを 実 行<br />
します。<br />
> var contractAbiDefinition = sourceCompiled.SingleNumRegister.info.abiDefinition<br />
> var sourceCompiledContract = eth.contract(contractAbiDefinition)<br />
> var contract = sourceCompiledContract.new({from:eth.accounts[0], data: sourceCompiled.SingleNumRegi<br />
詳 細 は「コントラクト・プログラミング 言 語 :Solidity」の 章 で 解 説 しますが、 上 記 のコマ<br />
ンドの1 行 目 でContractのオブジェクトを 生 成 し、2 行 目 で、そのオブジェクト 情 報 を 含 んだ<br />
トランザクションをEthereumネットワークに 送 信 しています。<br />
採 掘 者 はこのトランザクションを 受 信 し、このContractを 登 録 したブロックの 採 掘 を 行 いま<br />
す。その 際 にContractのアドレスが 付 加 されます。アドレスは、 上 記 でトランザクションを<br />
送 信 した 際 の 戻 り 値 を 格 納 した 変 数 contract に 格 納 さます。<br />
採 掘 者 が 採 掘 を 終 える 前 の contract の 内 容 を 表 示 してみると、<br />
> contract<br />
{<br />
address: undefined,<br />
transactionHash: '0xeb76caefdfe5a9aa10b11743d317cf15f881d3b2e52ba3251dcf8e0718ed5b33'<br />
}<br />
のように、contractのアドレスが 未 定 になっています。ここで、transactionHashは 今 回 のト<br />
ランザクションのIDです。しばらくして 採 掘 が 成 功 すると、<br />
> contract<br />
{<br />
address: '0x8ea277dfe4195daf7b8c101d79da35d1eb4c4aeb',<br />
transactionHash: '0xeb76caefdfe5a9aa10b11743d317cf15f881d3b2e52ba3251dcf8e0718ed5b33',<br />
allEvents: function (),<br />
get: function (),<br />
set: function ()<br />
}<br />
のように、contractのアドレス( '0x8ea277dfe4195daf7b8c101d79da35d1eb4c4aeb' )が 付 加 さ<br />
れています。これで、 作 成 したContractがEthereumネットワーク 上 にアドレ<br />
ス '0x8ea277dfe4195daf7b8c101d79da35d1eb4c4aeb' のContractとして 登 録 されたことになりま<br />
す。<br />
Contractにアクセス<br />
Contractを 作 成 してみる<br />
36
Ethereum 入 門<br />
登 録 されたContractにアクセスしてみましょう。 今 回 作 成 したContractは 1つの 整 数 値 を 任<br />
意 のユーザーが 登 録 ・ 更 新 できるものでした。 作 成 者 であるあなたは、このContractを 他 の<br />
ユーザーにも 利 用 してもらいたいと 考 えたとき、どのようにすればよいのでしょうか。<br />
他 のユーザーに 自 身 の 作 成 したContractを 利 用 してもらうためには、 以 下 の2 種 類 の 情 報 を<br />
他 のユーザーに 伝 える 必 要 があります。<br />
Contractのアドレス:<br />
ContractにアクセスするためにそのContractのアドレスが 必 要 となります。 今 回 のContract<br />
では'0x8ea277dfe4195daf7b8c101d79da35d1eb4c4aeb'が 付 加 されていました。<br />
ContractのABI (Application Binary Interface) :<br />
ABIとはContractの 取 り 扱 い 説 明 書 のようなものです。 例 えば、このContractがどのような<br />
名 前 の 関 数 が 定 義 されているか、それぞれの 関 数 にアクセスするために、どのような 型 の<br />
パラメータを 渡 す 必 要 があるか、 関 数 の 実 行 結 果 はどのような 型 のデータが 返 るか、など<br />
の 情 報 が 含 まれたものです。 今 回 のContractでは、Contract 登 録 時<br />
に contractAbiDefinition の 変 数 に 格 納 した 情 報 です。 実 際 にcontractAbiDefinitionの 内 容 を<br />
表 示 してみると 以 下 のとおりです 5 。Contract 内 に 定 義 された 関 数 の 引 数 や 戻 り 値 などの 情<br />
報 が 記 述 されているのが 見 て 取 れます。<br />
> contractAbiDefinition<br />
[{<br />
constant: false,<br />
inputs: [{name: 'x', type: 'uint256'}],<br />
name: 'set',<br />
outputs: [ ],<br />
type: 'function'<br />
}, {<br />
constant: true,<br />
inputs: [ ],<br />
name: 'get',<br />
outputs: [{name: 'retVal', type: 'uint256'} ],<br />
type: 'function'<br />
} ]<br />
この、ContractのアドレスとABIの2つの 情 報 があれば、 他 のユーザーは、あなたの 作 った<br />
Contractにアクセスができます。Contractへアクセスするオブジェクトは 以 下 の 書 式 で 生 成<br />
できます。<br />
eth.contract(ABI_DEF).at(ADDRESS);<br />
ここで、 ABI_DEF 、 ADDRESS を 今 回 のContractのものに 置 きかえ、 変 数 cnt に 代 入 しま<br />
す。ABIは 改 行 を 取 り 除 いたものを 入 れます。<br />
Contractを 作 成 してみる<br />
37
Ethereum 入 門<br />
var cnt = eth.contract([{ constant: false, inputs: [{ name: 'x', type: 'uint256' } ], name: 'set', ou<br />
このオブジェクト cnt を 用 いてContractにアクセスをします。Contractの 状 態 を 変 更 する 場<br />
合 、つまり 今 回 のContractでset 関 数 でContractに 登 録 された 整 数 値 を 変 更 する 場 合 は、トラ<br />
ンザクションを 生 成 することでアクセスします。このトランザクションは 採 掘 者 によりブ<br />
ロックチェーンに 登 録 されることで、トランザクションの 発 生 と、それによるContractの 状<br />
態 の 変 化 についてEthereumネットワーク 内 で 合 意 形 成 されることになります。<br />
Contractの 登 録 値 を「6」に 変 更 するトランザクションは 以 下 のコマンドで 送 信 できます。<br />
ここで set はコントラクト・コード 内 で 定 義 した 登 録 値 を 更 新 する 関 数 の 関 数 名 です。こ<br />
のコマンドを 実 行 した 際 の 戻 り 値 はトランザクションIDです。<br />
> cnt.set.sendTransaction(6,{from:eth.accounts[0]})<br />
'0x979c4e413a647673632d74a6c8b7f5b25a3260f3fefa4abea2dc265d61215939'<br />
このトランザクションとその 結 果 の 状 態 が 採 掘 者 によりブロックチェーンに 登 録 される<br />
と、Contractの 登 録 整 数 値 は「6」に 更 新 されます。<br />
では、このContractに 登 録 されている 最 新 の 登 録 整 数 値 を 参 照 する 場 合 はどうすればよいで<br />
しょうか?Contractの 状 態 を 参 照 する 際 は、 状 態 を 変 更 しそれをEthereumネットワーク 内<br />
で 同 意 を 形 成 する 必 要 はないため、トランザクションを 送 信 する 必 要 はありません。 下 記<br />
のように 参 照 の 関 数 ( 今 回 は get )を 単 純 に 呼 び 出 すことで 参 照 が 可 能 です。<br />
> cnt.get()<br />
'6'<br />
ここまで、Ethereumで 行 う「 採 掘 」「 送 金 」「Contractの 生 成 と 利 用 」についての 大 まか<br />
な 手 順 を 見 てきました。これまでは 自 分 個 人 だけが 参 加 するテスト・ネットでこれらの 機<br />
能 を 確 認 してきました。 次 の 節 では、 多 数 の 参 加 者 が 参 加 している、 本 番 のEthereumネッ<br />
トワーク(ライブ・ネット)に 接 続 して 行 きます。<br />
脚 注<br />
1 cpp-ethereumはC++で 実 装 されたEthereumのフル・クライアントであり、その 一 部 に<br />
solcが 含 まれています。<br />
2 コマンドは「テスト・ネットに 接 続 してみる」 節 を 参 照 してください。<br />
3 あまり 役 に 立 たないコントラクトですが・・・<br />
4 javascriptの 文 字 列 変 数 に 格 納 するための 制 限 に 起 因 するものです。<br />
Contractを 作 成 してみる<br />
38
Ethereum 入 門<br />
5 表 示 の 都 合 上 、 一 部 整 形 しています。<br />
Contractを 作 成 してみる<br />
39
Ethereum 入 門<br />
ライブ・ネットに 接 続 してみる<br />
2015 年 7 月 30 日 にFrontierがリリースされ、Ethereumは 本 番 ネットワーク(ライブ・ネッ<br />
ト)の 運 用 が 開 始 されました。このライブ・ネットで、 今 後 Ethereumのブロックチェーン<br />
等 のインフラを 利 用 した 様 々な 分 散 アプリケーションが 開 発 され、 様 々なサービス 生 まれ<br />
ていくことになります。<br />
本 書 ではここまで、 個 人 用 のテスト 用 のネットワーク(テスト・ネット)に 繋 いで、Geth<br />
クライアントを 実 際 に 操 作 しながらEthereumの 概 観 を 説 明 してきました。この 節 では 実 際<br />
にライブ・ネットに 接 続 していきます。<br />
ライブ・ネットへの 接 続<br />
ライブ・ネットに 接 続 する 際 のデータ 用 ディレクトリを 事 前 に 用 意 しておきます。<br />
$ mkdir /home/test_u/livenet_data<br />
以 下 のコマンドを 実 行 してライブ・ネットに 接 続 します。<br />
$ geth --datadir "/home/test_u/livenet_data" --logfile "/home/test_u/livenet_data/geth_01.log"<br />
テスト・ネットに 接 続 した 際 のコマンドとの 違 いは、 --networkid "10" と --olympic のオ<br />
プションを 付 加 していないことになります。<br />
接 続 状 況 を 確 認 する<br />
ライブ・ネットへ 接 続 すると、Ethereumネットワーク 内 の 他 のノードと 接 続 されます。<br />
Gethのコンソールを 立 上 げ net.peerCount コマンドを 実 行 すると、 自 分 のノードが 他 のいく<br />
つのノードと 接 続 されているかを 表 示 することが 出 来 ます。<br />
> net.peerCount<br />
25<br />
また、 実 際 に 接 続 されているノードの 情 報 は admin.peers のコマンドで 確 認 することが 出 来<br />
ます。<br />
ライブ・ネットに 接 続 してみる<br />
40
Ethereum 入 門<br />
> admin.peers<br />
[{<br />
Caps: 'eth/60, eth/61',<br />
ID: '99017abe7031b48a855b8e79fecb6c927cda88229354f21184d343941ae78ee261d0ccb9f9999f620f96bd729b2cb7<br />
LocalAddress: '160.16.80.199:34057',<br />
Name: 'Geth/v1.0.2/linux/go1.4.2',<br />
RemoteAddress: '192.169.7.150:30303'<br />
},<br />
( 中 略 )<br />
{<br />
Caps: 'eth/60, eth/61',<br />
ID: '6f8c6cc4a878ed88e03c7a0ee01386e095fbc1bfd48352c7bec05142cc60795317b5b8c5e9afc9863a414541df4d5b<br />
LocalAddress: '160.16.80.199:41617',<br />
Name: 'Geth/v1.0.2/linux/go1.4.2',<br />
RemoteAddress: '83.77.31.183:30303'<br />
} ]<br />
><br />
ライブ・ネットに 接 続 してみる<br />
41
Ethereum 入 門<br />
コントラクト・プログラミング 言 語 :<br />
Solidity<br />
前 章 までで 述 べてきたとおり、 分 散 アプリケーションやスマート・コントラクトは、ブ<br />
ロックチェーン 上 に 記 録 される、コントラクト・コードが 実 行 されることによって 動 作 し<br />
ます。 Ethereumネットワーク 上 では、このコントラクト・コードは「Ethereum Virtual<br />
Machine Code」または 略 して「EVM Code」と 呼 ばれる、バイトコードの 形 式 で 記 述 され<br />
処 理 されます。 このようなバイトコードの 形 式 は 低 水 準 の 機 械 言 語 であって、 人 間 にとっ<br />
ては 可 読 性 が 悪 く 開 発 の 生 産 性 も 悪 いものとなっています。そこでEthereumでは、 可 読 性<br />
と 生 産 性 が 高 く、コントラクトを 記 述 することに 特 化 した 高 水 準 言 語 と、それを EVM<br />
Code に 翻 訳 するためのコンパイラが 幾 つか 開 発 されています。その 代 表 的 なものとして<br />
「Solidity」が 挙 げられます。 ここでは、このプログラミング 言 語 「Solidity」について 解 説<br />
していきます。<br />
コントラクト・プログラミング 言 語 :Solidity<br />
42
Ethereum 入 門<br />
基 本 的 な 記 法<br />
Hello world<br />
下 記 にSolidityで 記 述 された 最 も 単 純 なスマート・コントラクトのコードの 例 (HelloWorld)<br />
を 示 します。<br />
// Simple contract that returns constant string "Hello World"<br />
contract HelloWorld {<br />
function get() constant returns (string retVal) {<br />
return "Hello World!!";<br />
}<br />
}<br />
このContractは、 get() 関 数 が 呼 び 出 されたら 固 定 の"Hello World!!"という 固 定 の 文 字 列 を<br />
返 すというものです。<br />
Contract<br />
上 記 のようにSolidityにおいて contract 句 で 宣 言 されるContractが 基 本 の 構 成 要 素 であり、<br />
スマート・コントラクトは、この contract 句 に 処 理 を 記 述 していくことで 実 装 されます。<br />
Solidityでは 次 の 構 文 でContractを 定 義 します。<br />
contract Contract 名 {<br />
}<br />
//スマート・コントラクトで 行 う 処 理 をここに 記 述<br />
ここで「・・・・」の 部 分 にContractの 具 体 的 な 内 容 が 記 述 されます。ContractはJavaや<br />
Pythonなどオブジェクト 指 向 言 語 での「クラス」に 似 たものであり、クラス 変 数 に 相 当 す<br />
るような 内 部 状 態 を 保 持 するストレージ 部 分 やメソッドに 相 当 するような 関 数 、その 中 で<br />
有 効 なローカル 変 数 などを 持 ちます。<br />
HelloWorldの 例 では get() 関 数 が 定 義 され、その 中 では 文 字 列 Hello World を 返 す 処 理 が 定<br />
義 されていました。<br />
なお、1つのソースファイル 上 に 複 数 のContractを 定 義 することも 可 能 です。<br />
小 文 字 ・ 大 文 字 の 区 別<br />
基 本 的 な 記 法<br />
43
Ethereum 入 門<br />
Solidityでは、Contract 名 や 関 数 名 、 変 数 名 などは 大 文 字 と 小 文 字 が 区 別 されます。 例 えば<br />
上 述 のContractのHelloWorldは「helloworld」の 名 前 で 呼 ぶことはできません。<br />
「HelloWorld」と「helloworld」は 別 のものと 解 釈 されます。<br />
文 (Statement) 最 後 にはセミコロンをつける<br />
Solidityで 記 述 されたコードは 一 般 的 に1つ 以 上 の 文 (Statement)から 構 成 されます。 例 え<br />
ば 上 記 のコードの 例 では、 return "Hello World!!"; は1つの 文 であり、 最 後 にセミコロンが<br />
付 加 されています。<br />
コメント<br />
Solidityでは 他 のプログラミング 言 語 と 同 様 Solidityでも「コメント」を 付 加 することが 可 能<br />
です。コメントを 記 述 するには 以 下 の2つの 方 法 があります。<br />
「//」でのコメント<br />
単 一 行 のコメントを 記 述 する 際 に 用 います。「//」を 付 加 することで、その 後 の 部 分 がコメ<br />
ントとみなされます。<br />
「/* 〜 */」でのコメント<br />
複 数 でまたがるコメントを 記 述 する 際 に 用 います。 「/*」と「*/」で 囲 まれたブロックがコ<br />
メントとみなされます。<br />
基 本 的 な 記 法<br />
44
Ethereum 入 門<br />
変 数 とデータ 型<br />
変 数 の 宣 言<br />
Solidityは 静 的 型 付 け 言 語 であり、 変 数 を 定 義 する 際 にそこに 格 納 するデータ 型 を 明 示 する<br />
必 要 があります。 以 下 に 符 号 付 整 数 である int 型 の 変 数 x を 宣 言 する 例 を 示 します。<br />
int x;<br />
また 次 のように 宣 言 時 に 初 期 値 を 指 定 する 事 も 可 能 です。<br />
int x = 10;<br />
ちなみに 初 期 値 を 設 定 しない 場 合 には、 各 型 のデフォルト 値 が 格 納 されます。 例 え<br />
ば int の 場 合 、 0 が 格 納 されます。<br />
データ 型<br />
基 本 型 と 参 照 型<br />
先 に 記 したとおり、Solidityは 静 的 型 付 け 言 語 であり、 変 数 を 扱 う 際 にはその 変 数 のデータ<br />
型 を 強 く 意 識 する 必 要 があります。Solidityには 様 々なデータ 型 が 規 定 されていますが、そ<br />
れらは 大 きく 基 本 型 1 と 参 照 型 という2つのタイプに 分 類 されます。<br />
これらは 変 数 に 格 納 される 際 の 方 法 に 違 いがあります。まず 基 本 型 の 変 数 には、「 値 その<br />
もの」が 格 納 されます。 一 方 で 参 照 型 の 変 数 には「 値 を 格 納 しているメモリ 上 のアドレス<br />
( 参 照 )」が 格 納 されます。この 動 作 の 違 いにより 基 本 型 と 参 照 型 で 変 数 を 扱 う 際 の 挙 動<br />
に 違 いが 生 まれます。 基 本 形 であるuint 型 の 変 数 と、 参 照 型 である 配 列 の 変 数 を 例 にして、<br />
両 者 で 代 入 の 挙 動 の 挙 動 に 違 いをみてみましょう。<br />
変 数 とデータ 型<br />
45
Ethereum 入 門<br />
contract VarTypeTest {<br />
function valType() constant returns (uint retVal){<br />
uint a;<br />
a = 10;<br />
uint b = a; // (1)<br />
b = 20; // (2)<br />
return a; // Execution result shows 10 !<br />
}<br />
}<br />
function refType() constant returns (uint[2] retVal){<br />
uint[2] x;<br />
x[0] = 100;<br />
x[1] = 200;<br />
uint[2] y = x; //(3)<br />
y[0] = 500; // (4)<br />
y[1] = 600; // (4)<br />
return x; // Execution result shows [500, 600] !<br />
}<br />
関 数 valType() では 基 本 型 であるuintの 変 数 を 代 入 した 場 合 の 挙 動 を 試 験 しています。(1)の<br />
行 では、 変 数 a に 代 入 された「10」という 値 そのものがコピーされて 変 数 b に 代 入 されま<br />
す( 値 渡 し)。その 結 果 b の 値 が(2)で 変 更 されても、 元 の 変 数 a の 内 容 には 影 響 を 与 えま<br />
せん。その 結 果 この 関 数 の 実 行 結 果 は 10 が 示 されます。<br />
一 方 で 関 数 refType() では 参 照 型 である 配 列 の 変 数 を 代 入 した 場 合 の 挙 動 を 試 験 していま<br />
す。 配 列 の 変 数 は 参 照 型 であり、 参 照 型 の 変 数 には「 値 を 格 納 しているメモリ 上 のアドレ<br />
ス( 参 照 )」が 格 納 されています。そのため(3)で 配 列 x を y に 代 入 していますが、ここで<br />
実 際 に 行 われていることは、 変 数 x の 値 を 格 納 しているメモリ 上 のアドレスを 変 数 y に<br />
セットしていることになります( 参 照 渡 し)。そのためこの 時 点 で x と y は 同 じ 場 所 を 見<br />
ていることになり、(4)で y の 内 容 を 変 えると 同 時 に 変 数 x の 内 容 も 変 更 されることになり<br />
ます。 結 果 、この 関 数 の 実 行 結 果 は [500, 600] が 示 されます。<br />
以 下 でSolidityで 規 定 されている 基 本 型 と 参 照 型 のそれぞれのデータ 型 について 見 ていきま<br />
す。<br />
基 本 型<br />
符 号 付 き 整 数 型<br />
以 下 の 例 のように 符 号 付 き 整 数 型 は int● 句 を 用 いて 宣 言 します。ここで「●」は 変 数 の<br />
ビット 長 の 指 定 であり8~256までの8の 倍 数 が 指 定 されます。 例 えばint8は8ビット 符 号 付 整<br />
数 型 を 表 わします(-128 〜 127)。 数 字 が 省 略 され int と 指 定 された 場 合 は int256 を 意<br />
味 します。またデフォルト 値 は0です。<br />
変 数 とデータ 型<br />
46
Ethereum 入 門<br />
int16 a = -10; // 16 bitの 符 号 付 き 整 数 型 を 宣 言 し「-10」を 格 納 。<br />
int b = 100; // 256 bitの 符 号 付 整 数 型 を 宣 言 し「100」を 格 納 。<br />
int c; // 代 入 を 行 わないとデフォルト 値 「0」が 格 納 される。<br />
符 号 なし 整 数 型<br />
以 下 の 例 のように 符 号 なし 整 数 型 は uint● 句 を 用 いて 宣 言 します。ここで「●」は 変 数 の<br />
ビット 長 の 指 定 であり8~256までの8の 倍 数 が 指 定 されます。 例 えばuint8は8ビット 符 号 な<br />
し 整 数 型 を 表 わします(0 〜 255)。 数 字 が 省 略 され uint と 指 定 された 場 合 はuint256を 意<br />
味 します。またデフォルト 値 は0です。<br />
uint16 a = 10; // 16 bitの 符 号 付 き 整 数 型 を 宣 言 し「10」を 格 納 。<br />
uint b = 100; // 256 bitの 符 号 付 整 数 型 を 宣 言 し「100」を 格 納 。<br />
uint c; // 代 入 を 行 わないとデフォルト 値 「0」が 格 納 される。<br />
uint d = -10; //【コンパイルエラー】uint 型 に 負 値 は 格 納 不 可 。<br />
真 偽 型<br />
真 偽 ( 論 理 ) 型 変 数 は bool 句 により 宣 言 します。 true ( 真 )または false ( 偽 )の2 値<br />
のみが 格 納 可 能 です。デフォルト 値 は false になります。<br />
アドレス 型<br />
アドレス 型 はEOAやContractの20バイトの 長 さのアドレスを 格 納 する 型 であり address 句<br />
で 宣 言 します。<br />
address a = 0xabc; // "0x0000000000000000000000000000000000000abc"のアドレス 値 が 格 納 される。<br />
address b; //デフォルト 値 は"0x0000000000000000000000000000000000000000"<br />
balance 属 性<br />
アドレス 型 には balance 属 性 が 規 定 されています。 例 えば 下 記 の 例 の 用 にbalance 属 性 を 用<br />
いると 指 定 のアドレスが 保 有 するetherの 量 が 取 得 可 能 です。<br />
address a = 0xa; //アドレス 型 変 数 aに0xaのアドレスを 格 納 。<br />
uint b = a.balance; //アドレス"0xa"の 持 つetherの 量 をbに 格 納 。<br />
send() 関 数<br />
アドレス 型 には send 関 数 が 規 定 されています。 .send(x); により 指 定 のアドレ<br />
ス に x weiのetherを 送 金 することができます。 以 下 に 実 際 に 送 金 を 行 う 簡 単 な<br />
コントラクトのコードを 示 します。<br />
変 数 とデータ 型<br />
47
Ethereum 入 門<br />
contract Test {<br />
function sendTest(){<br />
address a = 0xf2057b8aefb9093331faf48f30c1ebeab4ff961d; // 送 信 先 のアドレスの 指 定<br />
a.send(5); //コントラクト・アドレスが 保 有 するetherから 指 定 のアドレス"a"へ5wei 送 金<br />
}<br />
}<br />
【TIP】 実 際 に 上 記 のコントラクトのsendTest 関 数 を 動 かす 際 は、コードをコンパイルしブ<br />
ロックチェーンに 登 録 後 、 本 コントラクトのアドレスに5wei 以 上 のetherを 送 金 しておく 必<br />
要 があります。というのもsendTest() 関 数 はコントラクトが 保 有 するetherを 指 定 のアドレ<br />
スに 送 る 関 数 であるためです。また、アカウントの 状 態 を 変 える 関 数 のために、「Contract<br />
を 作 成 してみる」 節 で 説 明 したとおり、sendTestの 関 数 の 実 行 はsendTransaction 関 数 を 用<br />
いて 呼 び 出 す 必 要 があります。<br />
参 照 型<br />
( 追 記 予 定 )<br />
変 数 とデータ 型<br />
48
Ethereum 入 門<br />
Etherumの 内 部<br />
追 記 予 定<br />
Ethereumの 内 部<br />
49
Ethereum 入 門<br />
さらに 詳 しく 知 るために<br />
さらに 詳 しく 知 るために<br />
50