タグ: "Block chain"

Cosmosの可能性

Cosmosの可能性

2018/06/21 at 10:40 AM 0 comments
はじめに こんにちは! 今回も前回に引き続きクロスチェーンのCosmosについて書いていきます。今回は、特にCosmosがどのように使われて、どのような可能性があるのかについて解説していきます。   公式HP:cosmos.network ホワイトペーパー:github.com Cosmosの可能性 相互運用性(Interoperability)とは 相互運用性とは、異なるブロックチェーン同士の機能を掛け合わせて利用したり、取引所などの第三者を介さずに、様々な仮想通貨・トークンを交換したりすることができることです。   ここでは、イーサリアム・ゾーンとジーキャッシュ(Zcash)・ゾーンがHUBに接続している場合を考えましょう。これらの仮想通貨はHUBのおかげで相互運用ができて、取引を秘匿したままイーサリアムのスマートコントラクトを実行することが可能になります。 このように、相互に利用できることは非常にメリットで、いくつかのトークンや仮想通貨の特徴を掛け合わせて使うことができるので、様々な可能性を秘めています。   Cosmosの基盤技術Tendermintとは   Cosmosのブロックチェーンは、Tendermintと呼ばれるジェネリックエンジンで動いています。CosmosはTendermintをベースに作られているため、上記で述べた相互運用が可能になります(詳しくは後述)。そこで、この節では、Cosmosを支えているTendermintがどのようなものなのか解説します。 Tendermintの特徴   Tendermintは次のような特徴を持っています。 コンポーネント化された設計 ABCI後述)によって様々な言語で開発可能 以上の設計によって独自ブロックチェーンを容易に実装可能 Proof of Stakeによるコンセンサスのためトランザクションの処理速度が早い フォークしない ファイナリティを得られる(フォークが起きないので後からブロックチェーンに刻まれた事実が覆らない。) コンソーシアムチェーン、パブリックチェーンどちらも作成可能。   Tendermintのアーキテクチャ   Tendermintについて知るために、はじめにブロックチェーンのアーキテクチャについて確認しましょう。ブロックチェーンは、複数人が検証し、承認されたデータを送受信し合い、同じ台帳を共有するという特徴から以下の三つの要素が必要になります。   ・ ネットワーキング(networking) ・ コンセンサス(consensus) ・ アプリケーション(Application)   ネットワーキングのレイヤーでは、全てのノードがユーザーによって発行されたトランザクションを受け取れるように設計されています。ノードは、トランザクションを受け取ったら、そのデータを用いてlocalのstateを変更するかどうか合意を取る必要があります。この部分がコンセンサスレイヤーです。合意が取れれば、実際にstateを更新します。この部分をアプリケーションレイヤーが担当します。このようにして、ブロックチェーンが機能します。   そのため、分散型アプリケーションを開発者したい者にとってこれらを全て一から作ることは、骨が折れる仕事です。   そこで、Tendermintはとても役にたちます。Tendermintを使うことでブロックチェーンのネットワーキングやコンセンサスアルゴリズムにリソースを割くことなくアプリケーションレイヤー層のみに集中して開発を行うことができるからです。Tendermintでは、PoS型のコンセンサスエンジンを備えたコンセンサスレイヤーとネットワーキングレイヤーが誰でも使える形で提供されています。(簡単なアプリであればすぐに動かせます。) したがって、Tendermintは、独自ブロックチェーンを作る時に必要な要素のうちアプリケーションレイヤー以外を提供する、ジェネリックエンジンです。Tendermintではこのように、ブロックチェーンに必要な各レイヤーがコンポーネント化されているため、より開発者が使いやすいような設計になっています。   ABCI (Application Blockchain interface Interface)   図のブロックチェーンのコンセンサスエンジンとアプリケーションロジックを繋ぐ役割をするのがABCIです。ABCIは、アプリケーションをあらゆるプログラミング言語で構築、処理することができるAPI、server socket提供します。   Consensus   前回の記事のCosmosでも紹介したように、Tendermintで構築したブロックチェーンはProof of Stakeアルゴリズムでコンセンサスをとります。PoSを用いるメリットは、Proof of Workアルゴリズムで発生する膨大な計算による電力消費を削減することです。 Tendermintでは、誰がブロックを提案し承認するかを事前に決めることができます。Tendermintはブロックの伝搬とそのブロックをどのようなプロセスで承認するかを決めているに過ぎません。このときブロックを承認する人たちをバリデーターと呼びましたが, このバリデータをどのように構成するかは、アプリケーションレイヤーで決めることができます。そのため、どの程度のトークン保有者をバリデーターとして承認するか, バリデーターの選定を事前承認性にするかなどは、ブロックチェーンごとに決めることができます。すなわち、Tendermintは PoSとしてもPoA(Proof of Authority: 承認された人のみがブロックの追加をできるコンセンサスアルゴリズム)としても使うことができます。   例えば、はじめに特定の人にトークンを渡しておき、コンソーシアムブロックチェーンとして作成し、徐々にそのトークンを外部の利用者に解放していくことで、アルゴリズムを変更せずにブロックチェーンをよりパブリックに変更していくことも可能になります。   また、Tendermintのアルゴリズムは、処理能力に優れていて1秒当たり数千トランザクションを扱えます。   さらに、tendermintにおけるコンセンサスではブロックの生成後すぐにファイナリティを得られます。(一度承認されたトランザクションは覆らないようになっています。)。これは、コンセンサスの方法が工夫されていて、選出されたプロポーザーが提案してブロックを二回の投票によって承認します。具体的には。バリデータの2/3が正しいブロックであるということを投票することで承認されます。もし投票が2/3以上集まらない場合や、設定された制限時間になっても承認が終わらない場合は、もう一度やり直すことになります。このようにして、ブロックチェーンは、フォークせずファイナリティーがすぐに得らる仕組みになっています。   プロポーザーとバリデーターについては、Cosmosの記事を参考にしてください。   また以下のサイトでは、Tendermintを用いて進行しているプロジェクトがまとまっています。 https://forum。cosmos。network/t/list-of-projects-in-cosmos-tendermint-ecosystem/243 異なるブロックチェーン同士をつなぐIBC(Inter Blockchain Communication)   異なるブロックチェーン繋げることをブリッジングと言います。IBCは、このときブリッジとしてブロックチェーン同士が情報を容易に交換でき、相互に運用できるように機能します。このような相互運用を可能にするためにIBCでは、IBC Packetと呼ばれる統一された通信用プロトコルが定義されており, ブロックチェーンのデータはこのIBC Packet形式に準拠する必要があります。 しかし、どのようなブロックチェーンでもデータ形式を変換してIBCを利用した通信ができるわけではありません。   Tendermintは、先ほど述べたように、ネットワーキング、コンセンサスレイヤーを提供します。そのため、Tendermintを使うと異なるアプリケーションであるが、 ネットワーキング、コンセンサスレイヤーが同じであるブロックチェーンがいくつか生まれるわけです。IBCは、これらのTendermintを用いて作成されたブロックチェーン同士の通信を行うためのルールです。   これらのブロックチェーンは同じ規格を使って作られているので、お互いに通信するのが容易です、さらに、ファイナリティーがすぐ得られるため後から取引が覆らず、以前に他のブロックチェーンに送った情報が覆ることがおきないので、相互運用に適しています。 また、特筆すべき点としてプライベートチェーンとパブリックチェーンを繋げることも挙げられます。 また, 既存のイーサリアムやビットコインを相互運用できるのかどうかが気になりますが, これも可能です。すぐにファイナリティーが得られるように、新しくイーサリアム専用のブロックチェーンを作ることによってうまくいきます。これについては後ほど説明します。   異種のチェーンの接続による問題点   様々なブロックチェーンが接続されることによって発生する問題もあります。その一つとして考えられるのが二重支払いです。例えば、ブロックチェーンAとBの間で通信を行いトークンAとBを交換する場合を考えます。このとき、取引に用いられるトークン AがブロックチェーンAと接続している他のブロックチェーンでは使われていないかを確かめる必要があります。   具体例として100個のブロックチェーンがそれぞれ相互に接続された場合を考えます。この時に存在する接続の組み合わせは、100C2=4950個 になります。非常に多くの接続が行われることになり、これらを全てチェックするのはとても時間がかかり非効率です。そこで考え出されたのがCosmosHUBです。Cosmosを間に入れることで、100個のブロックチェーンは全てCosmosHUBを介した接続がされるので、接続数は全部で100個に収まります。また、このHUBであるCosmosのブロックチェーンで異なるブロックチェーン間でのトークン交換や、相互運用の記録を残すことによってより安全で不正が起きないシステムが実現されます。取引などの二重支払いがないかどうかは、Cosmosのブロックチェーン1つだけを調べればいいことになります。   ETGate はじめに述べたとおり、既存のブロックチェーンを繋げるには、まずゾーンに繋げる(ブリッジする)必要があります。 イーサリアムの場合、ETGateと呼ばれる技術を用いることによってイーサリアムブロックチェーンとTendermintゾーンの間で双方向のやりとりができるようになります。 この仕組みは、簡単には以下のようになっています。 まず、イーサリアムは、ブロックがよくフォークするのでブロックが途中から覆る場合があります。もし、他のブロックチェーンとトークンの交換をしてからブロックチェーンが覆ると、二重支払いが可能になってしまいます。そのため、取引が覆らないことを保証するためのブロックチェーンを作る必要があります。それがPeg-Zoneです。   Peg-zoneでは、オリジナルのチェーンのファイナリティーを決める閾値を設定します。 例えば、イーサリアムの場合は、トランザクションを行ってから100ブロックが承認されれば、ブロックチェーンが覆る確率は、ほとんどないので100ブロックという閾値を設定するわけです。この閾値に達したら、イーサリアムのスマートコントラクトによって, Peg-Zone上に同量のイーサリアムに対応するトークンが露出します。もちろん、Peg-Zoneはtendermintによって作られているので、IBCを用いて他のトークンと交換可能になるわけです。   HUBとZone   前節で説明したようにCosmosでは、異なるブロッックチェーン(Zone)をつなげるためにCosmosHUBを用いてトランザクションの管理を行います。この様子を図解すると以下のようになります。 異なるアプリケーションがABCIによってTendermintと通信をしながら、Tendermintは、異なるブロックチェーンとIBCを通して通信を行う。これがCosmosの全容です。   問題点 当然ですが、課題もあリます。CosmosはTendermintを用いたProof of Stateを採用しているため、少数の組織が莫大な資金を投じることによってネットワークを攻撃する可能性があります。その影響はCosmosだけでなく、接続されている他の全てのブロチェーンに影響が出る恐れがあります。また、Cosmosには懲罰制度としてスラッシャーという機能が実装されています。スラッシャーは、バリデーターが不正な行為をしたり、バリデーターノードが6時間以上ダウンした場合、バリデーターおよび、当該のバリデーターに委託していたデリゲーターのステークトークンを没収するアルゴリズムです。そのため、大規模な通信障害や、故障等でマシーンが動かなくなりステークしていたトークンを失う可能性があるので、バリデーターになるには、現状かなりのハードルがあります。 まとめ   今回と前回では、クロスチェーンを実現しようとしているCosmosのプロジェクトについて取り上げました。ブロックチェーンのインターネットがどのように実現され、どのように活用されるか期待が高まります。 reference https://cosmos.network/ https://blog.cosmos.network/
イーサリアム (Ethereum)のトランザクションはどのように承認されるのか?

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

2018/06/15 at 2:07 PM 0 comments
はじめに 今回は、イーサリアム のトランザクションについて詳しく解説します。はじめに、トランザクションとは何かを説明し、次に二種類のトランザクションについてそれぞれを詳しく説明します。最後にユーザーが発行したトランザクションが最終的にブロックに格納されるまでの過程を追っていきましょう。ブロックに格納される過程で、トランザクションはマイナーによって検証され、不正なトランザクションは弾かれるようになっています。どのような項目をチェックして、正式なトランザクションとして認めているかについても解説していきます。   今回までの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としてブロックヘッダーに刻まれます。 まとめ これまで四回に分けてイーサリアムのマシーンの仕組みについて解説してきました。最終回は、今までの知識をフル活用することで理解できたかと思います。全四回の解説で。よりイーサリアムについて興味を持ってもらい、理解を深めてもらえると幸いです。