SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

翔泳社 新刊紹介(AD)

イーサリアムでスマートコントラクトを開発したいとき、最初に押さえておくべき用語と概念は?

  • このエントリーをはてなブックマークに追加

 ブロックチェーンのイーサリアムを利用した分散アプリdappに注目が集まっています。ウェブやモバイルのアプリとは異なる用語や概念が多く、最初は戸惑う方も多いかもしれません。そこで、翔泳社から発売中の『ブロックチェーン dapp&ゲーム開発入門』のChapter1から、押さえておきたい主要な概念を紹介します。少し長いので、じっくり読み進めてみてください。

  • このエントリーをはてなブックマークに追加
本記事は『ブロックチェーン dapp&ゲーム開発入門 Solidityによるイーサリアム分散アプリプログラミング』の「Chapter1 概念の紹介」からの抜粋です。掲載にあたり、一部を編集しています。

 イーサリアムを使ったブロックチェーンの抽象的な概要を示します。ブロックチェーン(blockchain)とは、ブロックの「順序を持った列」のことです。また、ブロック(block)とは、トランザクション(transaction:取引)の「順序を持った列」です。トランザクションはイーサリアム仮想マシン(EVM)というシステム上で動作し、ステートツリー(state tree:状態木)を変更するコードを実行します。それでは、これらの概念をより詳しく探っていきましょう。

1.1 ブロック

 先述のとおり、ブロックチェーンはブロックの「順序を持った列」からなり、ブロックは、メタ情報のヘッダーと、トランザクションの列によって構成されます。ブロックはマイナー(miner:採掘者)によりマイニング(mining:採掘)のプロセスを経て作成され、ネットワークの残りの部分にブロードキャストされます。ノード(node:ネットワークの構成要素)はそれぞれ、受け取ったブロックを一連のコンセンサスルール(consensus rule:合意規則)に照らして検証します。コンセンサスルールを満たさないブロックは、ネットワークから拒絶されます。

1.1.1 フォーク

 フォーク(fork:分岐)は、互いに競合するコンセンサスルールのセットがネットワーク上に存在する場合に発生します。一般的には、公式クライアントの更新のときにこの状況が発生します。イーサリアムの公式クライアントはgethというプログラムです。

 ソフトフォーク(soft fork)は、より新しいルールのセットが、古いルールのセットの部分集合であるような場合に発生します。古いルールを利用しているクライアントは、新しいルールを利用しているクライアントによって作成されたブロックを拒絶しないため、新ルールでのブロック作成者(であるマイナー)のみが自己のソフトウェアを更新する必要があります(マイナー以外は更新の必要がありません)。

 一方、ハードフォーク(hard fork)は、新しいルールのセットが古いルールのセットと整合性がない場合に発生します。この場合、すべてのクライアントが自己のソフトウェアを更新しなければなりません。一般的に、ハードフォークは論争となる傾向があります。

 あるユーザーのグループが自己のソフトウェアの更新を拒んだ場合、チェーンスプリット(chain split:ブロックチェーンの分断)が発生し、一方のブロックチェーン上で有効なブロックが、他方のブロックチェーン上では無効になってしまいます。イーサリアムでは6回のハードフォークが発生しており、そのうちの1回はチェーンスプリットを引き起こし、イーサリアムクラシック(ETC)というイーサリアムとは別のブロックチェーンの創設に至っています。

1.2 マイニング

 イーサリアムネットワーク内のマイニングノードは、イーサッシュ(Ethash)と呼ばれる、独自のプルーフ・オブ・ワーク(proof of work/PoW:作業による証明)アルゴリズムを用い、互いに競うようにしてブロックを生成しています。イーサッシュアルゴリズムへの入力は、ナンス(nonce)と呼ばれるランダムに生成された数値を含むブロックヘッダーであり、出力は32バイトの16進数です。ナンスの変更によって出力も変化しますが、どのように変わるかは予測できません。

