20.12.2015 Views

Table of Contents

mastering-ethereum

mastering-ethereum

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!