Symbol ファイナリゼーションプロセスに何があった? 時系列で解説

NEM/Symbolについて

本日2021年9月16日、日本時間20時頃にSymbolはブロック528,000でハードフォークをいたしました。ハードフォークと言っても、Symbolブロックチェーンが分岐し、2つのチェーン、2つのコインとなったハードフォークではありません。チェーンのアップグレードといえばわかりやすいかと思われます。

このハードフォークが行われた背景は、Symbolブロックチェーンのファイナリゼーションプロセスに問題があったためですが、このアップグレードで解決された模様です。

無事ファイナライズもされました。

ファイナライズとは?

Symbolブロックチェーンには、そのチェーンを確定させるファイナリゼーションという仕組みがあります。ブロックチェーンにおいてのファイナリゼーションとは、新しいブロックが作られ、一連のチェーンとなり繋がっていく中で、どのようにしてそのブロックが正しいものとして確定されるかのことです。ブロックが確定されないと、「受け取った通貨が消えてしまわないか、決済が取り消されてしまい、無かったことにならないか」という問題がそこに発生します。ですので、ブロックを正しいものとして確定することを「ファイナライズ」と言います。

ブロックチェーンのファイナリティ、ブロックを確定させること、確定したとしてみなすことは、その仕組みに由来する問題でもあるかと思いますが、少しブロックチェーンについておさらいしましょう。「日本ブロックチェーン協会」に記載されているブロックチェーンの定義では、「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ。」とされております。

とても難しく書いてありますね。これでは全くわかりません。では具体的な例で考えてみましょう。

一般的に暗号資産は送金が早いと言われていますが、取引所へ暗号資産を入金したとき、口座に残高が反映されるまでに時間がかかるなと感じたことはありませんか?

あなたが送金した暗号資産が取引所に到着していても、その入金が「後で消えてしまう、決済が取り消されてしまい無かったことになる」事態を避ける為に、取引所は数回ブロックが承認されるのを待って、その入金が確定したとみなしているからです。ビットコインの場合は、一般的には6回の承認を待つことが多いようです。6回の承認を経た後であれば、決済が後に覆る可能性は確率的にかなり低くなり、ほぼおこらない(確定)とみなしてるからです。

このような合意の仕方を、確率的ビザンチン合意と呼んだりしているそうです。ナカモトサトシの論文においも、このことは「確率的なファイナリティ」として書かれているそうです。時間の経過とともに、取引が取り消される可能性は、限りなくゼロに近づきますが、数学的には、どれだけ時間が経過してもゼロになることはありません。

ブロックが生成され確定するまでのプロセスは、それぞれのチェーンにより異なりますが、Symbolはローンチする前にこのファイナリティを解決し、「確率的なファイナリティ」ではなく、「決定的なファイナリティ」として確定させる仕組みを持って誕生しております。

Symbolの決定的なファイナリティの仕組み

Symbolブロックチェーンにおいて、そのファイナリティを決定をするのが、Votingノードなのです。

Symbolのノードの種類には、Peerノード、APIノード、Voting(投票)ノードがあり、Peerノードは、トランザクションを検証して、新しいブロックチェーンを紡ぎ、その過程で手数料を徴収(ハーベスト)するノードです。APIノードは、REST API を介して、外部からのアクセスを可能にするノードです。このふたつのPeerノードとAPIノードの機能を併せ持つノードはDualノードなんて呼び方もあります。なお、100万枚以上からスーパーノードと呼ばれます。

そしてVoting(投票)ノードがどのようにブロックの最終決定をするかと言いますと、Voting(投票)をして、どのブロックが正しいか「確定」させる作業を行っております。ちなみに300万枚以上を保有するスーパーノードであることが要件であるとSymbol platformに書かれております。

また、大切なファイナリゼーションをVoting(投票)ノードは担っていますので、セキュリティの関係もあり、投票キーを6ヶ月ごとに更新する必要があるそうです。

現在のタイミングはSymbolがローンチして、6ヶ月。ちょうど更新のタイミングであったのですが、初めての更新でもあり、周知不足もあったためか、投票キーを更新していないVoting(投票)ノードがあり、不具合が発生した模様です。

