不変のKey-Valueおよび時系列データベースを共有する場合
本日、「ストリーム」と呼ばれる重要な新しい機能セットを実装したマルチチェーンの最新バージョンをリリースできることを誇りに思います。 ストリームは、参加者間でのアセットの転送ではなく、一般的なデータの取得、タイムスタンプ、およびアーカイブに焦点を当てたブロックチェーンのユースケースに自然な抽象化を提供します。 ストリームを使用して、XNUMXつの異なるタイプのデータベースをチェーンに実装できます。
- NoSQLスタイルのキー値データベースまたはドキュメントストア。
- エントリの順序に焦点を当てた時系列データベース。
- 作者に応じてエントリが分類されるアイデンティティ駆動のデータベース。
これらは、共有データベースの「何を」、「いつ」、「誰が」と考えることができます。
ストリームの基本
マルチチェーンブロックチェーンで任意の数のストリームを作成でき、各ストリームは独立した追加のみのアイテムのコレクションとして機能します。 ストリームの各アイテムには、次の特性があります。
- XNUMXつ以上 出版社 そのアイテムにデジタル署名した人。
- オプション キー 後で検索するのに便利です。
- 一部 データ、テキストの小さな断片から数メガバイトの生のバイナリまでの範囲をとることができます。
- A タイムスタンプは、アイテムが確認されたブロックのヘッダーから取得されます。
背後では、ストリーム内の各アイテムはブロックチェーントランザクションによって表されますが、開発者はこの基本的なメカニズムを意識することなくストリームを読み書きできます。 (より上級のユーザーが使用できます 生のトランザクション 複数のストリームへの書き込み、アセットの発行または転送、および/または単一のアトミックトランザクションでのアクセス許可の割り当て。
ストリームは、MultiChainの権限システムといくつかの方法で統合されます。 まず、ストリームは、アセットを特定のアドレスでのみ発行できるのと同じように、許可を持つユーザーのみが作成できます。 ストリームが作成されると、オープンまたはクローズされます。 オープンストリームは、ブロックチェーントランザクションを送信する権限を持つ誰でも書き込み可能ですが、クローズドストリームは、許可されたアドレスの変更可能なリストに制限されています。 後者の場合、各ストリームにはXNUMX人以上の管理者がいて、それらの書き込み権限を時間の経過とともに変更できます。
各ブロックチェーンには、オプションで定義されている「ルート」ストリームがあります。 パラメータ チェーンが作成された瞬間から存在します。 これにより、ストリームが明示的に作成されるのを待たずに、ブロックチェーンをすぐに使用してデータを保存および取得できます。
私がしたように 前述の、機密性は、多くのブロックチェーンの使用例における最大の課題です。 これは、ブロックチェーンの各ノードがチェーン全体のコンテンツの完全なコピーを参照するためです。 ストリームは、次のように、ブロックチェーン上の暗号化されたデータをサポートする自然な方法を提供します。
- 参加者はXNUMXつのストリームを使用して、公開鍵暗号方式の公開鍵を配布します。
- XNUMX番目のストリームは、データを公開するために使用されます。各データは、一意のキーを使用した対称暗号化を使用して暗号化されます。
- XNUMX番目のストリームはデータアクセスを提供します。 データを見る必要のある各参加者に対して、そのデータの秘密鍵を含むストリームエントリが作成され、その参加者の公開鍵を使用して暗号化されます。
これにより、ブロックチェーン上のデータをアーカイブする効率的な方法が提供され、特定の参加者のみがデータを見ることができます。
ストリームからの取得
ストリームの中心的な価値は、インデックス作成と取得にあります。 各ノードはサブスクライブするストリームを選択できます。ブロックチェーンにより、特定のストリームにサブスクライブするすべてのノードが同じアイテムを参照することが保証されます。 (ノードは、作成されたすべての新しいストリームを自動的にサブスクライブするように構成することもできます。)
ノードがストリームにサブスクライブされている場合、情報はさまざまな方法でそのストリームから取得できます。
- ストリームからアイテムを順番に取得します。
- 特定のキーを持つアイテムを取得します。
- 特定の発行元によって署名されたアイテムを取得します。
- ストリームで使用されているキーを、各キーのアイテム数とともにリストします。
- ストリーム内のパブリッシャーをアイテム数とともにリストします。
最初に述べたように、これらの取得方法では、ストリームを使用して Key-Valueデータベース, 時系列データベース アイデンティティ駆動型データベース。 すべての取得APIが提供する start & カウント パラメータ。長いリストのサブセクションを効率的に取得できます(SQLのLIMIT句のように)。 負の値 start 最新のアイテムを取得できるようにします。
ストリームには同じキーを持つ複数のアイテムを含めることができます。これにより、ブロックチェーンの不変性とデータベースを更新する必要性の間の緊張が自然に解決されます。 有効な各データベース「エントリ」には、アプリケーション内で一意のキーを割り当てる必要があります。そのエントリへの更新ごとに、そのキーを持つ新しいストリームアイテムによって表されます。 次に、MultiChainのストリーム取得APIを使用して、(a)特定のエントリの最初または最後のバージョンを取得する、(b)エントリの完全なバージョン履歴を取得する、(c)最初と最後を含む複数のエントリに関する情報を取得するそれぞれのバージョン。
ブロックチェーンのピアツーピアアーキテクチャのため、ストリーム内のアイテムは異なるノードに異なる順序で到着する場合があり、MultiChainを使用すると、ブロック内で「確認」される前にアイテムを取得できます。 その結果、すべての取得APIは、グローバル(デフォルト)またはローカルの順序のいずれかを選択できます。 グローバルな順序付けにより、チェーンが合意に達すると、すべてのノードが同じAPI呼び出しから同じ応答を受け取ることが保証されます。 ローカルの順序付けにより、特定のノードについて、API呼び出し間でストリームのアイテムの順序が変更されないことが保証されます。 各アプリケーションは、そのニーズに応じて適切な選択を行うことができます。
ストリームとマルチチェーンロードマップ
ストリームのリリースにより、MultiChain 1.0の最後の主要な作業が完了し、ベータ版への移行が確実に進んでいます。 今後数か月間、内部テストスイート(既にかなり大規模です!)を拡張し、WindowsおよびMacのポートを完成させ、さらに便利なAPIをいくつか追加し、 冒険者 ストリームの場合、コンセンサスメカニズムの側面を調整し、Webデモをリリースし、一般にコードとヘルプメッセージを整理します。 最も重要なのは、バグが発見されたらすぐに修正し続けることで、間違いが作業の妨げにならないようにすることです。
長期的には、ストリームはマルチチェーンロードマップのどこに適合しますか? 一歩下がって、MultiChainはXNUMXつの高レベル機能の領域を提供します。
- 権限 誰が接続、トランザクション、アセット/ストリームの作成、マイニング/検証、管理を行えるかを制御します。
- 資産 発行、再発行、譲渡、原子交換、エスクロー、破壊を含みます。
- ストリーム ストリームの作成、書き込み、サブスクライブ、インデックス作成、および取得のためのAPIを使用します。
MultiChain 1.0(およびプレミアムバージョン)のリリース後、このリストの次は何ですか? あなたが見れば APIコマンド ストリームを作成するために使用される、固定値の明らかに余分なパラメータに気づくでしょう stream
。 このパラメータにより、MultiChainは将来、他のタイプの上位エンティティをサポートできるようになります。
パラメータの可能な将来の値には、 evm
( Ethereum-互換性のある仮想マシン)、 sql
(SQLスタイルのデータベースの場合)または wiki
(共同編集されたテキストの場合)。 状態が順序付けられた一連の変更によって決定される共有エンティティは、潜在的な候補です。 このような各エンティティには、(a)状態を更新するための正しい抽象化を提供するAPI、(b)サブスクライブしたノードがその状態を追跡するための適切なメカニズム、および(c)状態の一部またはすべてを効率的に取得するためのAPIが必要です。 私たちがプラグインアーキテクチャを介して、またはサードパーティによって実装される、他のどの高レベルエンティティが最も有用かを知るのを待っています。
スマートコントラクトはどうですか?
一般的な意味では、MultiChainは、 データ ブロックチェーンに不変に埋め込まれていますが、 コード そのデータを解釈するためのノードまたはアプリケーション層にあります。 これは、コードがブロックチェーンに埋め込まれ、仮想マシンで実行されるイーサリアムで例示されている「スマートコントラクト」パラダイムとは意図的に異なります。 理論的には、スマートコントラクトは チューリング完了、マルチチェーンまたはその他のブロックチェーンプラットフォームの動作を再現できます。 ただし、実際には、Ethereumスタイルのスマートコントラクトには多くの苦痛な欠点があります。
- 対象かどうかに関係なく、すべてのノードがすべての計算を実行する必要があります。 対照的に、MultiChainでは、各ノードがサブスクライブするストリームを決定し、他のノードに含まれるデータを無視できます。
- スマートコントラクトに使用される仮想マシンは、特定のコンピューターアーキテクチャ用にネイティブにコンパイルされたコードよりもパフォーマンスが大幅に低下します。
- スマートコントラクトコードは不変的にチェーンに埋め込まれているため、機能の追加やバグの修正はできません。 これは、 DAOの終焉.
- スマートコントラクトに送信されたトランザクション 更新できません 汎用計算の性質上、ブロックチェーンの最終的な順序がわかるまでの状態。 これにより、遅延(トランザクションがブロックで確認されるまで)と、取り消す可能性(チェーンでフォークが発生した場合)が発生します。 対照的に、MultiChainは、未確認のトランザクションの各タイプを適切な方法で処理できます:(a)着信アセットはノードの未確認のバランスを即座に更新します。すぐに適用され、次に着信ブロックで再生されます。
それにもかかわらず、私がしたように 前に言った、強力なユースケースを見た場合、ブロックチェーンアプリケーションの便利なパラダイムとしてスマートコントラクトを除外することはありません。 ただし、マルチチェーンでは、スマートコントラクトは、最低トランザクションレベルではなく、ブロックチェーンの上にあるストリームのようなレイヤーに実装されます。 これにより、アセットやストリームなどのより単純なブロックチェーンエンティティに対してMultiChainの優れたパフォーマンスが維持され、実際に必要な場合に低速のオンチェーン計算が提供されます。 しかし、あなたが考えるよりもそのようなケースは少ないです。
コメントを投稿してください LinkedInの上に.
技術補遺
ストリームに関連するすべてのコマンドは、 マルチチェーンAPIページ、しかしここに簡単な要約があります:
- を使用してストリームを作成する
create stream
orcreatefrom ... stream
- ストリームにアイテムを追加する
publish
orpublishfrom
- を使用してストリームのリストを取得する
liststreams
- ストリームの追跡を開始または停止する
subscribe
&unsubscribe
- を使用してストリームアイテムを取得する
liststreamitems
,liststreamkeyitems
&liststreampublisheritems
- ストリームキーとパブリッシャーをリストする
liststreamkeys
&liststreampublishers
- 大きなストリームアイテムの場合は、次を使用して完全なデータを取得します
gettxoutdata
(参照してくださいmaxshowndata
以下) - 次のような呼び出しでストリームごとの権限を制御します
grant [address] stream1.write
- を使用してストリームの権限を表示する
listpermissions stream1.*
ストリームに関連する他の開発者メモ:
-
create
許可により、アドレスはストリームを作成できます。 - 関連するストリームごとの権限は
write
,admin
&activate
- 新作 ブロックチェーンパラメーター:
root-stream-name
(何もない場合は空のままにします)、root-stream-open
,anyone-can-create
,admin-consensus-create
,max-std-op-returns-count
- 新作 ランタイムパラメータ:
autosubscribe
作成された新しいストリームを自動的にサブスクライブし、maxshowndata
API応答のデータ量を制限する(参照gettxoutdata
上記)。 - ストリームアイテムのデータの最大サイズは、
max-std-op-return-size
ブロックチェーンパラメーター、および小さい方maximum-block-size
&max-std-tx-size
値から数百バイトを引いたもの。 - 古いウォレット形式を使用するノードは、ストリームをサブスクライブできません。 アップグレードする必要があります.