【超訳カルダノ】「Plutus(プルータス)」徹底解説!2022年6月HF

本記事は、2022年4月に公開された「Cardano Mid Month Development Update」における、IOGのプルータス設計者であるジョン・ウッズ氏(John Woods)の「Cardano Technical Briefing: Plutus」を、CoffeePoolが独自に翻訳・編集したものです。

——————————————————————————

こんにちは、IOGでCardanoアーキテクチャのディレクターを務めているジョン・ウッズです。今日はPlutusについて少しお話します。
私たちは、2022年6月にCardanoプラットフォームとPlutusの両方において、大きな変更を展開する予定で開発を進めています。
カルダノにおいて、Plutusとはスマートコントラクトのことを指します。6月に導入される変更点は、このPlutus全般における大きな機能強化を意味します。
今回は、このPlutusの基本に立ち返ってお話ししたいと思います。
まず、今回のお話の概要を説明しましょう。
まずは、Plutusが実際にどのようなものなのか、その背景を説明するつもりです。
EUTxO(Extended Unspent Transaction Outputs)」 は、Plutusモデルの中核をなす存在です。
「Plutusのアーキテクチャ」では、Plutosスクリプトとの対話(Interaction)の仕方についてお話します。
CIPs(Cardano Improvement Proposals)とは、Cardanoの改善提案であり、今後予定されているいくつかの改善点のことを指します。

「Plutusにおける決定論、並列性、並行性」では、それらの価値についてお話します。最後に、簡単にまとめを行います。

プルータス(Plutus)の役割とは?

PlutusはCardanoのスマートコントラクトプラットフォームであり、様々な技術が組み込まれていますが、特筆すべき点として、ブロックチェーン上にdApps(分散型アプリケーション)を作成することを可能にします。
また、Plutusは今年人気を博したNFT(non-fungible tokens)も作成可能にします。NFTは、暗号通貨による新たな収集方法やユースケースへの扉を開きます。
さらにPlutusによって、Cardano上で「ネイティブアセット」を起動することもできます。
ネイティブアセットとは何かというと、あなた自身のコイン、トークン、通貨という意味です。つまりPlutusは、カルダノ上にあなたのお好みのアセットを立ち上げるためのゲートウェイだといえます。
そして、Plutusは任意のオンチェーン条件ロジックを可能にします。つまり、Plutusはカルダノ・ブロックチェーン上において、Excelでいう「if構文」のようなプログラム構築を効果的に実現します。

EUTxO(拡張UTxO)とは何なのか?

次に「EUTxO(拡張UTxO)」についてお話しましょう。ここでは、ビットコインのような標準的なUTxOモデルとの違いについてお話しましょう。
カルダノに実装されたEUTxOでは、オンチェーンにおけるプログラム可能性やスマートコントラクトが実現しています。EUTxOを構成するコンポーネントを見てみましょう。
構成要素の1つめは「コントラクト(契約)」です。
「スマートコントラクト」は バリデーター(検証者)やスクリプト(プログラムのコード)と呼ばれることもあります。これはUTxOをロックする錠前、もしくはADAやCardanoブロックチェーン上の価値をロックする錠前と考えることができます。
 NFTや他のネイティブアセット、例えばあなたが立ち上げたコインをロックするのにも使うことができます。
2つめは「Redeemer(買戻人)」です。Redeemerとは「鍵」のようなもので、この場合の鍵(Redemeer)は、スマートコントラクトのユーザーから渡されたデータの一部で、それらの資産の錠前を解除し、ロックされた資産を使えるようにします。
3つめは、「Datum(デイタム、dataの単数形)」です。DatumはUTxOのアウトプット内に存在する、ある種のデータ状態です。 Datumはハイスコアやメタデータなどアプリにとって、「重要なデータを保存する場所」と捉えても良いでしょう。簡単にいえば、Datumは、「スマートコントラクトのハードディスク」のようなものです。
そして最後が「Context(コンテクスト、内容)」です。これはまさにメタデータのような概念で、「誰が署名したのか?」「どの口座に使われているのか?」というように、トランザクション内容を調べることができます。

EUTxOを簡潔に表現するなら、この4つの項目を合わせたものだということができます。そして、このEUTxOこそ、Cardano上であらゆるクラスのスマートコントラクト、Defi、その他のWeb3アプリケーションに欠かせないものなのです。

Plutus(プルータス)の仕組み

