FLOCブロックチェーン大学校

マイページ
無料体験セミナー

ホワイトペーパー FLOC LOG

【日本語訳】イーサリアム(Ethereum/ETH)ホワイトペーパー全文

イーサリアム(Ethereum/ETH)のホワイトペーパー全文の日本語訳です。FLOCLOGではブロックチェーンを活用した様々なプロジェクトのホワイトペーパー日本語訳を閲覧できます。

イーサリウム

イーサリウムの目的は、スクリプティング、アルトコイン、およびオンチェーンメタプロトコルの概念を統合して改善し、開発者がスケーラビリティ、標準化、機能の完全性、開発の容易さ、および使いやすさを兼ね備えた任意のコンセンサスベースのアプリケーションを作成できるようにすることで、これらの異なるパラダイム全てに対しての相互運用性を同時に提供することです。イーサリウムは本質的には究極の抽象基盤を構築することで実現します。つまり、チューリング完全なプログラミング言語が組み込まれていて、誰でもスマートコントラクトや分散型アプリケーションを作って、そこに所有権、トランザクションフォーマット、および状態遷移関数について、任意の規則を独自に作成できるブロックチェーンということです。Namecoinの必要最低限のバージョンは2行のコードで書くことができ、通貨や評価システムのような他のプロトコルも20行以下で構築できるようになります。スマートコントラクト、価値を保有していてある条件が満たされたら解錠される暗号「ボックス」なども私たちのプラットフォーム上で構築することができ、さらにビットコインのスクリプトが提供するものよりもはるかに強力です、なぜなら、イーサリウムはビットコインのスクリプトの欠点を解決するためのソリューションが追加されているからです。

イーサリウムアカウント

イーサリウムでは、ステートは「アカウント」と呼ばれるオブジェクトによって構成されています。それぞれのアカウントは20バイトで、状態遷移はアカウント間の価値と情報の直接転移となります。1つのイーサリウムアカウントには4つの分野が含まれています。

● ナンス それぞれのトランザクションが1回しか処理されないようにするためのカウンター
● そのアカウントの現在のETH残高
● 表示されていたら、そのアカウントのコントラクトコード
● そのアカウントのストレージ (デフォルトでは空)

「Ether」はイーサリウム内部の主要な燃料(ガス トランザクション作成時の手数料支払い)用仮想通貨で、トランザクション手数料を支払うために使われます。一般的に、アカウントには2つのタイプがあり、暗号鍵によって排他的に所有されているアカウントとそのコントラクトコードによって管理されているコントラクトアドレスの2つです。排他的に所有されているアカウントはコードがなく、トランザクションを作成して、署名をすることでこの排他的に所有されているアカウントからメッセージを送ることができます。コントラクトアカウントでは、every time the contract account receives a message its code activates, allowing it to read and write to internal storage and send other messages or create contracts in turn.

メッセージとトランザクション

イーサリウムにおける「メッセージ」はいわゆるビットコインにおける「トランザクション」にいくらか似ているものですが、3つの大きな違いがあります。1つ目は、イーサリウムのメッセージは外部の団体、もしくはコントラクトどちらかによって作成することができます。一方、ビットコインのトランザクションは外部的にしか作成されることができません。2つ目は、イーサリウムメッセージにデータを含めるという明示的なオプションがあることです。3つ目は、イーサリウムメッセージの受信者は、もしもそのアドレスがコントラクトアドレスだった場合、返信をすることができます。つまり、イーサリウムにも機能性というコンセプトが含まれているということを意味します。

イーサリウムにおける「トランザクション」は排他的に所有されているアカウントから送られているメッセージを格納した署名されたデータパッケージのことを指します。トランザクションは受信者のメッセージ、送信者を特定するための署名、ETHの量と送るデータ、そしてSTARTGASとGASPRICEと呼ばれる2つの値が含まれています。指数関数的な爆発やコード内の無限ループを防ぐために、各トランザクションは、実行可能なコード実行の計算ステップ数に制限を設定する必要があります。STARTGASはこの制限で、GASPRICEは計算ステップごとにマイナーに支払われる手数料です。もしも、トランザクションの実行が「ガス切れ」となってしまった場合、すべての状態の変更は手数料の支払いを除いて元に戻り、そしていくらかのガスが残っている状態で取引の実行が停止するならば、手数料の残りの部分は送り主に払い戻されます。さらに、コントラクトを作成するための別のトランザクションタイプと包括的なメッセージタイプがあり、コントラクトのアドレスはアカウントナンスとトランザクションデータのハッシュに基づいて計算されます。

