QuarkChainの説明、パート3:QuarkChainにおけるシャーディング-状態の分割
(シャーディングの詳細を理解するには、第2部:シャーディング-ブロックチェーンの簡単な紹介と課題 https://medium.com/quarkchain-official/quarkchain-explained-part-2-sharding-brief-introduction-and-challenges-in-blockchain-fd5b2dc09d1b を参照してください)
QuarkChainにおけるShardingの設計の概要
既存のブロックチェーンモデルを用いて説明すると、QuarkChainは既存のモデルを以下のような設計により向上させます。
(State to Partition(状態の分割)):QuarkChainはスマートコントラクトを分割します。つまり、再シャードが発生した場合にスマートコントラクトを別のシャードに配置します。スマートコントラクトにはコードとストレージが含まれており、データサイズはユーザーアカウントよりはるかに大きくなる可能性があります(多数の残高アドレスマッピングがあるERC20を念頭に考えてください)。
(State to partition(状態の分割)):ユーザーアカウントを分割することはありません。ユーザーは、クロスシャード取引を使用して簡単にアカウント状態(多くの場合は残高について)を異なるシャードに移動することができます。これにより、プライベートキーを持つユーザーは、すべてのシャードのすべてのリソース(スマートコントラクト)にアクセスできます。
(Atomicity(極小性)):各スマートコントラクトにはシャードキー(QuarkChainのコードベースフルシャードID)があり、同一のシャードキーを持つすべてのスマートコントラクトのバッチ操作はすべて極小です。さらに、スマートコントラクトが異なるシャードキーにより他のスマートコントラクトにアクセスすることは禁じられます。
(Balanced load/size(均等化された負荷・サイズ)):スマートコントラクトのシャードキーが均等に分散されていると仮定することにより、スマートコントラクトは異なるシャードに均等に分割されます。
(Reshard(再シャード)):移行コストを抑えてシャードを追加するために、スマートコントラクトのシャードキーに従ってシャードを2つのシャードに分割します。これにより、他の再シャード前のシャードからのデータ移行が不要になり、再シャードが簡易化されます。
(Reshard(再シャード)):スマートコントラクトの動作は、再シャード前後で同一です。つまり、再シャード前後では、スマートコントラクトを読むと同一の価値になり、スマートコントラクトを書くことは同一のシステム状態の変化になります。
QuarkChainのシステム状態と状態分割
QuarkChainでは、そのCRUD操作のバッチの極小性(atomicity)に対応するために、各アドレスに32ビットのシャードキーを追加することでユーザーアカウントとスマートコントラクトのアドレスを再定義します。
アドレス:= RIPEMD160(公開鍵)+シャードキー、
ここで、+はデカルト積演算子であり、QuarkChainのアドレスは192ビットのデータであり、アドレスの最初の160ビットをQuarkChainのアドレスの受信者(recipient)と呼びます。
QuarkChainネットワークでのシャード(シャードサイズ)の数は2の累乗であり、再シャード操作によりネットワーク内のシャード数は2倍になります。シャードサイズを指定すると、シャードは次のように索引付けされます。
シャードID:=シャードキー%シャードサイズ。
シャード内の状態はキーと値のマッピングです。キーはアドレスの受信者であり、値には次のものが含まれます。
・バランス
・ナンス
・コード
・ストレージ;
・シャードキー
シャードキーは、キーと値のペアが作成されたときに設定され、その後は不変です。
アドレスにシャードキーを追加すると、ユーザー(又は受信者)はすべてのシャード内のすべてのアドレスを1つの秘密キーで管理できます。
QuarkChainにおけるトランザクション
残高転送トランザクション
残高転送トランザクションは、送信元と宛先のアドレスによって異なります。
(インシャードトランザクション):両方のアドレスのシャードIDが同じ場合(シャードキーが異なる場合も含む)、その転送はインシャードトランザクションであり、そのようなトランザクションは同一シャード内の受信者の残高のみを更新します。
(クロスシャードトランザクション):両方のアドレスのシャードIDが異なる場合、その転送はクロスシャードトランザクションであり、トランザクションの極小性(atomicity)はさらに調整する必要があります。両方のシャードが同じ暗号通貨(QKC)を実行するため、幸いにも、このようなトランザクションは、従来のクロスチェーントランザクションよりもはるかに簡易なものです。クロスシャードトランザクションの詳細については、別の記事で説明します。
スマートコントラクトトランザクション
スマートコントラクトトランザクションは同一シャード内で発行される必要があります。つまり、送信元のユーザーアカウントのシャードIDと宛先のスマートコントラクトは同じでなければなりません。スマートコントラクトは、同一シャードキーを使用することで他のスマートコントラクト(他のスマートコントラクトの受信者、つまりEVM内のアドレス、EVMの下位互換性を維持するコードを他のスマートコントラクトの受信者に提供することにより)を呼び出すことができます。ただし、スマートコントラクトが異なるシャードにあり、コントラクトコールが以下のアセンブリコードによりスマートコントラクトを呼び出すのと同様の場合には、そのようなコントラクトコールは失敗します。
PUSH 0x0
DUP1
REVERT
同一のシャードキーを持つスマートコントラクトは常に同じシャードに分割されるため、スマートコントラクトの動作(読み込み/書き込み)は、システム状態がどのように分割されても同一のものになります(詳細はQuarkChainのReshardセクションを参照)。
QuarkChainにおける再シャード
再シャード操作では、各シャードを2つの別々のシャードに分割し、その結果シャードサイズは2倍になります。シャードサイズを2倍にした後、ユーザーアカウント/スマートコントラクトの宛先は、新しいシャードIDの余分なビットによって識別されます。ユーザーアカウント/スマートコントラクトのシャードキーが均等に分散されていると仮定することで、ユーザーアカウント/スマートコントラクトの半分を新しいシャードに分割し、残りを別のシャードに分割する必要があります。さらに、分割されたシャードには、コードをREVERTコードに置き換えてストレージを無効にすることにより、分割された他のシャードのスマートコントラクトが引き続き含まれる場合があります。これらのダミースマートコントラクトは、新しいシャード内のスマートコントラクトが、同じシャードにあるが異なるシャードキーを持つスマートコントラクトを依然として呼び出すことができないことを保証します。
分割された両方のシャードを処理する現在のノードが容量不足の場合、状態を移行することで新しいノードをネットワークに追加し新しいシャードを処理することができるため、シャード/ノードの数が増えるとシステム容量が増加する可能性があります。これはクラスタによって実現されます。これについては、今後の記事で説明します。
QuarkChainにおけるシャードキー選択
QuarkChainの負荷の均等化(load balancing)の鍵は、すべてのスマートコントラクトをすべてのシャードに分散することにあります。スマートコントラクトを作成した後ではシャードキーは不変なので、スマートコントラクトの作成におけるキー選択は重要です。
第1に、作成されるスマートコントラクトが他のスマートコントラクトに依存する場合、シャードキーは依存対象のスマートコントラクトと同じでなければありません。
第2に、スマートコントラクトが他のスマートコントラクトに依存しない場合には、ユーザー(又はウォレット)が自由に任意のシャードキーを選択するか、システムが①自動生成されたシャードキー、②送信元アドレスの受信者の32ビット、③ウォレットのIPアドレスからシャードキーを選択することができます。
このうち①②によれば、シャードキーを均等に分配されたものにすることができる可能性があります。しかし、数百・数千のシャードがあることを考えた場合、ネットワーク内の任意のスマートコントラクトにアクセスしたいユーザーは、頻繁なクロスシャード取引を必要とし、又は複数の残高を維持することがあり、シャーディングの効率を低下させたり、ユーザー体験を悪化させます。
IPアドレスを使用する場合、スマートコントラクトを地理情報でグループ化することで問題を軽減することができます。スマートコントラクトの作用が地理的に関連している場合(例えば、地元の商品/サービスと作用対話する場合)、ユーザーは、ユーザーが居住し又は滞在している場所に関連するシャード内の残高を維持することができ、多くの不要なクロスシャードトランザクションを省略し、ユーザーアカウントの管理を簡素化することができます。
QuarkChainとGoogleのBigTableの比較
多くのQuarkChainのシャーディングデザインは、GoogleのBigTableからインスピレーションを得ています。それらは両方とも本質的にkey-value storeであるため、多くの類似点があります。次の表は、それらを列挙し比較したものです。
類似点に加えて、QuarkChainにはBigTableとの間に以下のいくつかの大きな違いがあります。
・QuarkChainはクロスシャードトランザクションをネイティブにサポートしています。これは、1つのシャード内の1つのアカウントから他のシャード内の他のアカウントに残高を転送します。しかし、BigTableは複数の行キーにわたるトランザクションに対応していません。
・BigTableでは、削除により2つのテーブルが小さい場合には、2つの隣接するタブレット(シャード)を1つのタブレットにマージすることができます。これとは対照的に、ブロックチェーンにおいては削除操作(例えば、自己破棄)は滅多に使用されないため、マージ操作は必要ありません。これにより、QuarkChainのシステムモデルと脅威モデル(リプレイ攻撃など)は大幅に簡素化されます。
要約
既存のスケーラブルなシステムに触発され、我々は新しいブロックチェーンシステムモデルを提案し、シャーディングスキームを説明しました。さらに、提案したモデルとGoogleのBigTableの比較を示しました。次の記事では、シャーディングをサポートするコンセンサスと、それに対応するQuarkChainの脅威モデルを構築する方法について説明します。
QuarkChainについて
QuarkChainは、水平スケーラビリティ技術を利用してブロックチェーンのスケーラビリティ問題を解決することを目指しています。QuarkChainの使命は、世界中の誰もがいつでもどこでもブロックチェーン技術を使用できるようにすることです。QuarkChainに興味がある場合には、以下のリンクを参照ください。
ウェブサイト
https://www.quarkchain.io
英語テレグラム
https://t.me/quarkchainio
日本語テレグラム
https://t.me/QuarkChain_Japan
Twitter
https://twitter.com/Quark_Chain
日本公式Twitter
https://twitter.com/quarkchainjp
Medium
https://medium.com/quarkchain-official
日本語Medium
https://medium.com/@quarkchainjp
Reddit
https://www.reddit.com/r/quarkchainio/
Steemit
https://steemit.com/@quarkchain
日本語Steemit
https://steemit.com/@quarkchainjp