1.2.1 ネットワーク難易度と報酬

 マイニングされたブロックをネットワークが受理するためには、ブロックヘッダーに対するイーサッシュの出力が、ネットワーク難易度(network difficulty)という、達成目標となる (さらに別の)32バイトの16進数よりも小さくなければなりません。目標難易度を達成するブロックを全体へ送信するマイナーは誰でも、ブロック報酬(block reward)を受け取ります。

 ブロック報酬は、ブロック内にコインベーストランザクション(coinbase transaction)を含めることによって与えられます。コインベーストランザクションとは、一般的にはブロック内の最初のトランザクションであり、ブロック報酬をマイナーに送信します。ビザンティウムハードフォーク(Byzantium hard fork)というハードフォーク以降、現在のブロック報酬は3イーサ(ether:イーサリアムの通貨単位)となっています。

 時には、2人のマイナーがほぼ同時にブロックを生産することがあります。その場合も、メインのブロックチェーンにはただ1つのブロックのみが受理されます。受理されなかったほうのブロックはアンクル(uncle:叔父)ブロックと呼ばれます(訳注:uncle以外にも、ジェンダー中立な表現として、ommerと呼ばれることもある)。

 アンクルブロックはブロックチェーンに含まれ、アンクルブロックのマイナーは通常ブロックの場合より少ないブロック報酬を受け取りますが、そのトランザクションはステートツリーを変更しません。

 ブロックチェーンのセキュリティは、ネットワーク内のハッシュパワー(hash power:ハッシュ関数処理性能)の量に比例します。ネットワーク内により大きなハッシュパワーが存在するということは、各マイナーが全ハッシュパワーのより小さな割合しか占めず、ネットワーク乗っ取り攻撃がより困難になることを意味します。

 ブロックチェーンにアンクルブロックを含めることでブロックチェーンのセキュリティを高められているのは、受理されなかったブロックの作成に使われたハッシュパワーが浪費されていないからです。ネットワーク難易度は、ブロックが15~30秒ごとに生産されるよう、常に調整されています。

1.3 トランザクション

 トランザクションはイーサを送信し、スマートコントラクトをデプロイするか、あるいは既存のスマートコントラクト上で関数を実行します。トランザクションは、コード演算の複雑性とネットワークコストとを決定するイーサリアム測量単位であるガス(gas)を消費します。トランザクションにかかるガスのコストは、トランザクション手数料(transaction fee)を計算するのに用いられます。ブロックをマイニングするマイナーにトランザクションを送信するアドレスのユーザーが、トランザクション手数料を支払います。

 トランザクションには、オプションとしてdataフィールドを含めることが可能です。コントラクトをデプロイするトランザクションの場合、dataはコントラクトをバイトコードで表現したデータとなります。スマートコントラクトに送信されるトランザクションの場合、dataは呼び出す関数の名前と引数とを含みます。

1.3.1 プロセッサーとプログラム

 プロセッサー(processor)とは、一連の所与の命令を実行する集積回路です。各プロセッサーには、実行できる演算のセットがあります。命令(instruction)は、演算コードまたはオプコード(opcode)と、それに続く演算への入力データとから構成されます。x86命令セットは今日用いられる最も一般的な命令セットであり、約1000個の一意なオプコードを持ちます。

 プログラム(program)とは一連の命令であり、そのまま順番に実行されます。パンチカードであれ、アセンブリであれ、あるいはPythonのような高水準言語であれ、すべてのコードはコンパイルされたりインタープリターで翻訳されたりして、生のバイト列に落とし込まれます。そうしたバイト列が、コンピューターが機械的に順次実行できる一連のプロセッサー命令に相当します。リスト1.1は、Hello WorldプログラムがLinuxアセンブリでどのように表されるかを示しています。

リスト1.1 x86 LinuxアセンブリでのHello Worldsection
section .text
global _start ; リンカー(ld)用に宣言が必要
 _start:      ; リンカーにエントリーポイントを指示する

mov edx,len   ; メッセージ長
mov ecx,msg   ; 書き込むメッセージ
mov ebx,1 ; ファイルディスクリプター(標準出力)
mov eax,4     ; システムコール番号(sys_write)
int 0x80      ; カーネル呼び出し
mov eax,1     ; システムコール番号(sys_exit)
int 0x80      ; カーネル呼び出し

section .data

msg db 'Hello, world!',0xa ; 大事な文字列
len equ $ - msg ; 大事な文字列の長さ

1.3.2 仮想マシン

 仮想マシン(Virtual Machine/VM)とは、プロセッサーのように振る舞うソフトウェアプログラムです。仮想マシンは自身のオプコードのセットを備え、自身の命令セット向けに書かれたプログラムを実行できます。

 VMの命令に相当する低水準のバイトは、バイトコード(bytecode)と呼ばれます。プログラミング言語は、実行用にバイトコードへコンパイルされます。Java仮想マシン(JVM)は今日利用される最も人気のある仮想マシンの一つであり、JVMによって生計を立てている人々もいます。JVMはJava、Scala、Groovy、Jythonのような複数の言語をサポートしています。

 仮想マシンはエミュレーション(emulation:疑似実行)のため、実行されるハードウェアを選ばないという利点があります。Windows、Linux、あるいは「スマート」冷蔵庫の組み込みOSのような新しいプラットフォームに仮想マシンがいったん移植されると、その仮想マシン向けに書かれたプログラムは、「スマート」TV上で動くのと同じように冷蔵庫上でも問題なく動作できます。Javaの「Write Once, Run Anywhere(一度書けばどこでも動く)」という標語が思い浮かびます。

