blockchainjapan’s blog

旬のブロックチェーンを記事を厳選して提供!

DAGのスマートコントラクト‐Vite


DAGのスマートコントラクト‐Vite

DAGにスマートコントラクトを実装することの意味

Vite Japan

日本版Telegramに御参加ください:https://t.me/vite_japanese

前書き

一般的なブロックチェーンと比較し、DAG(Directed Acyclic Graph)元帳に基づいたスマートコントラクトの実装は間違いなくより困難です。

正確にこれらの困難とは何か?これを見ていきましょう


暗号通貨

まず、最も基本的なシナリオ である“暗号通貨”から始めましょう。暗号通貨の概念は、各アカウントの残高情報を格納する分散データベースです。暗号通貨ネットワークで実行されているコンピュータは、ノードと呼ばれます。各ノードには、口座残高に関するデータが保存されています。これは、ステートと呼ばれることがよくあります。

いわゆる集中システムとは異なり、分散元帳はすべてのノードがステートの合意に達することを要求します。つまり、ネットワーク内の各コンピュータに保存されている各アカウントの残高は同じです。特定のシステムではステータスデータが増大する可能性があり、全ての状態を送信するとネットワークに大きな負荷が発生してしまいます。そのため、このようなシステムではステータスを変更する部分のみが送信されます。

暗号通貨システムでは、全ての取引は元帳と呼ばれるデータ構造に記録されます。元帳は暗号化されているため、各ノードは他ノードから送信されたデータが改ざんされているかを検証できます。

ブロックチェーンは古典的な“本”と変わらない構造で、DAGはそれとはまったく別の構造を取ります。


ブロックチェーンベースの暗号通貨

ブロックチェーンの元帳構造を見てみましょう。

この構造においては、全てのトランザクションが順序正しく並んでいないといけません。例えば、任意の2つのトランザクションの順序を変更すると、ハッシュ参照関係がクラッシュし、無効の元帳が作成されてしまいます。つまり、どのノードが計算を実行しても同じ状態から開始すると、同じ結果が常に同じトランザクションの後に存在することになります。BitcoinであろうとEthereumであろうと、ノード間で巨大なステータスデータを転送し比較する必要はなく、代わりに必要なのは元帳データについての合意のみです。

DAGベースの暗号通貨

では、DAG元帳はどうなのかを見てみましょう。DAG元帳では、トランザクション間の順序は決定されているわけではありませんが、暗号通貨残高の増減が可換則を満たすため、元帳状態の計算はまだ影響を受けません。任意の口座の残高が0以上である限り、取引の順序は全く問題とはなりません。したがって、DAG元帳における時運所がどう移動しても、計算された最終的な口座残高は同じになります。

つまり、どのノードでもDAG元帳から正しい状態を復元できるという事です。


スマートコントラクト

暗号通貨について簡単に説明した後に、今度はスマートコントラクトを見てみましょう。現実世界では、全ての口座の残高を記録するだけでなく、更に多くの記録が必要になる場合があります。例えば、航空券予約アプリは座席情報も記録する必要があります。現時点では、トランザクションはもはや単なる振替機能だけではなく、チケット予約などのスマートコントラクトの要求データを含むことができます。

しかしこの時に、2つのトランザクションの順序を変更すると、異なる状態になる可能性があります。たとえば、AliceとBobの両方が同じフライト席を予約すると、この席は最初に予約した人にのみ割り当てられることになります。スマートコントラクトでは、交換法則は取引間で満たされないため、取引順序も考慮するしなければなりません。

それでは、どのトランザクションが注文と関係があり、どのトランザクションが無関係かをどのように判断するのでしょうか。理想的な解決策としては、スマートコントラクトロジックに従って任意の2つのトランザクションの順序の交換が最終状態に影響を与えるかどうかを判断するための関数を書くことです。このような関数が存在する場合には、上の図が注文関連の2つのトランザクションが矢印で接続されていることを示しているように、DAG元帳のハッシュ参照によってどのトランザクションをリンクする必要があるかがわかるようになります。

しかし残念ながら、この関数は計算コストが非常に高く採用は現実的ではないため、この“完璧”な解決策はあきらめてもっと単純で実用的な方法を探す必要があります。


トランザクション照合

トランザクションの順序を設定する為に、システムに制限を設けることができます。

まず、システムの状態を各アカウントのステータスの組み合わせと見なします。2つのアカウントステータスは独立していて、他のアカウントには影響しません。あるユーザーアカウントの残高は、他のアカウントの残高が変わっても変わることがありません。また、あるコントラクトデータが別のコントラクトの影響を受けることもありません。

次に、各取引を1つのアカウントのステータスのみを変更するように制限します。たとえば、私たちのスキームにおける振替取引では、1つの口座の残高を減らすか、増やします。2つの口座の残高を同時に変更することはできません。つまり、振替取引は ‘送信取引’と ‘受信取引’に分けられます。同様に、スマートコントラクトによって呼び出されたトランザクションは、“要求トランザクション”と“応答トランザクション”に分けられます。

2つの制限を組み合わせることで照合が簡単になります。そして、同じアカウントのステータスに影響するトランザクションを注文する必要があります。さらに、要求トランザクションは応答の前に行われる必要があるため、“要求トランザクション”と“応答トランザクション”のペアも順守する必要があります。


ブロック格子

前セクションで説明した照合に続き、DAG元帳では各アカウントには順序付きのトランザクションリストがあるか“アカウントチェーン”と呼ばれる独自のブロックチェーンがあります。さらに、異なるアカウントチェーンが要求/応答トランザクションペアを介し互いにリンクすることもあります。この構造を持つDAG元帳は“ブロックラティス”とも呼ばれます。

トランザクションはブロックラティスによって順序付けられます。DAG元帳の移動順序に関係なく、元帳に記録されたトランザクションの順序に従って常に同じ状態を計算できるのです。これこそが、Viteがスマートラティスを構築の為の元帳構造としてブロックラティスを使用する理由です。他のブロックチェーンプロジェクトで使用されるTangleなどのDAG構造は残念ながらスマートコントラクトフレンドリではなく、サポートするために追加のトランザクション照合を導入する必要があります。

これは、DAG元帳の外側にスマートコントラクト専用の別のDAGを追加する事と同じであり、実装が非常に困難で複雑になります。


概要

この記事では、スマートコントラクトの実装に適したDAG元帳の構造と、Viteがそれそ採用された理由について簡単に説明しました。

さらなる詳細が必要な場合は、www.vite.orgの Viteホワイトペーパーを参照してください。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

オフィシャル:https : //www.vite.org/

Viteフォーラム:https : //forum.vite.net

Telegram:

Twitterhttps : //twitter.com/vitelabs

Discord:https ://discordapp.com/invite/CsVY76q

Reddithttps : //www.reddit.com/r/vitelabs/