Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Confidential Transaction

Confidential Transaction

GBEC動画解説コンテンツのスライドです。
https://goblockchain.network/2019/02/confidential-transaction/

shigeyuki azuchi

February 08, 2019
Tweet

More Decks by shigeyuki azuchi

Other Decks in Technology

Transcript

  1. 1 Confidential Transaction Greg Maxwellによって発表された、Bitcoinの送金量を秘匿するための仕組み https://people.xiph.org/~greg/confidential_values.txt オリジナルのアイディアはBitcointalkでのAdam Backのポスト https://bitcointalk.org/index.php?topic=305791.0 ブロックチェーン上には個人情報は記載されないが、外的要因でアドレスと個人が結びつくと

    アドレス間の送金履歴などから、誰がいくら誰に支払いをしていたか分かってしまうため、 そのプライバシーを強化するためのプロトコル。 ※トランザクションの発生やアドレス( scriptPubkey)は通常のBitcoinと同様記載され、 秘匿されるのはあくまで量だけ。 • BlockstreamのサイドチェーンElementsで実装 https://github.com/ElementsProject/elements
  2. 2 Pedersen Commitment 1991年にPedersenによって提案された、離散対数を利用した秘密分散の仕組み https://www.cs.cornell.edu/courses/cs754/2001fa/129.PDF • シンプルなcommitment commitment = SHA-256(blinding_factor

    || data) • commitmentの加算 C(BF1, data1) + C(BF2, data2) == C(BF1 + BF2, data1 + data2) C(BF1, data1) − C(BF1, data1) == 0 data1〜3={1, 1, 2}、BF1〜BF3={5, 10, 15}の場合 C(BF1, data1) + C(BF2, data2) - C(BF3, data3) == 0 C(1 + 1, 5 + 10) − C(2, 15) == 0
  3. 3 楕円曲線ベースのPedersen Commitment • 楕円曲線暗号の秘密鍵(x)と公開鍵(Pub) Pub = xG (※Gは楕円曲線のベースグループ) •

    楕円曲線の加算特性 P1 + P2 = x1G + x2G = (x1 + x2)G ※この性質を利用したのが BIP-32のHDウォレット • 楕円曲線を利用したcommitment commitment = xG + aH ※ xは秘密のblinding factor, a はコミットするコインの量 HはGとは異なるベースグループでGから計算する H = to_point(SHA256(ENCODE(G))) ※楕円曲線上の点Hのx座標が(SHA256(ENCODE(G))) P1(x1, y1) P2(x2, y2) P1 + P2 (x3, -y3) (x3, y3)
  4. 4 Hの計算方法 require 'ecdsa' G = ECDSA::Group::Secp256k1 # 1. Gのジェネレーター(点)の

    x座標をSHA256し、Hのx座標を算出する encoded_g = ECDSA::Format::PointOctetString.encode(G.generator) coordinate_x = Digest::SHA256.hexdigest(encoded_g).to_i(16) => 36444060476547731421425013472121489344383018981262552973668657287772036414144 # 2. 算出したx座標からy座標を計算(yは2つ候補がある) y^2 = x^3 + 7 P = G.field.prime coordinate_y1 = G.field.power((coordinate_x**3 + 7) % P, (P + 1)/4) => 93254584761608041185240733468443117438813272608612929589951789286136240436011 coordinate_y2 = coordinate_y1 * -1 % P => 22537504475708154238330251540244790414456712057027634449505794721772594235652 # ※Elementsの実装ではcoordinate_y2を使用 # 3. x座標とy座標が分かったので Hの点が分かる。CTの場合Hは固定値なので都度計算する必要はな い。 H = ECDSA::Point.new(G, coordinate_x, coordinate_y2)
  5. 5 Bitcoinのトランザクションに適用 TxOut value(8 bytes) scriptPubkey commitment = xG +

    aH (32 bytes) “value”: 0.0050000 “commitment”: xG + 50000 * H ※ commitment = 楕円曲線の点=公開鍵 blinding factor(x)とaを知らない 第三者はコインの量が分からない アウトプットに明示されているコイン量の値(value)をCommitmentに置き換える
  6. 6 秘匿された量の検証 秘密を知らないユーザーには送金される量は分からないが、そのトランザクションで 送金されている量が正しい量かは誰もが検証できる必要がある。 (インプットの量 − アウトプットの量 = 手数料) インプットの総commitment

    − アウトプットの総commitment = 0 になればいい。 ※但し、手数料は明示的に設定する必要がある。 問題点 (1 + 1) − (-5 + 7) == 0 も成立し、もともとインプットは2BTCしかないが、7 BTCのアウトプットが 成立(=通貨発行)してしまう。 ※ commitmentが0〜2^64の範囲であることを証明する別の仕組みが必要 (In1 + In2 + In3 + … ) - (Out1 + Out2 + Out3 + … + fee * H) == 0
  7. 7 Range Proof commitment(P) = xG + aH • 前提

    Gに加えてHも付加しているため、誰もPの秘密鍵が分からない=誰もこの公開鍵に 対応した署名は作れない。 a = 0の場合、P=xGとなりxを知っているユーザーはPの秘密鍵を知っている ことになり、Pに対応した署名を作成できる。 • a = 1(a != 0)の場合の証明 1. Cを使って新しいcommitment C’ = C - 1H を作る。 2. a=1ならC'の秘密鍵はxで、C'の署名を作ることができる。 3. a != 1なら、誰もC'の署名に必要な秘密鍵はわからないので署名は作れない。
  8. 8 Range Proof OR Proofはcommitmentがあるデータ・セットの中のいずれかの値にコミットした ものであることを証明する仕組み。 C = xG +

    aH, C’ = C - 1H リング署名{C, C’}が提供された場合Cは0 か1 どちらかのコミットメントである。 コミットされた値が0..32の範囲にあること証明する場合は以下を用意する。 ◦ Commitmentのリスト ◦ OR Proof:C1(0 or 1),C2(0 or 2),C3(0 or 4),C4(0 or 8),C5(0 or 16) リング署名をさらに効率的にするためボロミアン・リング署名を採用。 https://github.com/Blockstream/borromean_paper/raw/master/borromean_draft_0.01_8c3f9e7.pdf
  9. 9 量の表現方法とBlinding Factorの通知 • 量の表現 量は浮動小数点で表現する。(0.0112345 → 112345 × 10^-7)

    性能とproofのサイズは仮数部のbit数に比例。 • Blinding Factorと量の通知 送信者は、送信者と受信者のECDHの鍵共有を利用し、量とBlinding factorを暗号化したメッセージをproofにセットすることで相手に通知する。 (他にも任意のメッセージを送るのに利用可)
  10. 10 range proofのサイズ問題とBulletproofs 現在の実装では、2つのアウトプットを持つトランザクションのサイズは5.5 KBほどで、 そのうちrange proofのサイズは5.3 KBを占める。ブロックサイズ1MBのような制限下 では現実的に採用しづらい。 Bulletproofs:

    Short Proofs for Confidential Transactions and More http://web.stanford.edu/~buenz/pubs/bulletproofs.pdf http://diyhpl.us/wiki/transcripts/scalingbitcoin/stanford-2017/state-of-cryptography/ • range proofのサイズを大幅に削減(4KB→670B: 2/10のサイズ) 範囲のビット長nについて 2 log(n) + 9 の要素で証明が作成でき、対数的な データ増加になる。 • range proofの集約をサポート(2つのrange proof 8KB→736B : 1/10のサイズ) 単一の証明にO(log(m))の追加要素が必要なだけ(m はコミットメントの数) 署名を集約できるのでアウトプットが多いCTほどrange proofの圧縮効果が高い。
  11. 11 Bulletproofsの適用 • Confidential Transaction, Confidential Assets • Monero https://github.com/b-g-goodell/research-lab/tree/master/source-code/Stri

    ngCT-java/src/how/monero/hodl/bulletproof 通常のrange proofに比べ90%のスペースの節約と25%の検証の高速化 • Mimblewimble(160GB→17GB) • Provisoins Protocol(Proof of Solvency:200万ユーザー18GB→62MB) http://www.jbonneau.com/doc/DBBCB15-CCS-provisions.pdf • ValueShuffle(CoinJoin + Confidential Transaction) https://eprint.iacr.org/2017/238.pdf