それでは、Plutusの構造についてお話しましょう。これは実に興味深いものだと思います。このスライドは、コードからオンチェーン・アプリになるまでのプロセスを説明しています。
もちろんPlutusは、まず開発者が起点となります。
開発者はdAppのソースコードを書くことからスタートします。現在、すべてのPlutusの「コントラクト」は、関数型プログラミング言語であるHaskellで書かれています。将来的には、他のプログラミング言語や、特定のユースケースを簡単にするためにDSL(ドメイン特化言語)などのサポートも予定しています。
次に、ユーザーコードから始めて、最終的にオンチェーンスクリプトを完成させる

過程を見てみましょう。
まず、コンパイラ(プログラム言語を機械言語に変換する処理)のパイプラインから始まります。
開発者が書いたHaskellコードは、Plutus IR(中間表現、Intermediate Representation、コンパイラによって内部で使用されるコード)に変換されます。IRについては、LLVM(任意のプログラミング言語に対応可能なコンパイラ基盤)などの仕組みをご存知の方は理解しやすいと思います。
もちろん、ブロックチェーンにおけるスマートコントラクトのコードであろうと、WindowsやMac OS、Linuxのアプリであろうと、あらゆるコンテクストでも言えることで、どんなプログラムでもこのようなパイプラインを通ります。

このIR(中間表現)が得られると、開発者によって書かれたソースコードを成形し、機械処理をより効率的にする機会が与えられます。プログラムを実行する際には「実際に実行を行う機械言語によって、どのようにアプリケーションが表現されているか」というのが、非常に重要な要素となるためです。
Haskellのソースコードは、この中間表現に至る前に、さまざまな最適化段階を経ることで、非常に高速なアプリケーションを実現することが可能です。
このIR(中間表現)から、「Typed Plutus Core」に進みます。これは、チェーン上で実行される「1と0」の数値の直前に当たります。

では、なぜこのようなものがあるのでしょうか?
それは開発者にとって便利なアイテムだからです。Typed Plutus Coreは、プログラムにおいて非常に下の階層に位置しますが、開発者がデバッグするために有用な追加情報が存在します。
最後に、ラムダ計算の変種である「Untyped Plutus Core」に移行します。これは基本的にアプリを表現する論理的な方法です。Untyped Plutus Coreはオンチェーンで実行されますが、その「Untyped Plutus Core」やコンパイルされたアプリは、どのようにしてオンチェーンで実行されるでしょうか?

ここまでで説明した最適化プロセスを経て、スクリプトはツールキットや他のPlutusアプリと一緒にオンチェーンに書き込まれます。
私たちは、このようにコンパイルされたアプリケーションをオンチェーンに注入するためのさまざまなアプリケーションを提供しています。

もちろん、オフチェーンコードについて言及することも忘れてはいけません。
オンチェーンコードがコンパイルされ、チェーン上で動作するようになったとしても「オフチェーンコンポーネント」が必要となります。オフチェーンコンポーネントは、オンチェーンアプリと連携に必要なアプリケーションで、トランザクションを正しく形成することができます。
つまり、オンチェーンアプリは、そのアプリへ正しいトランザクションを構築し入力を手助けするツールが必要となります。
この場合、前述した「Redeemer(買戻人)」や「Datum(デイタム)」などへの入力が必要となります。
ここでもやはり、ユーザーのソースコードからスタートします。人間が書いたコードをできるだけ効率的にするために、コンパイラのパイプラインを通して「1と0」の数値にまで落とし込みます。これによって最終的にPlutusのコアスクリプトができ、それを我々のツールを使ってオンチェーンに注入します。
オンチェーンスクリプトは我々のLedger APIで処理され、最終的にPlutusのコアエバリュエータで分散的に実行されます。
もちろん、オフチェーン、あるいは開発者の皆さんはご存知の通り、Contract Monadは、正しい取引を形成することでこのオンチェーン成分と対話できる方法になります。

Plutus(プルータス)の連携プロセスについて

それでは、Plutusの連携(インタラクション)に移りましょう。
これらのスクリプトを使って、実際にDEXや他のDefiアプリと連携する場合に、どのような使用感となるのかを見ていきます。
では、オフチェーンアプリはPlutusのコントラクトとどのように対話するのでしょうか?
これはイーサリアムでの動作と異なるため、興味深いものだと思いますし、6月のアップデートで変更される予定です。

現在、開発者はPlutusのコントラクトと次のように連携します。コードを書き、コンパイルし、トランザクションを生成します。そして、楕円曲線暗号という技術である「edwards25519」を使い、「ed25519」という署名を使用します。これは署名アルゴリズムで、自分の秘密鍵でトランザクションに署名する仕組みです。
このトランザクションはチェーン上に送信され、Ledger APIによって実行されます。
しかし、ここで気づくべき重要なことがあると思います。
Plutus dAppsやPlutusスクリプトは、ユーザーがこれらと連携するまではチェーンに書き込まれないということです。
つまり、Plutusスクリプトとやりとりするたびに、チェーンに送信するトランザクションにPlutusスクリプトを含める必要があるのです。
しかし、この点が2022年6月末のハードフォークによって変更される予定です。