1.3.3 イーサリアム仮想マシン(EVM)

 イーサリアム用VMとしては、イーサリアム仮想マシン(EVM)があります。イーサリアムがVMを必要とするのは、EVMの各オプコードに関連付けられたガス手数料の存在によります。手数料はスパムに対する抑止力として働き、許可不要の公共資源としてEVMが機能できるようにします。

 EVM用の独自オプコードのそれぞれが自身の手数料を持つということは、上手く書かれたコントラクトの実行はより安価となるということを意味します。例えば、SSTORE演算はデータをステートツリーに格納しますが、これは高価な演算となっており、その理由は全ネットワークへデータを複製しなければならないからです。

 トランザクションのバイトコードによって蓄積されるガス手数料の合計がトランザクション手数料を決定します。

1.4 ステートツリー

 イーサリアムの主要データベースはステートツリー(state tree:状態木)であり、Keccak256ハッシュのキーを32バイトの値に対応させるキー/値のペアによって構成されます。Solidityのデータ構造では、プログラミングを楽にする構造体を作成する場合に、ステートツリーの1個または複数のエントリー(登録要素となるキー/値のペア)を用います。単純データ型(simple data type)は32バイト以下のサイズのデータであり、ステートツリーの1エントリー内に格納できます。一方、複雑データ型(complex data type)は、配列など、ステートツリーの複数エントリーを必要とするデータ型です。

 Keccak256ハッシュは256ビット長であり、そのためイーサリアムのステートツリーは2256の一意なエントリーを保持できるよう設計されています。しかしながら、約280以上のエントリーを超えると、ハッシュが衝突するため、ステートツリーの状態が利用に適しているとはいいがたいものとなります。

 ただ、いずれにせよ、この空間サイズは全世界に現状存在しているディスク空間の総サイズより大きいため、無限のストレージ(データ保持領域)が存在すると開発者は仮定できます。ただし、実際にストレージに対し料金を支払うこととは別問題です。というのも、ステートツリーにデータを保存することはいちじるしい量のガスを消費するためです。コントラクトは、ステートツリーに行う挿入や更新の数を最小にするように、注意深く書かれるべきです。

 ステートツリーはトランザクションの実行によって変更、構築されます。ほとんどのトランザクションはステートツリーを変更します。

 ステートツリーはマークル・パトリシア・トライ(Merkle Patricia trie)というデータ構造を用いて実装されています。このデータ構造を理解することはSolidityプログラミングに必須ではありませんが、興味のある方向けに、詳細がGitHub上のhttps://github.com/ethereum/wiki/wiki/Patricia-Treeでドキュメント化されています(訳注:マークル・パトリシア・トライはビットコインでも用いられるバイナリ・マークル・ツリー(二分ハッシュ木)と異なり、16進文字列を用いたパトリシア・トライ構造を採用することにより、キー/値のペアの探索だけでなく挿入/削除をも計算量O(log(n))で効率よく行うことを可能にしたデータ構造)。

1.5 Web3解説

 ブロックチェーン技術に早くから注目してきたユーザーの多くが、インターネットの新時代―Web 3.0―を導いていくのではないかと興奮していました。Web 1.0とはインターネットの最初の段階であり、そこではインターネットというプラットフォームはほとんど、物を売ったり情報を投稿したりすることに利用されていました。

 その後、Web 2.0がソーシャルネットワークとユーザー同士の協働とをインターネットにもたらしました。Facebook、Flickr、Instagramなどのサイトでは、ユーザーが生成したコンテンツが中心的に利用されてきました。Web 3.0とは、新たな非中央集権的なWebへの期待であり、そこでは、権力を持つ中央当局が検閲を行ったり、ユーザーのデータをコントロールしたりできないのです。

1.5.1 非中央集権的なネットワーク

 インターネットは、もともと、中央当局のどこを攻撃しても陥落させることができない非中央集権的なコミュニケーションネットワークとして、DARPA(アメリカ国防高等研究計画局)によって設計されました。その後の15年間でWebがより商業的になるにつれ、中央集権の度合いも増してきました。

 現在、Googleの検索アルゴリズム上でよい点数を得ることが、新しいサイトがトラフィックを獲得する際の絶対条件となっています。Facebookは、アクセス制御の内側で、ユーザーが生成したデータとコンテンツの大部分を支配しています。NetflixとYoutubeとを合わせると、インターネットのトラフィックの約1/3を占めています。また、中国やトルコといった一部の国は、この状況に乗じて自分たちの検閲ルールに従わないサイトの閲覧を禁止しています。

 Web 3.0の目的の一つに、権力による検閲や支配をより困難なものとするために、Webを再び非中央集権化する(re-decentralize)ことがあります。イーサリアム上に構築したどのアプリケーションも自動的に非中央集権化されるため、Web 3.0の熱狂的ファンにとって、イーサリアムは心躍るプラットフォームなのです。

