pleasure!福岡でCloudとかBlockchainとか。BIPtechmedia-think.hatenablog.comで使用するフィルタの仕様を定義したのがBIP-158↓https://github.com/bitcoin/bips/blob/master/bip-0158.mediawikiおおまかな仕組みとしては、BIP-37では軽量クライアント側が自身に関連する公開鍵ハッシュやOutPointなんかをフルノードとのフィルタにセットしていたが、BIP-157,158では逆にフルノード側がブロック内の全トランザクションの全OutPointやscriptPubkey内の全データ要素(公開鍵ハッシュなど)を抽出し、それらをゴロム・ライス符号で圧縮してフィルタを生成している。BIP-37が各クライアント毎にフィルタは異なるのに対し、BIP-157,158ではブロック毎にフィルタの中身が決まり、ブロックがチェーンに追加されたタイミングで一度それを生成し保存しておくだけで良い。概要このBIPはBIP-157の軽量クライアントプロトコルで使われるブロックデータのコンパクトなフィルタの構造について説明する。Filterの代替として提案されたフィルタ構成は、圧縮にゴロム・ライス符号を使用することでフィルタサイズを最小限に抑えるようになっている。このドキュメントでは基本的なウォレットとより高度なスマートコントラクトを持つアプリケーションを可能にする、この構成に基づく2つのフィルタの初期タイプについて定義する。動機BIP-157はブロックのコンテンツの決定性フィルタに基づいて軽量クライアントプロトコルを定義する。フィルタは軽量クライアントが消費すると予想される帯域幅を最小限に抑えて、フィルタとブロックをダウンロードするように設計されている。このドキュメントでは、基本および拡張用の2つの初期フィルタタイプを定義し、高度なアプリケーションをサポートし、基本的なウォレットのフィルタサイズを縮小する。定義[]byteはバイトベクトルを表す。[N]byteは長さNの固定のバイト列を表す。CompactSizeはBitcoinのP2Pプロトコルで使われる符号なし整数のコンパクトなエンコード。pushesはBitcoinのスクリプトルールに従ってスタックにプッシュされたバイトベクトル。streamsは個々のbitの読み書き可能なストリーム。このドキュメントの疑似コードでは以下の関数が使われている。streamをインスタンス化する。streamをインスタンス化する。整数nのk個の最下位bitをビッグエンディアンの順でストリームの最後に追加する。ストリームから次に利用可能なkbitを読み込み、それらをビッグエンディアン整数の最下位bitとして解釈する。set各ブロックについて、ブロックに関連する項目のセット(例えば送信先のアドレスや使用されたoutpointなど)を含むコンパクトフィルタが導出される。(GCS)と呼ばれる確率構造に圧縮される。この確率構造はセット内のアイテムであれば確率1でマッチし、セット内にないアイテムがマッチする確率はある整数パラメータMに対して1/Mである。エンコーディンは剰余符号のビット長であるPによってもパラメータ化される。定義された各フィルターはPとMの値を指定する。高レベルなGCSはN個のアイテムのセットから次のように構築される。bitの整数にハッシュする。ハッシュ値を辞書順にソートする。各値についてその前の値との差を計算する。差を順番に書き込み、ゴロム・ライス符号で圧縮する。以下のセクションではこの各ステップについて詳しく説明する。通常Mは2Pに設定される。両方のパラメータを個別に選択できる場合は、より最適な値を選択することができる。ハッシュの出力に対するメンバーシップクエリを設定すると偽陽性率はMになる。数の桁溢れを避けるため、アイテムの数Nは232未満、Mは232未満でなければならない。アイテムはまず疑似乱数関数SipHashに渡される。疑似乱数関数SipHashは128-bitの鍵と可変サイズのバイト列を受け取り、均一にランダムな64-bitのアウトプットを生成する。4を使用しなければならない。続いて64-bitのSipHashのアウトプットにFを掛けて、その結果の128-bitの上位64-bitを取ることで望ましい範囲にわたって一様にマッピングされる。このアルゴリズムは高価な除算演算を避けるため、モジュロ演算の削減に替わる高速なアルゴリズムだ*1。この削減を実装する際は、整数乗算の上位64-bitが切り捨てられないよう注意する必要がある。特定のアーキテクチャと高水準言語では、64-bitの乗算を4つの32-bitの乗算に分解し、その結果を再結合するコードが必要になる場合がある。set_itemsゴロム・ライス符号ハッシュされたセット内のアイテムを直接フィルタに書き込むのではなく、連続するアイテム間の差をソート順で書き込むことでより大きな圧縮効果がある。アイテムは一様に分布しているので、その差は幾何分布に似ていることが示されている*2。ゴロム・ライス符号*3は、幾何学的に分布した値を最適に圧縮する方法だ。ゴロム・ライスでは、値は2Pを法とする商と剰余に分割され、別々にエンコードされる。商qは単身符号としてエンコードされ、qの文字列1つの後に0が1つ続く。rはP-bitのビッグエンディアンで表される。以下はP=2を使った場合のゴロム・ライス符号だ。xセットの構成GCSは以下の4つのパラメータから構成される。1)の最小サイズのバイト列である。Lの元のアイテムは最初に上記で指定された64-bitの符号なし整数にハッシュされ、ソートされる。streamにエンコードされる。streamは最も近い境界バイトに0でパディングされアウトプットのバイト列にシリアライズされる。圧縮されたGCS内にアイテムがあるかどうかメンバーシップを確認するには、エンコードされたdeltasからハッシュされたセットのメンバーを再構築する必要がある。これを行う手順は圧縮の逆で、deltasは1つずつデコードされ累積和に加算される。各中間和はオリジナルのセットのハッシュ値を表す。メンバーシップを照会されたアイテムはセット内のメンバーと同じ方法でハッシュされ、再構成された値と比較される。照会する際に圧縮解除されたセット全体をメモリ上に展開する必要はない。false一部のアプリケーションでは単一のアイテムの照会でなく、あるセットが含まれているかのチェックが必要になるかもしれない。これには圧縮されたGCSのソート構造を利用することで、個々のアイテムを個別にチェックするよりはるかに効率的に実行できる。最初に照会するアイテムはすべてハッシュ及びソートされ、圧縮解除されたGCSのコンテンツと順次比較される。ブロックフィルタこのBIPでは1つの初期フィルタタイプを定義する。19コンテンツBasicフィルタは軽量クライアントが通常のBitcoinウォレットと同期するのに必要なものすべてを含むよう設計されている。Basicフィルタはブロック内の各トランザクション毎に以下のアイテムを正確に含まないといけない。コインベーストランザクションを除く、各インプットが参照する前のアウトプットスクリプト(使用するスクリプト)全てのOP_RETURNアウトプットを除いた各アウトプットのscriptPubKeynil項目はフィルタ要素の最終セットに含まれてはならない。我々は将来ソフトフォークを介して、フィルタを容易にコミットできるよう全てのOP_RETRUNアウトプットを除外する。commitmentと同様、将来のコミットメントの領域になる可能性があるのが、コインベーストランザクションの追加のOP_RETURNアウトプットだ。全てのOP_RETURNアウトプットを除外することで、コミットメントとコミットされるアイテムの循環依存性を回避する。構成Basicフィルタタイプは以下のパラメータを持つゴロム・ライス符号のセットとして構成される。パラメータPは必ず19に設定し、パラメータMは784931に設定しなければならない。2Pと設定することが最適に近いことが分析で分かった。実証分析によると、これらのパラメータは偽陽性によりダウンロードされる予想ブロック数とフィルタ自体のサイズの両方を考慮し、使用帯域幅を最小に抑えるために選択されている。パラメータkにはフィルタを構築するブロックのハッシュの先頭16バイトを設定しなければならない。これにより鍵に決定性がありながら、ブロックごとに変化することが保証される。値NはGCSをデコードするのに必要なので、シリアライズしたGCSの先頭に含める(CompactSizeで記述する)。したがって完全にシリアライズしたフィルタは以下のようになる。bitsを割り当てる。bitsが有効なノードは、フィルタタイプ0x00および0x01についてBIP-157のすべてのメッセージに応答しなければならない。互換性このブロックフィルタの構成は、既存のソフトウェアと互換性は無く、新しいフィルタの実装が必要。代替案ゴロム・ライスエンコードセットに決まるまでにはいくつかの代替セットエンコードが検討された。このAppendixのセクションでは、そのいくつかの選択肢と、選択しなかった根拠を列挙する。filtersはおそらくセットのメンバーシップをテストするための最もよく知られた確率的データ構造で、BIP-37でBitcoinに導入された。filterのサイズは同じ偽陽性率を持つGCSの予想サイズよりも大きく、これが採用しなかった理由だ。暗号アキュムレータ暗号アキュムレータ*4は、(他の操作の中で)一方向のメンバーシップテストを可能にする暗号データ構造だ。アキュムレータの1つのメリットは、アキュムレータに挿入されるデータの数に関係なく一定のサイズであることだ。setupが必要となる。強RSA仮定に基づくアキュムレータはセットのアイテムを関連グループ内のプライムの代理人にマッピングする必要がある。solverベースのデータ構造が存在する*5。GCSベースのフィルタは実装の複雑さがはるかに低く、分かりやすいためGCSベースのフィルタを選択した。Vectorがここに公開されている。Vectorを生成するコードはこちら。scriptにプッシュされているアイテムはこのBIPのフィルタでは対象外なのはちょっと意外。偽陽性のパラメータはBIP-37は推奨値があるがBIP-158では固定されている(全チェーンで共通のフィルタになるので固定になるのはまぁ当然)。ゴロム・ライス符号含めて理解するのには実装してみた方が早いかも。Vectorsが欲しい。Filterを定義したBIP-158Tweet広告を非表示にする関連記事2018-06-09再利用可能なペイメントコードを使った二者間の決済アドレスの導出方法を定義したBIP-47BIP-47の記事無いですよね?と突っ込まれたので書いてみた。0.13.0がリリースされた。»プロフィールid:techmedia-think福岡でCloudとかBlockchainとか。(1)はてなブログをはじめよう!techmedia-thinkさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。