9月13日 ファイナライズブロックの停止

そして問題が起きました。このことについて、日本時間9月13日の昼ごろ、ブロック高518400でファイナリゼーションがストップしていることをあひきさんがいち早くツイートでこのように発信されていました。

その後コアデブの方々が調査を開始、すぐにブロックは順調に進み、止まっていないことが確認されました。原因は、アップデートをしていなかったVotingノードがあり、そのことに起因して投票プロセスが止まってしまっているようだとの報告とともに、修正アップデートが準備され始めました。決定には、Voting(投票)ノードの2/3の投票がプロセスに必要だったみたいです。

9月14日、コアデブHatchet(クリスティ)さんのツイート

問題発見から直ぐに動き出した開発チーム、コアデブのお一人Hatchetさんがこのようにツイートされました。

このツイートに対して、リプで簡単に説明をさせていただきました。

Hatchet(クリスティ)さんからすぐにアナウンスがされ、全力でコアデブの方々が修復に向けて動いてくれている様子がわかりました。あとはパッチが出たらノードオペレーターの皆さんがそれを適用してアップデートし、その後ファイナライズがブロックに追いつくのを待つ状態でとなりました。

9月15日 事態の説明をするドキュメントの発表

開発チームから届いた発表がこちらです。September 14th – Post Mortem
こちらでは日本語訳を掲載させていただきます。

9月14日 – 事後分析 “September 14th – Post Mortem Japanese Translation” 

XYM Cityの皆さんにお知らせです!

ファイナリゼーションの背景について
ファイナリティは、ブロックチェーンにおける重要な概念であり、取引の変更、取り消し、キャンセルができないことを保証するものです。ビットコインやほとんどのチェーンでは、そこに確率的ファイナリゼーションを用いています。つまり、時間の経過とともに、取引が変更される可能性は低くなるということです。Symbolにおいては、確率的ファイナリティと決定論的ファイナリティの両方を別々の機能として持っています。すなわち、取引は、ファイナライズ(決定化)されたブロックに含まれた時点で最終的なものとみなされます。

ブロックを確定させるためには、アクティブなVoting(投票)ノードの2/3がブロックのハッシュに投票する必要があります。投票者はその最終決定プロセスに自由に参加することができます。メンバーシップの変更は、次のエポックで有効となります。また、各段階の終わりにアクティブな投票権が計算され、その量が次のエポックでの分母として使われます


問題点
9月12日の日曜日に、私たちはネットワークがエポック361のファイナリゼーション処理に問題を抱えていることに気づきました。このエポックはファイナライズ処理にとって、負荷がかかることになると予想していたので、想定外のことではありませんでした。

ネットワークスタート時にsymbol-bootstrapを用いて投票キーを登録したVoting(投票)ノードは、エポック1~360までのキーを登録していました。投票キーを定期的に更新することの重要性が周知されていなかったため、多くのユーザーはエポック361以上のキーを登録しませんでした。その結果、エポック360で投票していた多くのノードがエポック361では投票していませんでした

それでもなお、次のエポック(362)に進むための十分な合意が得られたのでありましたが。残念ながらここで失速してしまいました。さらにいくつかの大きなノードが投票をやめてしまい、ネットワークは投票権を持つ過半数以上の合意を得ることができなくなりました。

期限切れのVoting(投票)ノードのXYM保有量が関係しているように見えましたが、これは好ましくありません。調査の結果、クライアントは投票キーを更新登録したアカウントのXYM保有量はカウントせずに適切に処理していましたが、投票キーを更新していなかったアカウントのXYM保有量はカウントしたことがわかりました。360と361のエポックに対応するインポータンスBlockに格納されているデータを見れば、不具合があったことはすぐにわかりました。設計通りに動作していれば、総投票残高が大きく減少するはずですが、そこにほとんど変化がありませんでした。

一次修正
このバグは、現在のエポックで投票キーが登録されていないアカウントを除外することで修正しました。また、超過半数の閾値を70%から67%に下げました。これらの変更により、この修正プログラムが超過半数の投票権を持つアカウントに配布され次第、ファイナライゼーション処理が再開されることになります。

ブロック528,000でハードフォークが行われます。これは、インポータンスBlockに保存されている統計情報の計算を修正するために必要です(すべてのノードで検証する必要があるため)。

Symbolでは決定的ファイナライズはひとつの機能として実装されているため、この決定的ファイナライズが滞っている間もチェーンは進行しています。PoS+におけるブロック生成は、決定的ファイナライズとは別に続けられました。このファイナライズが確定すれば、すべてのブロックが速やかに同期されることを見込んでいます。

二次修正
Voting投票ノードが投票キーを使い終えた場合、初期設定ではノードがクラッシュしてしまいます。この問題を軽減するために、単にエラーとして記録するように変更しました。これはノイズが少なくなることを意味しますが、しかしながらこの状態でノードを長時間動作させることは推奨されません。投票を止めたいノードは、enableVotingfalseに設定してから再起動をしてください。

今後の作業
現行バージョンのSymbolでは、Voting投票ノードに対する報酬やペナルティはありません。これは、ローンチに向けてファイナライゼーションの実装を大幅に簡素化したものの、Voting投票ノードに対して我々が意図する正しいインセンティブを生み出すものではありません。近い将来、投票者に報酬を与える適切なシステムを追加する予定です。

より良いツールに投資する必要があると実感しています。アクティブなVoting投票ノードの数や投票率の低下をモニタリングできるようになれば、最終決定処理が滞る前に問題を警告することができたでしょう。今後数ヶ月間は、新しいブロックエクスプローラー、改良版REST API、そしてユーザーや研究者にとって分かりやすくて役立つデータ分析など、インフラに優先的に取り組んでいきます。私たちと一緒に働きたい方は、Discordで参加してください。

経過と対応について迅速に英語版と日本語版で同時にリリースされ、追ってスペイン語版、中国語版、イタリア語版、ロシア語版が相次いで発表されました。

ハードフォークへ

経過と対応が文書でリリースされると、ノードのアップデートが促され、方法が共有されました。

そして一部アップグレードを適用していないノードもあるようですが、無事アップグレードされ、ハードフォークは完了しました。

なお、ハードフォーク後のノードバージョンは1.0.2.0ですので、委任ハーベストをされている方はご自身の委任先を確認された方が良いかもしれません。

コアデブ、開発チーム、ノード運営主、コミュニティの協力

Votingノードに限らず、ノードを運営している方々には頭が上がりません。常にアップデートをし、ネットワークが正常に動き続けるように支えてくださってます。

今回、ファイナライズブロックは一時止まりましたが、その間もチェーンは動き続け、止まることはありませんでした。そして、アップデートによりファイナライズブロックは追いつきました。

ですが、この件については周知広報がもう少し早くからされていたらよかったのに、とも思ってしまいます。今回は初めてのキー更新でしたし、おそらくNGL解体から新組織への移行途中というタイミングもよろしくありませんでしたね。ですが結果ブロックがストップしてしまうことがなかったのが何よりです。

そして何より、通常チェーンにバグが見つかったり不具合が起きると、通貨は暴落します。ですが今回特にXYMの価格には大きな変化は見られなかったかと思います。パニック売りが無かったのです。

そこには、コアデブ、開発チーム、ノード運営主、コミュニティの協力があったからではないでしょうか?

ファイナライズがストップしているのではないかといち早く情報共有をしたコミュニティメンバー、そのコミュニティの声を拾い、直ぐに対応に動いた開発チーム。速やかなアナウンスとその多言語化。共有を行ったNEMbers。緊急であったにも関わらず、アップデートを行ったノード運営主。問題発生からこれらの事を成し、3日で解決をしました。このことを乗り越え、Symbolはより強くなったと感じております。

この翻訳記事を書いた人

Radio(@RadioRa26841511)

野良翻訳屋Radioですよろしくお願いします。

Symbol関連の翻訳活動しておりますので、ご支援いただけるとありがたいです

Symbolノードに委任して支援する
xym602.allnodes.me

XYMを投げ銭して支援する
NDXLBKLDVKG5RM46KVJYRYMZ4ZUG2LZENTPQXFQ

コメント

タイトルとURLをコピーしました