ブロックチェーンの言語ではなく、金融言語で作成
2020年10月13日Prof Simon Thompson 読了時間12分
不定期な技術ブログ、「Developer Deep Dive(開発者が掘り下げる)」シリーズでは、IOHKの研究者やエンジニアを招き、最新の作業やインサイトについて紹介します。
Marlowe(マーロウ)はセキュアな金融スマートコントラクト用ドメイン専用言語で、CardanoブロックチェーンGoguen期の機能としてIOHKが開発しています。本Deep Diveシリーズに投降した「Marlowe紹介」記事に続き、本稿ではこの言語の詳細と、分散型金融(DeFi)に向かう中でのMarloweスマートコントラクトのさまざまな記述方法を説明します。まず「実世界」の情報を実行中のコントラクトにインポートする、というオラクルへのアプローチを説明したのちに、金融コントラクトのためのAlgorithmic Contract Types Unified Standard(アルゴリズムのコントラクト型統一規格:Actus)に注目し、このイノベーションをMarloweに実装する方法を説明します。
Marloweの概要
Marloweは一握りの構成モデルを備えた小規模な言語です。このモデルは固定的かつ限定的な一連の役割の行動を説明するものです。
- 実行中のコントラクトは1つの役割または1つの公開鍵への支払いを行うこともできます。
- 補完的な方法で、コントラクトは役割の1つがアクションを起こすまで待つこともできます。例えば、デポジットを払ったり、オプションを選んだりするなどです。重要なことは、コントラクトが永久に待ち続けることはできないということです。所与の時間内にアクションが実行されなければ(タイムアウト)、コントラクトは別の行動、すなわちコントラクトに保持されている資金の返金などにシフトして継続されます。
- コントラクトの現状に応じて、その後に2つのアクションのいずれかを選ぶように設定することもできます。これ自体がコントラクトになります。
- それ以上のアクションが不要の場合、コントラクトは終了し、コントラクト内の残りの資金は返金されます。
コントラクトが実行されると、関連する役割は参加者によって占められます。参加者はブロックチェーンのアイデンティティです。このモデルでは、コントラクト実行中に役割を移行することができるため、実行中のコントラクトの役割をトレードすることもできます。各役割はチェーンのトークンにより代表され、これを移行することは役割の行動を実行する能力を移行することになります。さらには、1つの役割を複数のトークンに代表させることもできる、すなわち役割を共有することもできます。これは、「証券化」と呼べるかもしれません。
Marloweシステム
私たちは言語をできる限りシンプルにするよう、意識的に努めています。これは、Cardanoへの、そしてMarlowe Playgroundへの実装を簡単にするためです。Marloweは参加者間の暗号通貨の流れを説明します。そしてこれが実際問題としてCardanoブロックチェーンに実装されるために、コードはオンチェーン、オフチェーンの両方で実行される必要があります。ただし、両部分を説明するのに、1つのMarloweコントラクトで済むことを忘れないでください。オンチェーンの部分は、スマートコントラクトの要求に沿ったトランザクションを受け付け、検証します。この部分は、すべてのMarloweコントラクト用の単一Plutusスクリプトとして、トランザクション経由で受け渡されたデータからなる特定のMarloweコントラクトとともに実装されます。オフチェーンでは、Marloweコントラクトはユーザーインターフェイスおよびウォレット経由で表示され、デポジットおよび選択を提供、実際には自動化するとともに、暗号通貨による支払いを受信します。
図1:コントラクトの行動をシミュレーションするMarlowe Playground
Playgroundでは、コントラクトのとる行動をシミュレーションできます。したがって、潜在的ユーザーはコントラクトが参加者がとる異なるアクションに応じてどのように進むか、さまざまな方法を試してみることができます。図1のメインシミュレーションでは、ユーザーは全体を見渡すことができ、どの参加者によるアクションも実行できます。この際、各時点でいったん実行したアクションを取り消し、異なる道をとることもできます。ウォレットシミュレーションでは、ユーザーは特定の一人の参加者の視点に立って行動を見ることができます。したがって、実行中のコントラクトがブロックチェーンに配信された際に、そのユーザーがどのようにこれとやり取りするのかをシミュレーションすることができます。
このようにシンプルなため、システムのプロパティを自動的にチェックするロジックシステムであるSMTソルバーで、Marloweコントラクトをモデル化することも可能になります。このモデルを使って(静的解析と呼びます)、各コントラクトについて支払いの履行が損なわれる場合があるかどうか、そして、もし失敗するとして、それがいかに失敗したかのエビデンスが得られるか、作成者が狙い通りにコントラクトを作成するのに役立てるかをチェックすることができます。
私たちは実装の形式モデルをプルーフアシスタントに構築することができます。ここでは、言語の行動方法について機械で確認した証明を作成することができます。AMTソルバーが個々のコントラクトで使用できるのに対し、プルーフアシスタントはコントラクトのテンプレートおよびシステム自体のプロパティを証明します。例えば、実行中のいかなるコントラクトにおいても、その参照するアカウントが決して借方になりえないということを示すことができます。シミュレーション、静的解析、証明により、ユーザーが資産を預けることになるコントラクトが、想定通りに確実に作動するよう補完的な保証レベルが提供されます。
Marloweコントラクトの作成
ここまでMarloweコントラクトがさまざまな方法で分析できることを見てきましたが、次に実際にMarloweでスマートコントラクトを作成する方法について説明します。Playgroundを使用すると、複数の方法でMarloweコントラクトを作成することができます。Marloweを直接書くこともできますが、初心者の多くは、インタラクティブなBlocklyエディターを使用してコントラクトを視覚的に構築することを選びます。図2はエスクローコントラクトのセクションを示しています。
図2:インタラクティブなPlayground Blocklyエディターのエスクローコントラクト
このビジュアルエディターで作業すると、選択したすべてのオプションが、作成中のコントラクトの中でどのような部分を占めていくかを表示できるという利点があります。また、コントラクトをHaskellで作成することもできます。Marlowe DSLは実はHaskellに埋め込まれているからです。図3は同じコントラクトをHaskellで作成したものです。青と紫の部分がMarlowe、黒のコンポーネントはHaskellで定義されています。略語でコントラクト全体が比較的読みやすくなっています。このアプローチにより、ユーザーはステップごとにコンポーネントからスマートコントラクトを構築できます。図3で示されたコードでは、aliceとbobという役割はそれぞれ選択をするよう要求されています。双方の選択が合致した場合、彼らは同意に至り、コントラクトは一方向に進みます。そうでない場合、第3の参加者であるCarolが両者を仲裁するよう要求されます。コントラクトの同意および仲裁は後にHaskellファイルで定義されます。
図3:Hakellでのエスクローコントラクト
ユーザーは、JavaScriptを使用して金融スマートコントラクトを作成することもできます。この際、解析、シミュレーション、証明はMarlowe実装により提供されているままに使用可能となります。
オラクル
Marloweを説明した際にまず質問を受けるのは、金融オラクルについて、もしくは、ADAとビットコインの為替レートといった外部のデータ値をいかにコントラクトに取り入れられるかという点です。抽象的には、オラクルは選択をする参加者のようなものです。したがって、Marloweのセマンティクスはすでに外部の値を処理することができます。しかしながら、私たちはオラクル値を実装の一部としてサポートし、コントラクトが株式市場のティッカーやCoinbaseなどのデータフィードから直接値にアクセスできるようにする予定です。同時に、Plutusチームはオラクル処理一般の最適な方法について研究を進めており、ここからのサポートも当然期待できます。ただし、MarloweおよびPlutus Application Freameworkの最初のフルリリースには間に合わないでしょう。
金融コントラクト用Actus
Marloweは人々に金融的制約や取引きを第三者による仲介なしに実行する機会を与える可能性を持ちます。コントラクトの順守はブロックチェーンが保証します。
私たちは、第三者による介入のないP2Pの金融取引きを望むエンドユーザーに提供するために、中間段階のないコントラクトのMarlowe実装を構築しています。
Actus金融調査財団は金融コントラクトを技術的仕様で詳細に説明される分類法でカテゴリー化しています。
Actusは、2者(またはそれ以上)間の将来のキャッシュフローの交換における法的同意である、という理解に則って金融コントラクトを構築しています。歴史的に、このような法的同意は自然言語で説明され、それがあいまいさや意図的な多様性につながっています。これを受けて、Actusはコントラクトを契約用語や、これらの用語を将来の支払い義務にマッピングする確定関数を用いて定義します。したがって、ほとんどの金融商品は31のコントラクトタイプまたはモジュラーテンプレートで説明することが可能になります。
次にシンプルな例を採り、Actus実装への私たちのアプローチの全体像について、さまざまな長所短所を提供する補完的なアプローチを使用しながら説明します。
最初のActus例
ゼロクーポン債は、利息(クーポン)は支払われないが割引価格で発行される債券であり、満期時に債券が額面価格と引き換えられることで利益をもたらします。
例えば図4は、投資家が1,000 lovelaceの債券を15%割引で購入できる契約を示しています。投資家は開始時間(ここではスロット10)の前に債券発行者に850 lovelaceを支払います。
その後、満期日のあと(ここではスロット20)、投資家は債券を想定元本の全額、すなわち1,000 lovelaceと引き換えることができます。
図4:15%割引のゼロクーポン債券のコントラクト
このコントラクトには大きな欠点があります。投資家が850 lovelaceを預け入れたら、すぐに発行者に支払われます。投資家が間に合うように素早く投資しない場合、つまりタイムアウトの前に、契約は終了します。その後、次の2つの結果が生じ得ます。
- 発行者は1,000lovelaceを投資家のアカウントに預け入れ、その総額が直ちに投資家に支払われる。
- 投資家が預け入れを行わない場合は、コントラクトは終了となり、コントラクト内のすべての資金は返金される。しかし、この時点でコントラクトには資金が入っていないため、投資家は資金を失う。
この債券発行者による不履行の問題は、どのように回避できるでしょうか。これには少なくとも2つの解決方法があります。まず、発行者にコントラクトの開始前に全額を預け入れるように頼むことができます。しかし、これはそもそも債券を発行しようとする目的に反します。より現実的には、ここで示されるように、第三者に取引きの保証人を依頼することができます。
図5:保証人で改良されたコントラクト
MarloweにおけるActus
満期契約の元本などアクタス分類における商品は、契約期間中に条件の変更をどの程度受け入れられるかに応じて、Marloweでさまざまな方法で提示できます(図6)。
図6:Actus分類とMarlowe
最も単純なケースでは、すべてのキャッシュフローはコントラクトの開始時に設定または凍結されるため、すべての参加者がコントラクトの有効期間中これに関与し続けると仮定すると、コントラクトがどのように機能するかを完全に予測することができます。この種のコントラクトを、ここではActus-F(Fは固定のFixedまたは凍結のFrozen)と呼びます。
コントラクト進行中の変化であるダイナミズムは、2つの方法で起こり得ます。参加者は予定外の支払いを行うことができます。これは残りのキャッシュフローの再計算を必要とします。また、外部のリスク要因を考慮してキャッシュフローを変更することもできます。両方を行うコントラクトを完全に一般化したモデルがActud-M(Marlowe)です。
また、その中間レベルのものもあります。Actus-FSは、固定スケジュールをモデル化したものです。リスク要因を考慮することができますが、予定外の支払いはできません。反対に、Actus-FR契約では、予定外の支払いを行うことはできますが、リスク要因は考慮されません。
最後に、Marloweの外部に目を向けると、Actus-H(Haskell)は、コントラクトロジックのMarlowe記述からPlutusコードを生成することにより、契約期間中の各トランザクションの検証にMarloweを使用して、PlutusまたはHaskellのプログラムとしてコントラクトを直接モデル化します。
Actusコントラクトのさまざまなモデルが提供されているのは、コントラクトの動的な性質と、コントラクトの実行前に契約がどのように実行されるかについてユーザーに提供できる保証との間にはトレードオフがあるためです。
- Actus-Fコントラクトは、完全に固定された支払いスケジュールを提示します。これは、参加者が直接精査できるため、例えば、そのようなコントラクトによるすべての支払いが成功することを簡単に確認できます。
- Actus-FSおよびActus-FRコントラクトはより動的なものですが、コントラクトは読みやすく、精査しやすいものです。さらに、例えばすべての支払いが成功することを確証するために、(より遅い)静的解析の対象となります。
- Actus-MコントラクトはMarloweで表されるため、解析が可能です。ただし、特定の時点でコントラクトが実行するアクションが予測できないため、解析は大幅に遅くなります。ちなみに、縮小版のコントラクトに対しても保証を提供することは可能です。この場合、コントラクトの計算内容は同じですが、より短時間のうちに進行するため、関連するやり取りは少なくなります。
- Actus-HのコントラクトはPlutusとMarloweを組み合わせて記述します。したがって、その他と同じ方法による静的チェックには適しません。ただしこのプラットフォームは、企業クライアントにActus規格を実装するうえで完全な拡張性と調整能力を提供します。
Playgroundの[Labs]タブでプレリリースバージョンとして利用できるActusの実装では、ユーザーは、必要なデータの視覚的な表示を使用して、契約条件からActus-FおよびActus-FSコントラクトを生成することができます。
図7:※の付いた3つのアイテムは満期コントラクトの元本で必要
満期コントラクトの元本には、開始日および終了日、そして、コントラクトの想定元本という3つのアイテムが必要です(したがって、テンプレートには※が付いています)。このようなコントラクトは、その開始時に想定元本が相手方から当事者に移され、満期日に逆方向に移される単純な処理で構成されます。
アイテムを追加すると、それに応じて生成されるコントラクトは変化します。図7では、当事者は満期日に想定元本とプレミアムを相手方に譲渡する必要があるため、相手方に最初にローンを組むインセンティブを与えます。
スマートコントラクトでDeFiの世界へ
これまで見てきたように、今や金融の専門家や開発者は、自分の持つプログラミングの専門知識に応じて、HaskellまたはMarloweそのもので直接、またはMarlowe Playgroundを使用して視覚的に金融スマートコントラクトを作成し始めることができます。Playgroundでは、作成したコントラクトをシミュレーションおよび解析して、それらが適切に機能し、CardanoのGoguen期が実装されたときに分散型金融の世界で通用するものとなっているかテストすることができます。IOHKのMarloweチームは、CardanoへのMarlowe実装の仕上げに備え、ブロックチェーン自体に金融スマートコントラクトをもたらすため、Actus規格からの例の実装を継続します。
それまでの間、今月ワイオミングハッカソンの一環として開催中の賞金5,000ドルをかけたMarloweベースのActusチャレンジで、自分のスキルをテストしてみたいという場合は、まだ間に合います。