1.5.2 分散アプリケーション、イーサリアム

 イーサリアム上のアプリケーションは一般に、分散アプリケーション(distributed application)、あるいはdapp(ダップ)と呼ばれます。伝統的なインターネットのアプリケーションと異なり、dappはホスティングやデータ保存のためのサーバーを必要としません。イーサリアムネットワークは、認証・コントラクトデータ保存・APIといった、サーバーの伝統的な責務のすべてに対応しています。

 このことは、伝統的なWebサイトのようにはdappを検閲できないことを意味します。dappを検閲するためには、イーサリアムネットワーク上のすべてのノードをブラックリストに入れなければならず、これは簡単な作業ではありません。

 ちなみに、web3という用語はイーサリアムコミュニティ内ではちょっとした混乱を招く恐れがあります。初期にはweb3はWeb 3.0の概念を指していましたが、現在は一般的にイーサリアムのクライアントライブラリであるweb3.jsのことも指します。『ブロックチェーン dapp&ゲーム開発入門』では、web3をクライアントライブラリを指す用語として使用していきます。

1.6 最近のイーサリアム関連動向

 イーサリアム開発コミュニティでは、『ブロックチェーン dapp&ゲーム開発入門』を用いてdappを構築する開発者に関連するかもしれない2つの新しい取り組みが主に注目されています。

1.6.1 プルーフ・オブ・ステーク (proof of stake/PoS:出資量による証明)

 現時点では、ビットコインとイーサリアム双方のトランザクションスループットの低さにより、ある種のアプリケーションやサービスが非実用的なものとなっています。

 ピーク時に、ビットコインは秒間7トランザクション(7TPS)を処理できます。イーサリアムは最大約30TPSです。対照的に、Visaやマスターカードのスループットは、最大で数万TPSを誇ります。プルーフ・オブ・ステーク(PoS)では、マイナーはバリデーター(validator:検証者)に置き換えられます。SHA-256によるプルーフ・オブ・ワークのコンセンサスのアルゴリズムをPoSアルゴリズムに置き換えれば、ブロックタイム(block time:ブロック生成にかかる時間)は大幅に減少し、Visaやマスターカードをも超えるほどのイーサリアムのスループット増大に寄与します。

1.6.2 シャーディング

 現在、イーサリアムネットワーク上のすべての完全アーカイバルノード(archival node:記録保管ノード)は、300GB以上にものぼる全ブロックチェーンをダウンロードしなければなりません。「ライトシンキング(light syncing:軽量同期)」のオプションも利用可能ですが、長期的な解決手段とはなりません。

 シャーディング(sharding)はアカウント空間をサブ空間(シャード)に分割して、それぞれのサブ空間に自身のバリデーターを設置します。そのため、全ネットワークがすべてのトランザクションを処理しなくてもよくなります。シャーディングが施され、かつPoSが有効となったイーサリアムネットワークのトランザクションスループットは、シャードごとに2000TPSにも達します。

1.7 ビットコイン vs イーサリアム

 多くの方にとって、暗号通貨やブロックチェーンとはじめて遭遇したのはビットコイン(bitcoin/BTC)を通じてだったはずです。ビットコインは最初の暗号通貨であり、今でも最大規模かつ最もよく使われている暗号通貨です。ビットコインにより、ユーザーは銀行やPayPalのような第三者の仲介を経ずにお金を送ったり受け取ったりできるようになりました。ビットコインのことは、インターネットのための偽造不能な貨幣と考えてください。

