Update 2023/3/30

2021-09-14 事後報告

strapi-blog-api-image

ファイナリゼーションの背景について

ファイナリティは、ブロックチェーンにおける重要な概念であり、取引の変更、取り消し、キャンセルができないことを保証するものです。ビットコインやほとんどのチェーンでは、そこに確率的ファイナリゼーションを用いています。つまり、時間の経過とともに、取引が変更される可能性は低くなるということです。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投票ノードが投票キーを使い終えた場合、初期設定ではノードがクラッシュしてしまいます。この問題を軽減するために、単にエラーとして記録するように変更しました。これはノイズが少なくなることを意味しますが、しかしながらこの状態でノードを長時間動作させることは推奨されません。投票を止めたいノードは、enableVotingをfalseに設定してから再起動をしてください。
マルチシグアカウントは、常に他のアカウント(親アカウント)に手数料を負担してもらう必要があるという不便な点がありました。この制約を緩和し、フォークブロックにおいて、マルチシグアカウントは親アカウントに手数料を送金することで間接的に手数料を支払うことができるようになります。これは、ハッシュロックを必要とするパーシャルトランザクションの送信動作には変更を与えない点に注意してください。

今後の作業

現行バージョンのSymbolでは、Voting投票ノードに対する報酬やペナルティはありません。これは、ローンチに向けてファイナライゼーションの実装を大幅に簡素化したものの、Voting投票ノードに対して我々が意図する正しいインセンティブを生み出すものではありません。近い将来、投票者に報酬を与える適切なシステムを追加する予定です。
より良いツールに投資する必要があると実感しています。アクティブなVoting投票ノードの数や投票率の低下をモニタリングできるようになれば、最終決定処理が滞る前に問題を警告することができたでしょう。今後数ヶ月間は、新しいブロックエクスプローラー、改良版REST API、そしてユーザーや研究者にとって分かりやすくて役立つデータ分析など、インフラに優先的に取り組んでいきます。私たちと一緒に働きたい方は、Discordで参加してください。

News
Community
Docs
Contact