Taproot, and Schnorr, and SIGHASH_NOINPUT, oh my !

## Taproot, and Schnorr, and SIGHASH_NOINPUT, oh my !

Pieter Wuille

SF Bitcoin Devs
July 9, 2018

https://youtu.be/YSUVRj8iznU

---
<!--
### Bitcoin script system improvements
-->
### Bitcoinスクリプトシステムの改善


- 一般（General）

- 署名（Signatures）

- 構造（Structural）

- 実用化（Practical）

---
<!--
### Script system goals
-->
### スクリプトシステムの目標

<!--
Specifying conditions for spending a transaction output
-->
取引出力（Tx Output）を使用する条件の指定

- プライバシー（Privacy）

- スペース効率（Space efficiency）

- 計算効率（Computational efficiency）


関連するすべての（All related）
証明システム（Proof system）
実行と検証（Execution vs verification）

---
<!--
### Signature system improvements
-->
### 署名システムの改善

- シュノア（Schnorr）

- 集約（Aggregation）

- シグハッシュ（Sighash）

---
<!--
### Schnorr signatures
-->
### シュノア署名（Schnorr signatures）

<!--
Provably secure signatures with same assumptions as ECDSA
-->
- ECDSAと同じ条件で署名を安全に提供

<!--
sG = R + H(R,P,m)P instead of sR = mG + (R.x)P
-->
- sR = mG + (R.x)P の代わりに sG = R + H(R,P,m)P

<!--
Non-malleable
-->
- 非可鍛性（Non-malleable）