1.7.1 イーサリアムの特長

 ビットコインを超えるイーサリアムの主要な革新は、ブロックチェーン上に高信頼性計算フレームワークを付加したことです。イーサリアムノード群は、互いを必ずしも信頼していないかもしれませんが、ネットワークがスマートコントラクトのコードを決定論的に実行することは信頼できます。このことをネイティブ通貨の導入と組み合わせると、ビットコインがサポートしていない多様な機能が可能になります。

 ハッシュ化時間ロックコントラクト(Hashed Timelock Contract/HTLC)を除き、ビットコインは条件分岐をサポートしません。お金は送金されるか、あるいは送金されないかです。トランザクションはシステムの内部状態に依存しません。一方、イーサリアムのスマートコントラクトは条件分岐をサポートしています。このことは些末にも見えますが、条件分岐のサポートを追加すると開発者は、制御フロー(flow of control)、つまりプログラム内で個々の命令が評価ないし実行される順序を指定する能力を与えられます。

 エスクロー(escrow:第三者仲介)決済はその一例です。エスクロー決済では、両当事者の参加を条件として交換が成立します。別の例としては、「賭け」が挙げられますが、これは外部の事象を条件として支払いが実行されます。ユーザー同士お互いを信頼し合っていなくても、スマートコントラクトのロジックが意図どおり実行されることは信頼できます。

 いろいろな意味で、イーサリアムとは未知への跳躍です。ビットコインは「非中央集権的通貨を作成する」という特定の問題の解決に向けて構築されました。イーサリアムは、恣意的なロジックに基づいたプログラミング可能な価値移転を提供することによって、未来の、想像も付かなかったような、ブロックチェーン関連の解決手段に貢献するでしょう。目下、イーサリアムの最大の利用事例はクラウドファンディング(crowdfunding)ですが、賭け、エスクロー、非中央集権的取引所、予測市場、非中央集権的百科事典、ユーザー制御スマートデータなど、多くの実験や応用が進行中です。

1.8 アドレスとキーペア

 イーサリアムは、ビットコイン同様に、トランザクションを認証し安全にするために非対称鍵暗号(asymmetric key cryptography)を用います。パブリック(public:公開)とプライベート(private:秘密)のキーペアが生成され、プライベートキー(private key:秘密鍵)で署名されたメッセージは対応するパブリックキー(public key:公開鍵)でのみ復号でき、またその逆も同様です。イーサリアムのアドレス(address)とは、パブリックキーのKeccak256ハッシュの末尾20バイトです。Keccak256とは、イーサリアムが用いる標準ハッシュ関数です。

 アドレスに結び付けられたイーサの残高(balance)は、対応するプライベートキーの所有権を証明できるユーザーであれば誰でも使うことができます。すべてのイーサリアムトランザクションは送金者のプライベートキーで暗号化されており、ユーザーのパブリックキーが全体に送信されたメッセージを有効なトランザクションに復号できれば、そのことが、そのユーザーがそのプライベートキーを所有している証しとなるのです。

1.9 コントラクトと外部アカウント

 イーサリアムには、外部アカウントとコントラクトという、2種類のアカウント(account:口座)があります。外部アカウント(external account)はユーザーによって管理されるものである一方で、コントラクト(contract)は関数呼び出しによって発動されるブロックチェーン上の半自律的存在です。

 すべてのアカウントは、関連する残高とナンスを持ちます。ナンスは毎回のトランザクション後に1増加し、トランザクションの重複を防ぐために存在します。残高とナンスという2つのフィールドに加え、コントラクトは、コントラクトコード内で指定された追加的データフィールドを保持可能な、別のストレージ空間にもアクセス可能です。

1.10 イーサリアムにおけるプログラム

 イーサリアムにおけるプログラムは、1つもしくはそれ以上の相互作用するスマートコントラクトによって構成されます。スマートコントラクトは他のスマートコントラクト内の関数を呼び出すことができます。個々のコントラクトは、伝統的なプログラミング言語における「クラス」に似ています。

1.10.1 記述言語

 スマートコントラクトは、EVMアセンブリ、Solidity、低水準LISP(LLL)、Serpentなどの言語によって記述できます。すべてのコントラクトは最終的にEVMアセンブリバイトコードへコンパイルされます。Solidityは最も一般的に利用される言語です。Serpentは利用が段階的に停止されつつあり、LLLが利用されることはきわめてまれです。先ほど挙げた言語以外にも、Viperといった新しい実験的言語も開発中です。

1.10.2 デプロイ

 スマートコントラクトのデプロイは、EVMアセンブリバイトコードをデータとして付加したトランザクションをnullアドレス(0x)へ送信することで実行されます。

 イーサリアムの考案者は、その設計時、新しいスマートコントラクトのそれぞれがブロックチェーン上の新しいコントラクトのための構成部品として振る舞うことと、同時に大半の機能を既存のコントラクトに頼ることを想像していました。例えば、文字列操作を行いたいコントラクトは、Solidityがサポートしていない「文字列結合」といった操作を実行するため、既存のStringUtilsコントラクトに頼る、といった具合です。

 あいにく、このようなスタイルで開発を行うには、テストや開発のためにイーサリアムのメインネット(mainnet:主要本番ネットワーク)と直接やり取りする必要があり、非常に高く付きます。代わりに開発者のほとんどは最近、プライベートなテスト用ブロックチェーン上で使えるようプログラム内に標準のStringUtilsコントラクトをコピーしてから、そのStringUtilsコントラクトの自前版をデプロイして自分のプログラム内で利用しています。