CIPと、今後のハードフォークによる変更点について

それでは、いくつかのCIPと、これから行われる改善案について見てみましょう。これから紹介するCIPは、Plutusをより良くしていくために提案されたものです。

CIP-31 Reference Inputs

CIP-31では、「Reference Inputs(リファレンス入力)」というものが定義されています。これは、開発者がUTxOとやりとりする方法に大きな変化をもたらす提案です。
先ほど、Datumというハイスコアなどのデータを保存するスクリプトのハードディスクについてお話しました。
現在、もしあなたがdAppでハイスコアを読みたいなら、UTxOを消費し、Datumを読み込んだ後にそれを再作成する必要があります。しかし、6月に登場するCIP-31では、このプロセスが変更されます。CIP-31では、UTxOを消費して再作成することなく、DatumやUTxOに格納されているデータを読み取ることができるようになります。
これは複数のdAppが同じDatumから同時に読み取れることを意味し、そこでのメリットは明らかだと思います。

CIP-32 Inline Datum

CIP-32では、「Inline Datum(インライン・デイタム)」を定義しています。私が先ほど話したハイスコアやデータは、現在は実際にはチェーン上に保存されておらず、チェーン上のハッシュやフィンガープリントを保存し、開発者やユーザーがスクリプトとやりとりする際に、それを含めることができる仕様になっています。
しかし、今後は実際にデータをオンチェーンに保存することができるようになり、真の分散型アーキテクチャに大きく近づくでしょう。

CIP-33 Reference Scripts

CIP-33の「Reference Scripts(リファレンススクリプト)」も重要な変更点です。
Ethereumではコントラクトがチェーン上に存在し、リファレンスを用いてコントラクトと会話します。
一方、前のスライドで説明したように、カルダノではまだそのようなことはできません。スクリプトと対話するたびに、トランザクションにスクリプトを含めなければなりませんでした。
CIP-33では、スクリプトをチェーンやコントラクトにプッシュできるように変更されました。チェーンにプッシュして、リファレンスを通じてスクリプトとやりとりできるようになります。
つまり、これはスマート・コントラクトとやりとりする上で非常に軽量な方法となります。アプリのロジックをすべてトランザクションに入れるのではなく、電子メールアドレスのような小さなアドレスを取引に含めるだけで、チェーン上にすでに存在するスクリプトを指し示すことができます。実にクールな変更点ですね。

暗号技術面での変更点の数々

また、ビットコインや他のチェーンなどの暗号通貨において、Cardanoとは異なる楕円曲線暗号技術(Elliptic Curve Cryptography、ECC)を使用できるように、暗号通貨業界にクールでギークな仕組みを導入していく予定です。
私たちは前述した署名アルゴリズム「edwards25519」を使用していますが、これはMoneroなど他の暗号通貨と同じものです。しかし、ビットコインやイーサリアムなどは、コブレット型のECC上にある「secp256k1」を使っています。
そこで、カルダノにビルトインサポートを導入し、それらの他のブロックチェーンからの署名アルゴリズムとやり取りできるようにする予定です。
以前は開発者が手作業で行っていましたが、ビルトインされたことで非常に簡単になり、異なるECC間でのやり取りをワンライナーでできるようになりました。
さらに、「ペアリングベースの暗号」というエキゾチックな技術も導入しています。
ペアリング暗号は今回のお話の範囲外ですが、ペアリングに適したECC(楕円曲線暗号)である「Bls 12381」の拡張フィールドにおける基本プリミティブのサポートを提供する予定です。
これにより、ペアリング暗号を使った全く新しいアプリケーションのクラスが開かれることになります。同型加法署名を使って、非常にクールなことができるようになります。

私たちはPlutusをより高速化しています。コア・インタプリタは先ほど説明したUntyped Plutus Coreや0や1からなるアプリケーションを実行するものです。このインタプリタはより高速で高性能になり、様々な点で役に立ちます。
ブロックの検証を迅速かつ効率的に行うことができ、ブロックの伝搬にかかる時間を短縮することができます。実際、アプリを高速で実行するのに役立つので、次のアップデートではスクリプトサイズやLambda表現を20%縮小しました。
インタプリタは40%高速化され、評価以外の処理も80%高速化されました。これはコードを実行するのではなく、データ処理とコスト・モデリングのような他の処理を行うためです。

