Scalar DLの実装について
今回はScalar DLの実装について紹介します。Scalar DLのアーキテクチャやScalar DLのビザンチン故障検知プロトコルの概要については、以前のエントリを参照ください。(英語版はこちら)
Scalar DL(下図参照)はデータベース上で動作する主にJavaで書かれたミドルウェアであり、Ledger, Auditor, Client SDKから構成されています。それぞれのコンポーネントの実装を見ていきましょう。
Ledger
Ledgerはビザンチン故障検知プロトコルのCommitフェーズを実装しています。LedgerはContractと呼ばれる決定的関数を管理し、ユーザはその関数を定義し指定することでトランザクションを実行することができます。コントラクトにおいては、ユーザは任意のビジネスロジックを記述することでき、またコントラクトのインターフェースに従いデータベース操作を行うことできます。コントラクトが他のコントラクトを呼び出すコントラクトのネスト実行も可能であり、この機能を用いてコントラクトのモジュール化を行うことができます。Ledgerにおける一連のコントラクトにおけるデータベースへの操作はACIDを保証します。各コントラクトはJavaバイトコードの形式で電子署名と共にデータベースに保存されているため、処理内容(バイトコード)に変化がないかを後から検証することができます。
Ledgerは下位層のデータベースをキーバリューベースの多次元マップで抽象化しています。シンプルな抽象化であるため、多様なデータベースを扱うことができます。多次元マップはレコードの集合として構成され、レコードはレコードキー(アプリケーションレベルのプライマリキー)、バージョン、値の集合から構成されます。値の集合は、レコードを導出するために用いられるコントラクトの引数や、値の集合のダイジェスト等を含みます。レコードキーとバージョンでプライマリキーを構成し、プライマリキーが値の集合を一意に特定します。同じレコードキーをもつレコード群に対してハッシュチェーンが構築しているため、そのレコード群に対する改ざん等を部分的に防止します。ただし、当該機構はビザンチン故障の検知を実現するために必要というわけではありません。
Ledgerは上記のデータベース抽象化を用いて改ざん検知機構を実装しています。また、データベース抽象化はトランザクションマネージャであるScalar DBを用いて効率的に実装されています。データベース抽象化層においては、現状、PostgreSQL、MySQL、Oracle Database、Microsoft SQL Server、Apache Cassandra、Amazon DynamoDB、Amazon Aurora、Azure Cosmos DB、とこれらと互換性のあるデータベースをサポートしています。Scalar DBはデータベース非依存のACIDトランザクション機構をもち、(Read-committed) Snapshot IsolationとStrict Serializabilityの分離レベルをサポートしています。下位のデータベースがACID準拠のデータベースである場合は、ユーザは、下位のデータベースにトランザクション管理を委譲するか、Scalar DB独自のトランザクションを行うかの、どちらかの方法を選択できます。
Ledger単体でもサービスを提供することが可能です。その場合は、Scalar DLはデータベース非依存性や高いスケーラビリティ等のScalar DL固有の性質を除いて、Oracle Blockchain TableやAmazon QLDBと同様のビザンチン故障検知性を提供します。つまり、一つの管理ドメインでデータベースを管理するため、ある一部のビザンチン故障のみを検知します。
Auditor
Auditorはビザンチン故障検知プロトコルのOrderingフェーズとValidationフェーズを実装しています。AuditorはLedgerと同じコントラクトを管理します。また、Ledgerと同じデータベース抽象化層を用いているため、下位に多様なデータベースを用いることが可能です。
正しさ(安全性)を保証するために、AuditorはLedgerが配置される管理ドメインとは別の管理ドメインに配置される必要があります。
Client SDK
Client SDKはビザンチン故障検知プロトコルに基づきLedgerとAuditorをやりとりをします。Client SDKを用いて作られたアプリケーションプログラムは電子署名のための鍵ペア(秘密鍵の証明書)を(必要に応じてユーザごとに)管理し、電子署名付きの実行リクエストを作成します。LedgerおよびAuditorは当該実行リクエストを受け取ると、署名を対応する証明書で検証し、検証が成功したらコントラクトを実行します。電子署名付きリクエストはレコードと共にデータベースに保存されるため、レコードを見ることにより、そのレコードがどの秘密鍵の所有者により実行されたものかを判別することが可能です。電子署名のかわりにHMACで認証をするオプションもあります。トランザクション処理をより高速に実行できるようになりますが、その場合は、上記のような否認防止性を提供することができません。
現段階では、Java、Node.js、ブラウザにおけるJavaScript、およびGoにより書かれたClient SDKが提供されています。
まとめ
このブログエントリでは、Scalar DLの実装を説明しました。今後は、Scalar DLに関するさらなる詳細を紹介してく予定です。