1.10.3 ABI

 スマートコントラクトは、自動的にアプリケーション・バイナリ・インターフェイス(Application Binary Interface/ABI)を公開します。ABIとはAPIをバイナリまたはバイトコードで同等に表現したもののことです。ABIにはパブリックな外部の関数がすべて含まれ、プライベートな内部の関数は含まれません。ABIの関数は、トランザクション送信中には外部アカウントから呼び出すことができ、また内部ロジックの実行中には他のスマートコントラクトから呼び出すことができます。

1.11 Solidityを掘り下げる

 SolidityはEVMの主要なプログラミング言語です。EVMは従来のプロセッサーには使われない特製オプコードを持っているため、既存プログラミング言語はEVMには適しません。Solidityはイーサリアム上でスマートコントラクトをプログラミングする専用の言語として設計されました。

 SolidityはよくJavaScriptと比較されますが、最も近い親類はC言語です。Solidityは、ストレージとCPUの利用限定を重視する最小限の機能を備えた、強い型付けの言語です。SolidityはEVM用に256ビットのデータ型をサポートしており、この点は32ビットや64ビットのプロセッサーのみサポートする一般的言語と異なります。

1.11.1 型付け言語

 強い型付けの言語をまったく使ったことのない開発者にとっても、Solidityに慣れるのは難しくはないはずです。実際のところ、ほとんどの人は非型付け言語よりも型付け言語のほうが簡単であると感じるため、型付け言語だからといってSolidityのことを恐れないでください。Java、Swift、またはObjective-Cに触れてきたモバイル開発者は、Solidityの文法を非常になじみのあるものと感じるでしょう。

 一方、JavaScript開発者は多少は慣れる必要があるかもしれません。JavaScriptのように緩い型付けの言語では、式の評価はより簡単ですが、計算が手数料ベースであるシステムにおいては望まれない(また潜在的に高価な)曖昧さをもたらすためです(訳注:緩い型付けの言語では、型変換が自動的に行われたりメモリ空間の使い方が必ずしも最適化されていなかったりといった、処理上のオーバーヘッドが付随することがある。そのため、プログラマーの意図しない負荷を伴う計算が内部的に生じる可能性があり、計算負荷に手数料を課すシステムでは意図しない手数料につながりうる)。

 本番環境の設定では、すべての開発者が、ストレージ・メモリ・CPUの利用が限定されるガスの制約範囲内で作業することに順応せざるを得ません。限られたリソースの中で作業することに慣れている組み込みシステム開発者は、Solidityへの移行がおそらく最も楽でしょう。

1.12 ハックを防ぎ続ける

 スマートコントラクトはイーサ残高を保持している可能性があるので、ハッカーにとって実入りのよい攻撃目標です。DAO攻撃や、Parity社のマルチシグ(multi-sig:複数署名)を用いたウォレット(wallet:暗号通貨の保管場所)への攻撃のようなハックは、何百万ドルもの損失に至りました。

 大半のSolidityアプリケーションコードはオープンソースで誰からも見えるものなので、セキュリティ上の目立つ欠陥をコントラクトのコードに残してしまわないようにするには、ベストプラクティスに従うことが必須です。そうしたベストプラクティス(最善の慣行)は、イーサをコントラクト内で送金する代わりに出金の方式を使うようなやり取り上のテクニックから、条件分岐を最小化するようなコード上のテクニックにまで多岐にわたります。

 一般的に、Solidity開発は、Webサイト作成というより橋の建設のように扱われるべきです。そのプロセスは繰り返し行われるようなものではありません。いったんデプロイされると、コントラクトのコードとABIは更新できません。あるコントラクトから別のコントラクトへ残高を移転することは、内部にレジャー(ledger:台帳)を保持するコントラクトの場合は特に、困難、または不可能です。

 可能な場合はいつでも、テストされていない新しいコードの代わりに、実績のあるレガシーコードを使うべきです。メインネットにデプロイする前に、コントラクトを徹底的にテストして点検するべきです。

『ブロックチェーン dapp&ゲーム開発入門』のChapter5はコントラクトのセキュリティを詳細にわたって広範に取り扱っており、最も重要です。デプロイ済みコントラクトに何かの資産やイーサを保存することを試みる前に、必ず読んでください。