CIP-40 Collateral Outputs

私たちは、Collateral Outputs(担保出力)についていくつかの問題を抱えていました。Plutusスクリプトとやりとりする際、スクリプトがフェーズ2認証に失敗したときのために、トランザクションの一部として担保を用意しなければなりません。
フェーズ2検証とは通常、Plutusスクリプトはチェーンに送信される前に、正しく実行されることを確認します。
これは決定論であり、イーサリアムのような他のコントラクトプラットフォームに対するPlutusの長所の1つです。それは素晴らしいことですが、悪意ある人物が、失敗するとわかっているトランザクションを作成したらどうなるのでしょうか。
このトランザクションで第一段階の検証を行い、それをチェーンに提出してしまうということは、ウォレットやハードウェアウォレットでの悪例として起こっています。この場合、失敗したトランザクションにおいても最終的に担保を取られてしまうことになり、手数料を取りすぎているような状況となっています。
これでは、良いユーザーエクスペリエンスには繋がりません。

そこで、担保を含めた取引を行う方法を考案しました。担保に入れるのは必要な分だけで、もし100万ADAのように誤って多く入れてしまった場合は、すべてを取り返すことができるのです。このような担保は必要ありませんから、担保を扱うためのより良い方法ができました。これはすべて、Plutusを素晴らしいユーザーエクスペリエンスにするための旅の一部です。

決定論、並列性、並行性

ここで、決定論、並列性、並行性についてお話ししましょう。これらはPlutusプラットフォームの長所です。これはユニークなセールスポイントで、Cardano上で構築するのと他のプラットフォームで構築するのとでは何が違うかというと、かなり素晴らしいことに気がつくと思います。
決定論と検証の並列性ということですが、「direct acyclic graph(有向非巡回グラフ)」という概念があります。これは、データを蜘蛛の巣のように考えることができる、という考え方です。
小さなノード、小さな円があり、そのノードには次のノードへの線があり、さらに次のノードへの線があり…、という具合に、大きな網が広がっているのです。
このウェブやグラフを有向無サイクルグラフと呼びますが、特に一方向に進む場合はそう呼びます。Cardano Ledgerは、トランザクションのグラフを形成しています。優れたグラフというのは、並列処理に最適です。Hydraがそうであり、連鎖再認証がそうです。
CardanoはUTxOsの仕組みによって、定義上並列処理を可能にします。つまり、Plutus Coreは決定論的であり、スクリプトはローカルな情報にしかアクセスできないので、Plutusスクリプトの検証とLedgerの検証の両方で、多くのことを効果的に並列処理することができるのです。

コンテンションとアプリケーションの並行性

ここで、コンテンションとアプリケーションの並行性について見てみましょう。
基本的に、UTxOは一度しか使うことができません。複数のエンティティ(機関)やアクター(ユーザー)が同じUTxOを同時に使おうとするようなアプリケーションやdAppは、そのUTxOで競合するか、最終的にブロックされることになります。私たちはこれ以上のことを実現することができます。


Cardanoで構築するときに覚えておかなければならないのは、より良い並行性(Concurrency)は、複数のUTxOを使用することで実現でき、また前のスライドで説明した並列性を利用すれば、このスタイルで構築することができる、ということです。
超並列で、すべてのユーザーに同時にサービスを提供することができるスケーリングアーキテクチャです。

また、6月には、先ほど説明したReference Inputsにより、UTxO上に存在するDatumを複数のアプリで同時に読み出し専用でアクセスできるようになります。

それでは、簡単にまとめまていきましょう。Plutusは他のプラットフォームとは実行方法が異なりますが、競合製品と同等、もしくはそれ以上の能力があります。
しかしPlutusは、私が説明した付随的出力のようなユーザー体験と、Plutusインタプリタにもたらされる強化を見てきたパフォーマンスの両方の面で、さらに良くなろうとしています。
Plutusの基礎的な部分を楽しんでいただければと思いますし、今後5年間、最も素晴らしいスマートコントラクトプラットフォームになるであろうものを構築することを楽しんでいただければと思います。ありがとうございました。

 

委任のご協力をお願いします🙇‍♂️
●本稿はカルダノステークプール「Coffee Pool」が作成しました。
COFFEの活動を応援いただける方はぜひ、COFFEへの委任をいただけたらと思います!
NAME:CoffeePool☕️
Ticker:COFFE
Poolid:1d2972246d8adda98836626a34e337525f5206e552715d28379b5fdb