メッセージメカニズムの重要な結果はイーサリウム資産の「ファーストクラスシチズン」です。このアイデアはコントラクトは排他的なアカウントと同じパワーを持っていて、そこにはメッセージを送り、他のコントラクトを作成することも含まれています。これによって、コントラクトが同時に複数の役割を果たすことができるようになり、例えば、分散型組織(コントラクト)のメンバーを、独自の量子証明としてLamport署名を採用する疑り深い個人(2つ目のコントラクト)とセキュリティのためにアカウントを5つの鍵で保護しているアカウント(3つ目のアカウント)を使う共同署名団体との間のエスクローアカウント(4つ目のコントラクト)として使うことができます。イーサリウムプラットフォームの強みは、分散型組織とエスクローコントラクトが、契約の各当事者がどのような種類のアカウントであるかを気にする必要がないことです。

イーサリウム状態遷移機能

 

イーサリウム状態遷移機能はであるAPPLY(S,TX) -> S’ は以下のように定義することができます。

  1. トランザクションが正常か(ie. 桁数が正しいかなど) 、署名が有効か、そしてナンスが送信者のアカウントのナンスと合致するかを確認し、もしもこれらに異常があればエラーを返します。
  2. STARTGAS * GASPRICEという式でトランザクション手数料を計算し、署名から送信者のアドレスを決定します。そして、送信者のアカウントから手数料分の残高を減らし、送信者のナンスを増やします。もしも、残高が十分になかった場合はエラーを返します。
  3. GAS = STARTGASを初期化し、トランザクション内のByte代金を支払うために、バイトごとに一定量のガスを払います。
  4. 送信者のアカウントから受信者のアカウントにトランザクションバリューを移転する。もしも、受取アカウントが存在しなかったら、それを作成します。もしも受取アカウントがコントラクトだったら、完了、もしくはガスが切れるまでそのコントラクトのコードを実行します。
  5. もしも、価値の移転が送信者が十分な残高がないために失敗したり、コードの実行中にガスが切れたりしたら、手数料の支払い以外の全てのステートは元に戻され、マイナーのアカウントに手数料が追加されます。
  6. それ以外の場合には、残っているガスを全て送信者に返金して、ガスの消費に使われた手数料をマイナーに送信します。

例えば、以下のコントラクトコードの場合

if !contract.storage[msg.data[0]]:
contract.storage[msg.data[0]] = msg.data[1]

注意して欲しいのは、現実にはコントラクトコードはローレベルのEVMコードでコントラクトコードが書かれているということです。この例はSerpantという、私たちの高度言語で書かれていて、明確にすると、EVMコードにコンパイルすることができます。コントラクトのストレージが空から始まり、トランザクションが10ETH、2000ガス、0.001ETH gas価格、および2つのデータフィールド[2、 ‘CHARLIE’] [3]で送信されたとします。このケースにおける状態遷移機能のプロセスは以下のようになります。

  1. トランザクションが有効で、正しく作られているかを確認します。
  2. トランザクションの送信者が最低でも2000*0.001=2ETH持っていることを確認し、もしも、2ETHあるなら送信者のアカウントから2ETHを引きます。
  3. Gas=2000を初期化し、トランザクションが170バイト長とすいていし、1150ガスが残るように850を引きます。
  4. 送信者のアカウントからさらに10ETHを引き、それをコントラクトのアドレスに追加します。
  5. コードを実行します。今回の例では、とてもシンプルでコントラクトのストレージに対して、インデック2のコントラクトストレージが使われているかを確認し、使われていなかったら、インデックス2のストレージの値をCHARLIEに設定します。これに187ガスが必要だったとしたら、残ったガスは1150-187=963となります。
  6. 送信者のアドレスに963* 0.001 = 0.963ETHを戻し、結果を返します。

トランザクションの最終受取がコントラクトではなかった場合、合計のトランザクション手数料はシンプルにGASPRICEにトランザクションのバイト長を掛けたものと同じになり、トランザクションと一緒に送信したデータは手数料の計算においては無関係となります。さらに、コントラクトの開始メッセージは、生成される計算にガス制限を割り当てることができ、サブの計算がガス不足になると、メッセージ呼び出しの時点にのみ戻されることに注意してください。それゆえ、トランザクションのように、コントラクトに対して、発生するサブの計算に対して厳しい制限を設定することで限りのある計算リソースを確保することができます。

コードの実行

イーサリウムコントラクトにおけるコードは低レベルのスタックベースバイトコード言語で書かれていて、「イーサリウム仮想マシンコード」、「EVM」コードと呼ばれます。このコードはバイトの連続によって構成されていて、それぞれぼバイトがオペレーションを表しています。一般的には、コードの実行とは現在のプログラムカウンター(0からスタート)で操作を繰り返し実行することで構成される無限ループです。そして、カウンターを1つずつ増やしていって、コードが終わるかエラーになるか、STOPもしくはRETURNという指示が出るまでこの操作を実行し続けます。操作は、データを格納するための3種類のスペースにアクセスできます。

スタック 先入れ先出しのコンテナで32バイトまでの値をプッシュ、ポップ可能
メモリ  無限に拡張できるバイト配列
コントラクトの長期ストレージ 32バイトの鍵/値両方を保存するところで、計算が終わったらリセットされるスタックやメモリと違い、ストレージは長期間持続します。

このコードは、ブロックヘッダーデータだけでなく、着信メッセージの値、送信者、およびデータにもアクセスできます。また、コードは出力としてデータのバイト配列を返すこともできます。

EVMコードのフォーマルな実行モデルは驚くほどシンプルです。イーサリウム仮想マシンの実行中、その完全な計算状態はタプル(block_state、トランザクション、メッセージ、コード、メモリ、スタック、pc、ガス)で定義できます。ここで、block_stateはすべてのアカウントを含むグローバル状態で、残高とストレージを含みます 。実行のたびに、現在の命令はpcバイト目のコードを取得することで見つけられ、各命令はタプルへの影響の観点から独自の定義を持ちます。たとえば、ADDは2つの項目をスタックからポップして合計をプッシュし、gasを1減らしてpcを1ずつインクリメントします。SSTOREは先頭の2つのアイテムをスタックからプッシュし、2番目の項目を次の項目で指定されたインデックスに挿入します。 最初の項目は、最大200までガスを減らし、1ずつpcを増やすことです。ジャストインタイムコンパイルによってイーサリウムを最適化する方法は多数ありますが、イーサリウムの基本的な実装は数百行のコードで実行できます。


FLOCブロックチェーン大学校は、第一線で活躍する講師陣から体系的かつ実践的な知識や技術を学び、最短3ヶ月でビジネスパーソンやエンジニアとして活躍できるブロックチェーン総合スクールです。
5,000人を超える方が参加した、無料でブロックチェーンを100分で学ぶ「無料体験セミナー」も随時開催しています。
遠方で参加できない、日程が合わないという方にはWEB受講も行ってます。

多数のケーススタディが掲載されたブロックチェーンビジネス事例集がこちらから無料入手できます。

最新記事・限定情報を配信してます

ブロックチェーン専門スクールで即戦力を身につけませんか?

FLOCブロックチェーン大学校は、技術者の育成から、ビジネススクール、検定試験によるアセスメントの構築、人材紹介、起業家育成などを通じ、ブロックチェーンのプラットフォームを構築しているブロックチェーンの総合スクールです。
無料体験セミナーは、ブロックチェーンの仕組みからブロックチェーンで変わる未来、ブロックチェーン技術を効率的に身につける方法について、100分で学べる体験講座です。遠方で参加できない方や、教室開催の日程で都合が合わない方にはWEB配信も行ってます。

無料体験セミナーを確認する

FLOC LOG カテゴリー

3分でわかるブロックチェーンFLOC講師が解説!速報ブロックチェーンニュースホワイトペーパー体験セミナー