1.13 ブロックエクスプローラー

 ブロックエクスプローラー(block explorer)は、ブロックチェーンを見ていくために簡単に利用できるインターフェイスを提供するWebサイトです。イーサスキャンは、現時点で最良のイーサリアム用ブロックエクスプローラーです(下図)。

 イーサスキャンは、同期中に最新のブロック高度(block heightt:ブロックチェーン上の現在のブロック番号)を確認したり、保留中のトランザクションを監視したりだけでなく、他にもトランザクションの最終的なガス手数料の確認、ネットワーク難易度の確認、デプロイ済みコントラクトのソースコードやABIの確認、などの作業に使えます。

イーサスキャンブロックエクスプローラー
イーサスキャンブロックエクスプローラー

『ブロックチェーン dapp&ゲーム開発入門』では、トランザクションとウォレットの監視に、イーサスキャンを広く使っていきます。個々のトランザクションとアドレスは右上角の検索ボックスから検索できます。

1.14 有用なスマートコントラクト

 ブロックチェーン上のスマートコントラクトとdappは新興の技術なので、100%の確証を持って技術がどう利用されるかを予測することはできません。そのことを念頭に置きつつ、大きな潜在価値を持ちうる多くの利用事例が模索されています。

 これまでで最も実績のあるスマートコントラクト利用事例は、カスタムトークン(custom token:既存ブロックチェーン上に構築された独自の通貨(トークン))とクラウドセールス(crowd sales:群衆販売)です。これまでにイーサリアム上で数百のトークンが売り出されました。クラウドセールスは、通常はトークンセールス(token sales)、イニシャル・コイン・オファリング(initial coin offering:初回コイン提供。トークン売りだしによる資金調達法)、またはICOと呼ばれます。

 エスクローのスマートコントラクトは、互いに信頼していない当事者間でトークン(token:代用貨幣)の所有権を移転するために使われて人気となりました。売り手はスマートコントラクトにトークンのコントロールを許可し、買い手がそのスマートコントラクトにイーサを送信した場合のみトークンが買い手に送られます。

 トークン以外の他のデジタル資産も、スマートコントラクトを使って保存できます。株式、不動産、金、USドル、その他各種資産をイーサリアムブロックチェーン上で利用可能かつ取引可能とするために、さまざまな企業がコントラクトを構築してきました。

1.15 イーサリアムでのゲーミングに関する賛否

 やっと、ゲームの話です。今日、特にWeb上にホストされたゲームで、開発者は決済の扱いに苦労しています。ゲーミングサイトはStripeやPayPalの提供する従来の決済フレームワークで預金や出金を行いますが、精算には数日かかることがあります。イーサリアムは、ゲームのロジックへの決済や小額決済の統合を容易にします。

 オープンソースのスマートコントラクトをゲームに用いることで、ゲームロジックを実行するための、透明で、信頼できる方法を提供できます。歴史的には、Webサイトに金銭を支払うユーザーは、Webサイト所有者が返済義務のある金銭を絶対に返さないリスクとしてのカウンターパーティリスク(counterparty risk:取引相手リスク)を負っていました。

 FBIが一連のポーカーWebサイトを2011年に閉鎖したとき、多数のユーザーが、閉鎖されたWebサイトに保持していた金銭を失いました。イーサリアム上のスマートコントラクトは閉鎖したり検閲したりすることができません。コントラクトがユーザーのイーサ出金を認める限り、ユーザーはイーサを出金できます。正しく記述されたスマートコントラクトはカウンターパーティリスクを低減ないし除去します。

 ギャンブル場に関する悪い評判として、運に依存するゲームで八百長を行うかもしれないというものがあります。例えば、宣伝されている還元率より実際には還元率が低いデジタルスロットマシーンのようなものです。これに対し、オープンソースのギャンブル用スマートコントラクトは証明済みの確率で運用でき、証明可能な公正(provably fair)を担保できます。

 イーサリアム上でのゲーミングには欠点があります。ブロックは伝播に15~30秒かかり、そのことは、賭けを行うなどスマートコントラクトへのすべての更新操作が伝播に15~30秒かかることを意味します。マイニングされたブロックにトランザクションが入る前の保留期間中、そのトランザクションはネットワークの全参加者から見えます。

 トランザクションは到着時間ではなくガス価格の順に処理されるため、より高いガス価格を支払った者に先行される可能性があります。トランザクションが賞金付きパズルの解答である場合、また取引所への発注である場合、あるいは秘密が重要な他のどんな場合においても、このことは問題を引き起こします。

