Duncan CouttsとEdsko de Vriesが紹介する舞台裏
2020年4月30日 Anthony Quinn 読了時間11分
昨年インセンティブ付きテストネットの公開がShelley(シェリー)期の到来を告げて以来、Cardanoプラットフォームの開発スピードは加速しています。Cardano Byron(バイロン)と暗号通貨ADAを30か月にわたりサポートしてきたOuroboros Classic(ウロボロスクラシック)コンセンサスプロトコルは、Cardanoの分散化に伴い初期のShelleyにパワーを与えるプルーフオブステーク(PoS)プロトコルバージョン、Ouroboros Praos(ウロボロスプラオス)にまもなく切り替わります。これにより、ステーキングプロセスに、ADA保有者およびステークプールオーナーへの金銭的報酬が構築されます。
2月20日、メインネットをオリジナルのコンセンサスプログラムであるOuroboros Classicから更新バージョンであるOuroboros BFTへと切り替えるハードフォークにより、Cardanoはアップグレードされ、Ouroboros BFTの下での移行期に入りました。これは敵対的行為を防ぎながらPraosへの切替えを促進するようにスリム化したプロトコルバージョンです。このハードフォークは、多くの人に気付かれることなく実施されました。Daedalusウォレットのユーザーにとっては、標準的なソフトウェアの更新にすぎず、取引所は手動のアップグレードが必要でしたが、数週間の猶予があり、サポートが提供されました。
次に実施されたのは3月30日のByronリブートです。ここでは、委任や分散化をサポートする新ノードや、今後のShelley機能など、多くのCardanoコンポーネントで完全に新しいコードがリリースされました。新コードベースの大きな利点は、モジュラー式に再デザインされたことです。このため多くのコンポーネントを他に影響を与えることなく変更できるようになりました。
次に、BFTはShelleyハードフォークへの出発点として機能します。ハードフォークはHaskellテストネットで十分な成果が得られ次第実施されます。この2回目のハードフォークも2月のものと同様、取引所、ADA保有者、ウォレットユーザーにとってはイベント性のあるものにはならないと想定されています。
ただし、表面上はすべてがスムーズに見えても、見えないところで様々な活動が行われています。なめらかに水面を進むカモが水中で猛然と足をばたつかせているように、我らがブロックチェーンエンジニアたちは懸命な取組みを続けています。
今回、Cardanoプロジェクトをけん引する2人のエンジニア、Duncan CouttsとEdsko de Vriesにその行程を紹介してもらいました。Duncanは3年間にわたりCardanoのアーキテクチャーを担当。Cardanoの開発に使用されているプログラミング言語Haskellの使用経験は、DuncanとEdskoの2人を合わせて35年に及びます。
Duncan、どのように行ったのですか。
Cardanoロードマップで説明しているように、IOHKのブロックチェーンエンジニアたちはスムーズなコード更新を確信しています。Ouroboros ClassicからPraosへ1回の更新でジャンプすることを試みるよりも - これは信じられないほど複雑なタスクですから - Ouroboros BFTを仲介として使用した2段階アプローチをとっています(図1)。BFTコードはByron期の連合型ノードとも、ByronリブートでリリースされたShelleyスタイルのノードとも互換性があります。これはリレー競争のようなもので、1人のランナー(この場合、1つのプロトコルを実行)が、次のランナーが待つテイクオーバーゾーンに入る、2人のスピードが同調する(したがって、完全に相互互換性を持つ)、バトンを渡す(メインネットを操作する)、バトンを受け取ったランナーがテイクオーバーゾーンから次のラップへと進む、という流れになります。
図1:ByronからShelleyへのメインネットロードマップ
Daedalus Flightプロセスは新しいウォレットの迅速な開発およびテストに役立ちます。そして、全員がこれをメインネットで実行し、私たちがコアノードの交換を終えたら、旧コードは不要になります。今はこの移行段階にあり、Daedalusの新しいメインネットウォレットは4月24日にリリースされました。
私たちの目標は、IOHKのトップであるCharles Hoskinsonがハードフォークについてのホワイトボード動画で説明する、「Shelleyへの優美な入場」です。この動きに欠かせないツールが、ハードフォークコンビネーターです。
農業機械のような名前ですね。どのようなものですか。
コンビネーターは別々のものを組み合わせる単なる技術用語です。例えば、足し算は数字のコンビネーターです。ハードフォークコンビネーターは2つのプロトコルを1つのプロトコルに組み合わせます。私たちはこれを2プロトコルのシーケンシャルコンビネーションと呼びます。なぜならまず1つ目のプロトコルをしばらく稼働させ、ある時点で2番目のプロトコルに切り替えるからです。このケースでは、Ouroborosの2バージョン、BTFからPraosへの移行になります。
何よりも優れた点は、個別のモジュールを使用していることです。モジュール同士やブロックチェーンについて可能な限り何も知らずに、各々が役割を果たします。ここで重要なのは単純さであり、この詳細を排除するプロセスを私たちは「抽象化」と呼びます。ほとんどのコンセンサスモジュールは、暗号通貨を処理していることすら知る必要なく、ほぼ何でもブロックチェーンに入れかねません。例えば、ポケモン台帳を例にOuroborosブロックチェーンのセミナーを開催したことがあるのですが、ここで異なるのは台帳ルールのみであり、コンセンサスはすべて同じです。これを単にセットアップして - プログラミング用語でいう「インスタンス化」 - UTXOスタイルの会計処理の代わりにポケモンがプレーできるようにします。(技術に関心のある読者は、Edskoによる「抽象化」プロセスおよびコンビネーターについて掘り下げた今後配信されるブログをご覧ください)
あなたが言うとシンプルに聞こえますが。
実際、これは厄介なんです。というのもCardanoは暗号通貨ADAだけでなく、他にもいろいろ同時に実行していますから。キャンピングトレーラーを引きながら運転中に車のタイヤを全部交換するようなものだと考えてください。完全に信頼できる方法で、実行できると確信が持てなければならないのです。
一回きりのタスクとして取り組むこともできたのですが、プロトコルコンビネーターを使用したジェネリックな方法で行う方が理にかなっていました。この路線を選んだのはよりよい結果を得るためであり、コードを確実に作動させるのに欠かせないテストがずっと簡単になるからです。それに加えて、今後もハードフォークの機会はでてくる。それを考えればこの選択はより明白になるでしょう。例えば、Cardanoの開発がさらに進み、Goguen(ゴーグエン)期、Basho(バショウ)期、Voltaire(ヴォルテール)期に移行するたびに、各ステージで少なくとも1回はハードフォークが実施されますから。
厄介な部分はどのように対処したんですか。
まず、参照すべき研究なしで行わなければなりませんでした。研究者は、シングルプロトコルをフリースタンディング、完成されたものとして説明していましたが、そんなものはありませんでした。別で使っていたチェーンでPraosを始動しようとしていたんです。Edskoが取り組んでいた、ジェネリックな方法を使用してあるプロトコルから別のプロトコルへ移行する、というのは、研究でカバーされていませんでした。これが実は難解かつ複雑で、すべてのディテールが、頭を掻きむしらんばかりの多くの思索を必要とします。でもCardanoコードベース間での切替えというのは、学術的に報告されるようなものではないのです。新たな切り口がなく、単に実装に関する問題と見なされているので。
Edsko、例を挙げてもらえますか。
Duncanが言ったように、研究者にとってこうした実装の問題は取るに足らないものですが、これに対処することが私たちの作業の99%を占めています。ブロックチェーンの時間の問題を例にあげましょう。この2週間ばかり私の頭を悩ませている問題なのですが、時間はスロットに分割され、チェーンはスロットごとに最大1ブロックを包含できます。実世界では頻繁にスロット番号と時間を変換する必要があります。例えばノードが次のブロックを生成するために「自分の順番が来たかな」と知る必要があるときです。これはCardanoの基本ですが、ハードフォーク後にスロットの長さが変化します。Byronでは1スロットは20秒ですが、Shelleyでは2秒、または1秒になる可能性があります。非常に複雑なのは、ハードフォークが実施される正確なタイミングはチェーンそのものが決定します。しかし、私は切り替えポイントがいつなのか知る必要があるのです。ここにジレンマが生まれます。スロットを変換するにはブロックチェーンのステータスを知る必要があり、ステータスを知るにはスロット変換がわからなければならないのです。
これは、現実的な鶏と卵の状況であり、そこには解くべき問題が複雑に絡み合っていて、厳密な正確さをもって物事を進めなければなりません。理論では取るに足りないことでも物事を紐解いていくのは非常に困難であり、堂々巡りにならないように気を付けなければなりません。
間違えることができない状況で、正しいことをどのように判断できますか。
Duncan:素晴らしい質問ですね。私からの回答は、2レベルで答えが得られるということです。まず知的に。問題を解析し、計算をする。同僚と話し、すべてがすっきりと収まるまで格闘することです。次にすべてをQuickCheckテストにかけます。想定通りに物事が進むという確信が持てます。テストはこの切替えも含む、思いもよらないような稀なケースまでも想定した徹底的なものです。コードを1列変えるたびに100,000テストができるのです。(Lars BrünjesはHaskell開発者の1人であるJohn HughesがいかにIOHKのテスト戦略開発を支えたかについて書いています)
Edsko:はい、私もこの2つのポイントに同意します。コンビネーターに関しては、自分が書いたコードが提供すべきものを保証すること、そして次に台帳が必要とするものを保証することについて考えることにより、物事を決定していきます。この「if-then」論理が理にかなっていることを示す数学的証明の草稿を書き、形式手法チームに回します。形式手法チームはブロックチェーンを説明する数学の公式を設定する人々です。彼らは要求される保証を提供するために公式に変更を加えることができます。
Duncanの2番目のポイントに関しては、私には先に触れた時間の問題が、徹底的な数学的思索とテストによって正しいことがわかります。タイミングの決定は、完全なブロックチェーンがある場合は簡単ですが、未来について予測を立てなければならない場合は困難です。幸運なことに、私たちが設定した方法では、テスト用ブロックチェーンを簡単に作ることができます。まず完全なブロックチェーンを作成してから、半分に割ります。前半部分を現在とし、後半部分を未来と設定します。「現在」(前半)を使って「未来」(後半)を予測し、全体に対して検証します(計算が簡単になります)。一致すれば、すべて問題なしということになります。
いつこれを始めたのですか。
DuncanがOBFTという天才的なアイデアを思いついた直後です。かれこれ18か月にわたり、コンビネーターについて考えていることになりますね。2018年10月に、GitHubリポジトリへ私が最初にコミットして始まったOuroborosのモジュラーリライトの当初から、これはデザインの目標でした。そのすぐ後の2018年12月に、OBFTとPraosのプロトタイプのデモを行いました。
何人の人々が絡んでいるんですか。
Duncan:多くの人がコンセンサスコードに取り組んできましたが、本当に難しくなってくるといつも、コンビネーターもそうですが、Edskoに回します。彼は本当に非凡なソフトウェアエンジニアですから。これはフリークライミングのHaskellプログラミングです。形式手法のロープで支えられながら登るというよりもね。
最後に一言
Duncan:実行されていたコードは現在段階的に廃止されつつあり、1か月前にCardanoを実行していたコードはまもなく存在しなくなります。全員が新しいコードをメインネットで実行するようになり、私たちがコアノードの切替えを終えたら、旧コードは不要になります。現在はその移行段階にありますが、慌てて騒いでいる人はいません。誰も気が付いていないのです。
Edsko:そのこと自身が1つの達成です。OBFTのアイデアとは、移行を実行するのに欠かせないものですが、Shelleyへの移行を終えてしまえば関係なくなるものです。これは純粋にレガシーコードを廃棄する方法です。これは非常に困難なことが多いのです。銀行が身をもって知っているように。
Duncan:そしてすべてが順調に作動すれば、何も気づくことはありません。
Duncan、Edsko、時間を割いていただいてありがとう。この辺で作業に戻っていただいた方がよさそうですね。