<!--
New sig scheme: fixed 64 bytes, batch verifiable
-->
- 新しい署名方式：固定64バイト、バッチ検証可能
   - 新しいBIP草案を参照（[See new BIP draft](https://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr.mediawiki)）

<!--
See new BIP draft
新しいBIP草案を参照
-->

<!--
Linearity! Sum of signatures is signature for sum of keys
-->
線形性！ 署名の合計は鍵の合計に対する署名

<!--
n-of-n, k-of-n, and really any policy can look like 1-of-1
-->
- n-of-n、k-of-n、どのポリシーも1-of-1のように見える
    - 説明する必要がない（Non accountable）

<!--
Non accountable
責任を負わない
-->

<!--
Needs multiple signing rounds
-->
- 複数の署名ラウンドが必要

<!--
Interactive key setup (unless MuSig)
-->
- 対話式キー設定（MuSigを除く）


Adapter signatures

---
<!--
Cross-input signature aggregation
-->
### クロス入力署名集約

<!--
Distinct from Schnorr signatrues
-->
- Schnorr signatruesとは異なる
    - プレーンなpubkeyセキュリティを備えたマルチ署名方式が必要
    - BNo6シグネチャ、またはMuSigを使用できます


<!--
Needs multisignature scheme with plain pubkey security
プレーンなpubkeyセキュリティを備えたマルチ署名方式が必要

Could use BNo6 signatures, or MuSig
BNo6シグネチャ、またはMuSigを使用できます
-->

<!--
Change to transaction validation model
-->
- トランザクション検証モデルへの変更
    - スクリプトの検証結果はtrue / false + pubkeysのリスト
    - すべてのオンライン取引時に単一の署名

<!--
Script validation has result true/false + list of pubkeys
スクリプトの検証結果はtrue / false + pubkeysのリスト

Single signature for entire transaction when all online
すべてのオンライン取引時に単一の署名
-->


Softfork compatibility

<!--
ソフトフォークの互換性
-->

Coinjoin incentive
All pubkeys still visible

<!--
コインジョインインセンティブ
すべてのpubkeysは引き続き表示されます
-->

---
<!--
New sighash modes
-->
### 新しいシグハッシュモード

<!--
Bitcoin currently only has 6 modes
-->
Bitcoinは現在6つのモードしかありません

<!--
Sign outputs: all, none, or the equal index one
-->
- サイン出力：all、none、またはequal index one

<!--
Sign inputs: all, or just the one being spent
-->
- サイン入力：すべて、または費やされたものだけ

<!--
No way to not sign inputs at all
-->
- 入力に全く署名しない方法はありません

<!--
SIGHASH_NOINPUT(BIP118): sign scripts, not txid
-->
SIGHASH_NOINPUT（[BIP118](https://github.com/bitcoin/bips/blob/master/bip-0118.mediawiki)）：txidではなく、スクリプトに署名

<!--
Replayable!
-->
- 繰り返し可能（Replayable!）

<!--
Eltoo payment channels; correct instead of punish
-->
- Eltooの決済チャネル; 罰せずに正しい（correct instead of punish）

<!--
Delegation? The ability to sign over the right to spend
-->
委任？ 消費する権利をサインする能力


---
<!--
Script structural improvements
-->
### スクリプトの構造改善

P2SH

<!--
Merkle branches
-->
マールク木（Merkle branches）

<!--
Unanimity branches
-->
合意枝（Unanimity branches）

Taproot

Graftroot

---
<!--
P2SH script verification (2012)
-->
### P2SHスクリプトの確認（2012）

<!--
Moved the actual script from output to input
-->
実際のスクリプトを出力から入力に移動しました

<!--
All outputs look identical! (except single-key ones…)
-->
- すべての出力が同じに見えます！ （シングルキーのものを除く...）

<!--
Senders don’t care about the receiver’s policy
-->
- 送信者は受信者のポリシーを気にしません

<!--
UTXO size impact
-->
- UTXOサイズの影響

<!--
You still reveal the full script when spending
-->
あなた使用したときに完全なスクリプトを明らかにする

---
<!--
Merkle branches in script (“MAST”)
-->
### スクリプトのMerkleブランチ(“MAST”)

<!--
Usually scripts are just an OR of a few keys, locktimes, hashlocks
-->
通常スクリプトは、いくつかの、キー、ロックタイム、ハッシュロックの単なるOR

<!--
Why reveal all possibilities ?
-->
なぜすべての可能性を明らかにするのか？

<!--
Put all disjunctions in a Merkle tree
-->
すべての論理和をMerkleツリーに入れる

<!--
Output is the Merkle root
-->
- 出力はMerkleのルート

<!--
Input is: script, path, signatures 
-->
- 入力は：スクリプト、パス、署名

<!--
O(log n) size
-->
サイズは、`O(log n)`

<!--
Only reveal the actually taken branch
-->
ただ、枝が正しいかを表現

![MAST.png](https://qiita-image-store.s3.amazonaws.com/0/29914/c1b81ff1-ae1a-074d-f7a9-a90dc56c7c52.png)

---
<!--
Merkle trees with unanimity branch
-->
### 合意枝を持つMerkleの木

<!--
In concrete problems, an “everyone agrees” branch is possible
-->
具体的な問題では、「誰もが同意する」ブランチが可能です

<!--
Top branch for all agree
-->
すべてのトップブランチが同意する

<!--
Court model
-->
裁判所モデル

<!--
Even better with Schnorr multisig
-->
Schnorr multisigでさらに良くなる

![Merkle trees with unanimity branch.png](https://qiita-image-store.s3.amazonaws.com/0/29914/7d46634a-177a-ed6c-4f49-bda56590d484.png)

---
### Taproot!

<!--
Basic idea: tweak pubkey Q = P + H(P,S)G
-->
基本的な考え方：Q = P + H（P、S）G

<!--
Q in output
-->
- 出力：Q

<!--
Key spend: sign(Q)
-->
- 鍵の支出：サイン（Q）

<!--
Script spend: P, S, inputs
-->
- スクリプトの使用：P、S、入力

<!--
Every output: P2SH or P2PK
-->
すべての出力：P2SHまたはP2PK

<!--
Don’t reveal which active
-->
どちらがアクティブであるかを明らかにしない

<!--
Unanimity branch: single sig
-->
合意枝：シングルSIG

![Taproot.png](https://qiita-image-store.s3.amazonaws.com/0/29914/d3630f04-9df0-e635-7f17-ea79db533254.png)

---
### Graftroot

<!--
Instead of Merkle tree, use delegation!
-->
Merkleツリーの代わりに、代表（delegation）を使用してください！

<!--
Just a top-level key (“all agree”) that signs scripts
-->
スクリプトに署名するトップレベルのキー（「すべて同意」）

<!--
Spending:
-->
支出：

<!--
Key spending: sig(key,tx)
-->
- 鍵支出：sig（key、tx）

<!--
Script spending: sig(key,script), script, inputs
-->
- スクリプトの支出：sig（key,script）、スクリプト、入力

<!--
O(1) in the number of possible branches
-->
ブランチの数は、`O(1)`

<!--
Inherently interactive key setup
-->
本質的に相互作用のあるキー設定

<!--
With half aggregation better than even simple tree
-->
単純なツリーよりも半分の集約で良い

![Graftroot.png](https://qiita-image-store.s3.amazonaws.com/0/29914/2a649219-3a88-f379-579b-01cb761297f1.png)


---
<!--
Practical
-->
### 実用化

<!--
Many ideas, too many to all develop at once
-->
すぐに開発することができない多くのアイデア

<!--
Incentives to do all at once
-->
一度にすべてを行うインセンティブ

<!--
Different structures can use segwit script versions
-->
- 異なる構造は、segwitスクリプトバージョンを使う事が可能
    - 匿名性セットを減らす

<!--
Reduces anonymity set
匿名性セットを減らす
-->

<!--
Signature aggregation does not work across softforks
-->
- ソフトフォークにわたってシグネチャ集約が機能しない

<!--
Experimentation vs producation script systems
-->
スクリプトシステムの、実験 vs 制作

<!--
My initial focus: Schnorr and Taproot
-->
私の初期の焦点：SchnorrとTaproot

<!--
Make all cooperative spends be just a single sig
-->
- すべての協力的な支出をただ一つのsigにする

<!--
Work on aggregation after structure improvements
-->
- 構造改善後の集約作業

---
# Thank you!