1.16 フォローすべき人々

 TwitterとRedditが、暗号コミュニティでの主要コミュニケーション手段です。一般的な暗号通貨に関する議論はTwitterで行われますが、ほぼすべてのプロジェクトにコミュニティ内議論用の公開Reddit内スレッド(subreddit)があります。以下は、イーサリアムに関する最新情報をすべて得るためにフォローすべきTwitterユーザーやインフルエンサーです。

  • ヴィタリク・ブテリン(@VitalikButerin):イーサリアム共同創業者にして、イーサリアム界を支える神童です。彼のブログは、ブロックチェーン技術について深い理解を得るために必読です。
  • ギャヴィン・ウッド(@gavofyork):イーサリアム共同創業者、Solidity開発者、イーサリアムイエローペーパー著者、そしてParity Technologiesの現社長です。
  • アレックス・ヴァン・デ・サンデ(@avsa):イーサリアムファウンデーションのメンバーでMistブラウザーチームのヘッドです。
  • ヴラド・ザムフィア(@VladZamfir):イーサリアムプロトコルの主要開発者の一人で、現在イーサリアムの次世代プルーフ・オブ・ステーク合意システムであるCasperの開発に取り組んでいます。
  • テイラー・ゲアリング(@TaylorGerring):イーサリアムファウンデーション設立に協力し、イーサリアムの運営委員でもありました。
  • アンソニー・ディーオリオ(@diiorioanthony):イーサリアムの前チームメンバーであり、最初のウォレットアプリの一つであるJaxxウォレットの創業者です。
  • ジェフリー・ウィルク(@jeffehh):イーサリアムプロトコルとEVMのリファレンスクライアント実装であるGo Ethereum(geth)のリード開発者です。
  • ジョー・ルビン(@ethereumJoseph):イーサリアム共同創業者であり、イーサリアムシンクタンク、スタートアップアクセラレーター、コード提供者、などさまざまな役割を持つ企業ConsenSysの創業者です。ConsenSysはイーサリアム界で最も大きな企業の一つです。
  • チャールズ・ホスキンソン(@IOHK_Charles):イーサリアムの元CEOであり、イーサリアムクラシックに深く関与し、ブロックチェーン研究企業IOHKを経営しています。

1.17 まとめ

 イーサリアムは、信頼性のあるコード実行を提供する、非中央集権的計算フレームワークです。イーサリアムは「ワールドコンピューター(world computer:世界計算機)」と時に呼ばれ、ワールドコンピューターそのものになることがその最終目的です。ブロックチェーン上のコードは、トランザクションか内部のメッセージによって発動されます。トランザクションはブロックに含まれ、ハッシュパワーを使ってブロックチェーンの安全を確保するマイナーによってブロックチェーンに追加されます。

 Solidityは、イーサリアムのスマートコントラクト作成用に最も人気のある言語で、イーサリアム仮想マシン(EVM)上で実行されるバイトコードへコンパイルされます。EVMの各オプコードには関連付けられたガス手数料があります。オプコードのガス手数料の合計が、トランザクションのガス手数料となります。ガス手数料にユーザーが選んだガス価格を掛けると、トランザクション手数料が求められます。マイナーは、ガス価格でトランザクションを優先順位付けします。

 ユーザーは、プライベートキーによって、イーサとブロックチェーン上の資産の安全を確保します。ブロックチェーン上の資産移転にはすべて、資産の所有者が自身のキーでトランザクションに署名することが求められます。

 セキュリティこそが、イーサリアムにおいて最重要な点です。下手に書かれたコードで引き起こされたハックは、数分のうちに数百万ドルもの価値の消失に至りました。『ブロックチェーン dapp&ゲーム開発入門』ではコントラクトのセキュリティを非常に重視しています。そして、本記事で概念的な基礎を押さえたことで、はじめてのスマートコントラクトを書く準備が整いました。

ブロックチェーン dapp&ゲーム開発入門

Amazon SEshop その他

ブロックチェーン dapp&ゲーム開発入門
Solidityによるイーサリアム分散アプリプログラミング

著者:Kedar Iyer、Chris Dannen
訳者:久富木隆一
発売日:2019年3月18日(月)
価格:3,542円(税込)

本書について

本書では、ユーザーが多くdapp開発基盤のデファクトスタンダードとなっているイーサリアム(Ethereum)で、スマートコントラクト実装用の言語「Solidity」を用いてゲームやアプリの開発を学んでいきます。

 

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
翔泳社 新刊紹介連載記事一覧

もっと読む

この記事の著者

渡部 拓也(ワタナベ タクヤ)

 翔泳社マーケティング課。MarkeZine、CodeZine、EnterpriseZine、Biz/Zine、ほかにて翔泳社の本の紹介記事や著者インタビュー、たまにそれ以外も執筆しています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11447 2019/03/25 07:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング