イーサリアム (Ethereum)のトランザクションはどのように承認されるのか?

目次

    はじめに

    今回は、イーサリアム のトランザクションについて詳しく解説します。はじめに、トランザクションとは何かを説明し、次に二種類のトランザクションについてそれぞれを詳しく説明します。最後にユーザーが発行したトランザクションが最終的にブロックに格納されるまでの過程を追っていきましょう。ブロックに格納される過程で、トランザクションはマイナーによって検証され、不正なトランザクションは弾かれるようになっています。どのような項目をチェックして、正式なトランザクションとして認めているかについても解説していきます。

     

    今回までの4回の記事でイーサリアム のブロックチェーンについて人に語れるくらい詳しくなれると思います。まだ読んでいない項目がある方は以下から順に読むことをおすすめします。

     

    イーサリアム(Ethereum)のブロック構造とその仕組み

    イーサリアム(Ethereum)のデータ構造~マークルパトリシアツリー

    イーサリアム(Ethereum)における手数料Gasとは?

     

     

    トランザクションとは、

     

    wikipediaによると、トランザクションは、以下のように表現されています。

    「トランザクション (英: transaction)とは、データベース管理システム(または類似のシステム)内で実行される、分けることのできない一連の情報処理の単位である。」

    (引用:wikipedia トランザクション)

     

    ここで、一連の処理とは、例えば自動販売機で飲み物を買う作業です。自動販売機で飲み物を買うときには、①お金を入れて、②飲み物を選んでボタンをおし、③飲み物を受け取る、の一連の処理を行うことで完了します。このような一連の処理の中で特に情報処理に関するものをトランザクションと呼びます。

     

    一方、イーサリアム の場合トランザクションとは、仮想通貨やトークンの所有権の移動などの情報処理を行うためのデータのことをさします。ユーザーは外部アカウントを通してイーサリアム上でトランザクションを発行することで、マイナーがそのトランザクションにしたがって一連の情報処理をしてくれます。

     

    また、イーサリアム のシステムのデータの変更は、全てトランザクションによって行います。

     

    二種類のトランザクション

    イーサリアム(Ethereum)のブロック構造とその仕組み で解説したようにイーサリアム には、二種類のアカウントがあります。外部アカウント:EOAとコントラクトアカウント:CAの二つです。

    また、トランザクションにも二種類が存在します。①アカウント間での送金やトークンのやりとり、コントラクトアカウントのコード呼び出しなどに用いるメッセージコール(Message call)と、②コントラクトアカウントを作成する場合に使うコントラクト生成(Contract Creation)です。

     

    次節以降で、コントラクト生成とメッセージコールについて説明します。

    コントラクト生成

     

    コントラクト生成では、まずはじめにコントラクトアカウントのアドレスを設定します。以前の記事で紹介したように、コントラクトアカウントには、秘密鍵がありません。そのため、アカウントのアドレス生成の仕方がユーザーの通常のアカウント(外部アカウント)とは、異なります。

    (イーサリアムアドレス生成については、イーサリアムアドレス 〜EIP-55によるチェックサムの導入〜が参考になります。)

    コントラクトアカウントの場合では、コントラクトアカウントを作成するアカウント(これは外部所有アカウントのみできるか? )のアドレスとnonceを組み合わせてハッシュ化することでアドレスを作ります。コントラクトを作ろうとするアカウントのアドレスは、常に同じです。しかしnonceはコントラクト生成ごとに値が異なるので、生成されるコントラクトアカウントのアドレスは全く異なる値になります。アドレスが生成されたら、そのコントラクトアカウントの初期設定をし、コントラクトに関するコードを送信することで、スマートコントラクトが実行できる環境を作ることができます。

    また最終的に、Ethereum上でコントラクトのコードを保存するために使用するメモリに応じてにユーザーはGasを支払います。

     

    メッセージコール

     

    メッセージコールは、新たにアカウントを生成するトランザクションではなく、送金やコントラクトのコード、関数などを呼び出すときに使われます。メッセージコールで発行されたトランザクションは、マイナーによって検証されます。その後、検証されたトランザクションを元にイーサリアム のWorld State(送金の場合は、送信者と受信者のAccount State)を変更します。変更すべきアカウントは,以前の記事で解説したパトリシアツリーを用いて探します。また、トランザクションの送信者はStateが変更される際に必要なGasを支払う必要があります。

    4つのmessage call

     

    イーサリアムには、二種類のアカウントがあることは先ほど述べた通りです。つまり送信者と受信者それぞれで,2×2=4種類のメッセージコールの使い方があります。

    ①は、通常のユーザー間の送金です。②は、スマートコントラクの実行などのトランザクションを表します。③は、コントタクトアカウントから別のコントラクトを呼び出す的に使われます。④は、コントラクトアカウントから外部アカウントへのメッセージや送金です。

    ③のコントラクトアカウント同士のメッセージは特にインターナルトランザクションと呼ばれます。イーサリアム では、このように様々なメッセージを組み合わせることで複雑なコントラクトを処理します。

     

    トランザクションには、何が書かれているのか

     

    ここまで、トランザクションとは何か、トランザクションにはどのような種類があるのかがわかりました。そこで次に、発行されるトランザクションには、何が書かれているかについて見ていきます。

    to

    トランザクションは、コインやトークンなどの所有権などの移動を行うためのデータであったので、送金する相手のアドレスが必要です。コントラクト生成の場合には、0が入ります。これが以下の図のtoに含まれます。

     

    r.s.v

    他にもそのトランザクションが誰から送られたか、さらに本当にその人が送ったトランザクションかを判定するための署名なども必要です。これは、r,s,vという値で管理されます。sの値に対して一定の処理をしたものがrに一致するかを検証することで、なりすましの送金を防ぎます。また、vの値はテストネットのETHをメインネットで使われてしまうことを防ぐのと、検証されるアドレスを一つに定めるために用いられれます。(参考;https://zoom-blc.com/what-is-ecdsa)

     

    Gas Price・Gas Limit

    ・Gas priceとGas limitはマイナーへ支払う手数料に関連する変数でした。詳しくは、前回の記事を参考にしてください。

     

    value

    valueは送金するETHの量です。例えば、3 etherを送金する場合は、wei表示で300000000000000000と表示されます。

    nonce

    nonceには、そのトランザクションの発行者が何度目に発行したトランザクションであるかが書かれています。2回の送金のみを行ったことがあるユーザーの場合、次にトランザクションを発行すると、nonceには3が入ります。

     

    init

    initには、コントラクト生成のときに必要なコントラクトのコードが入ります。一方、コードに関係するデータのアップデートはdataに必要な情報を入れてトランザクションを発行します。

    トランザクションが実行されるまでのライフサイクル

     

    最後に、どのようなプロセスを経てトランザクションが実行され、それがブロックに書き込まれるかについて解説していきます。

     

    ①はじめに、ユーザーは外部アカウントを通じてイーサリアム上にトランザクションを発行します。トランザクションは、基本的にユーザーがETHを保持しているウォレットを通じて、登録されているマイナーノードにブロードキャストされます。

     

    ②ノードに送信されたトランザクションは、マイナーによって検証されます。検証は、以下の条件が満たされているかチェックします。

     

    1.トランザクションがイーサリアムで扱うデータ形式になっている。(RLPフォーマット呼ばれる形式になっているか検証します。)

    2.トランザクションを実行するために必要なGasよりも大きなGasLimitになっている

    3.送信者が、設定した手数料を支払うことができる。

    4.送信者の署名が正しい。

    5.トランザクションに記述されているnonceがトランザクションを発行したアカウントのnonceと一致している。

     

    4番目の条件は、他のユーザーになりすましをした送金を防ぐ役割をします。5番目の条件は、二重の支払いや、送金の順序を正すために検証されます。ただし、トランザクションに記述されているnonceがアカウントのnonceと異なる場合があります。この場合については、③のQueued poolで説明します。

     

    ③ ①と②までの検証が終わると、トランザクションはブロックに書き込まれる前にMempoolと呼ばれる一時的にトランザクションをためておくプールに貯められます。このプールは二種類に別れていています。Pending poolとQueued poolです。Pending poolには、②の検証でnonceが一致したトランザクションが入っています。一方、Queued poolには、nonceが一致しないトランザクションが入ります。

     

    トランザクションを短い時間に連続して発行した場合、マイナーに順番通りにトランザクションが届かない場合があります。この場合、nonceの値が一致しないため、一旦、Queued poolへ送られます。Queued pool入っているトランザクションは、受信が遅れているnonceが一致するトランザクションが承認された段階で、Pending poolに移動されます。

     

    ④トランザクションが実行され、実際にWorld State(Account State)が変更されます。

    また、実行したトランザクションは、ブロックに刻まれます。また、実行後にどの程度Gasを消費したか、どのブロックに格納されたか、トランザクションのハッシュ値などを含めたレシートが発行されます(Transaction Receipt)。

     

    最後に、トランザクションの結果によって変わった部分をマークルパトリシアツリーによって再計算し、それぞれのハッシュ値をまとめたRoot値をブロックに格納します。

    例えば、ブロックに取り込まれたトランザクションは、マークルツリーによってTransaction Rootとしてトランサクションとは別に、ブロックヘッダーに刻まれます。

    同様に、それぞれのトランザクションに対応するTransaction Receiptも上のマークルツリーでRoot値を計算し、Receipts Rootとしてブロックヘッダーに刻まれます。

    まとめ

    これまで四回に分けてイーサリアムのマシーンの仕組みについて解説してきました。最終回は、今までの知識をフル活用することで理解できたかと思います。全四回の解説で。よりイーサリアムについて興味を持ってもらい、理解を深めてもらえると幸いです。

    コメントする

    メールアドレスが公開されることはありません。