Scriptless Script

# Scriptless Script

今年Bitcoinに取り込まれるだろう（願望）技術、というより[Schnorr Signature](https://qiita.com/tnakagawa/items/a68606f005630cd09415)が可能になると出来る事です。

なぜ、「Scriptless Script」が必要かというと以下の２点を解決する事を目的としています。

- プライバシー（privacy）
- 代替可能性（fungibility）

現在、Bitcoinで扱われるScript（P2SH、P2WSHなど）の場合、
送信先にはScriptのハッシュ値（HASH160、SHA256など）の情報しかありませんが、
利用する場合に、Scriptを記述する必要があります、
そして、各フルノードはScriptを検証します。

要するに、Scriptの内容は公開されてしまいます。
現在のブロックチェーン全般的に、スマートコントラクトはScriptで表現される事が大半です。
ブロック化される時には、Scriptの中身が公開されているので、プライバシー（privacy）の問題がおこります。
また、Scriptの内容がギャンブルなどであった場合、それを受け取った側も関わっている可能性を疑われ
受け取りを拒否されてしまうかもしれません。
社会的な問題とは別に、ピン札でも、しわくちゃでも、濡れていても、一万円札は一万円の価値があるという
通貨としての概念、代替可能性（fungibility）が必要となります。


## 提供方法（予想）

Segwitのversion違いで提供されると思われます。

```math
\begin{align*}
& \text{pk_script（送信先）:} \\
& \text{<segwit-version-byte:0xXX> <xx-byte-key-hash>} \\
&  \\
& \text{witnesses（利用時）:} \\
& \text{<signature : }s\text{ > <random-point : }R\text{> <public-key : }P\text{ >}\\
\end{align*}
```

ハッシュ関数は、Publickeyなので、[HASH160](https://qiita.com/tnakagawa/items/57c03595cb69cb685be1#hash160)かなと予想

Schnorr Signatureを簡単に記します。
詳しく知りたい場合は[ここ](https://qiita.com/tnakagawa/items/a68606f005630cd09415)を参照ください。

```math
\begin{align*}
& \text{署名者の秘密鍵と公開鍵}\\
& P = pG \\
& \text{署名時の乱数}\\
& R = rG \\
& \text{メッセージ ： }m\\
& \\
& \text{署名 : sign} \\
& s = r - {\bf H}(R,P,m)p \\
& \text{署名値 : }(s,R) \\
& \\
& \text{検証 : verify} \\
& sG \overset{?}{=} R - {\bf H}(R,P,m)P \\
\end{align*}
```

## 通常

先に説明した、Schnorr Signatureをそのまま使う

```math
\begin{align*}
& \text{署名者の秘密鍵と公開鍵}\\
& P = pG \\
& \text{署名時の乱数}\\
& R = rG \\
& s = r - {\bf H}(R,P,m)p \\
& \text{署名値 : }(s,R) \\
\end{align*}
```

## マルチ署名

AliceとBobの二人の署名がいる場合を考えてみます。

```math
\begin{align*}
& \text{Aliceの秘密鍵と公開鍵}\\
& A = aG \\
& \text{Bobの秘密鍵と公開鍵}\\
& B = bG \\
& \text{送信先}\\
& P = A + B \\
\end{align*}
```

署名する場合、AliceとBobは乱数を生成します。

```math
\begin{align*}
& \text{Aliceの乱数}\\
& R_a = r_aG \\
& \text{Bobの乱数}\\
& R_b = r_bG \\
\end{align*}
```

これを、お互いに合意します。
※：合意シーケンスが必要となります。
AliceとBobは署名を行います。

```math
\begin{align*}
& \text{署名時の乱数}\\
& R = R_a + R_b \\
& \text{Aliceの署名}\\
& s_a = r_a - {\bf H}(R,P,m)a \\
& \text{Bobの署名}\\
& s_b = r_b - {\bf H}(R,P,m)b \\
& \text{署名の和}\\
& s = s_a + s_b \\
& \text{署名値 : }(s,R) \\
\end{align*}
```

証明してみます。

```math
\begin{align*}
& \text{署名値 : }(s,R) \\
& sG \overset{?}{=} R - {\bf H}(R,P,m)P \\
& s = s_a + s_b \\
& s = r_a - {\bf H}(R,P,m)a + r_b - {\bf H}(R,P,m)b \\
& s = r_a + r_b - {\bf H}(R,P,m)(a + b) \\
& \text{両辺に}G\\
& sG = r_aG + r_bG - {\bf H}(R,P,m)(aG + bG) \\
& sG = R_a + R_b - {\bf H}(R,P,m)(A + B) \\
& sG = R - {\bf H}(R,P,m)P \\
\end{align*}
```

## Atomic Swap

※：いくつかの問題が残っています。

ここでの前提は、
AliceはXXXcoinを持っていて、YYYcoinに変えたいです。
BobはYYYcoinを持っていて、XXXcoinに変えたいです。

Alice側のパラメータ

```math
\begin{align*}
& P_A = p_AG\ \text{ : XXXcoinで使うAliceの公開鍵と秘密鍵} \\
& R_A = r_AG\ \text{ : XXXcoinで使うAliceの乱数鍵} \\
& P'_A = p'_AG\ \text{ : YYYcoinで使うAliceの公開鍵と秘密鍵} \\
& R'_A = r'_AG\ \text{ : YYYcoinで使うAliceの乱数鍵} \\
\end{align*}
```

Bob側のパラメータ

```math
\begin{align*}
& P_B = p_BG\ \text{ : XXXcoinで使うBobの公開鍵と秘密鍵} \\
& R_B = r_BG\ \text{ : XXXcoinで使うBobの乱数鍵} \\
& P'_B = p'_BG\ \text{ : YYYcoinで使うBobの公開鍵と秘密鍵} \\
& R'_B = r'_BG\ \text{ : YYYcoinで使うBobの乱数鍵} \\
\end{align*}
```

お互いの公開鍵は合意しているとします。

Aliceは以下へXXXcoinを送ります。

```math
\begin{align*}
& P = P_A + P_B
\end{align*}
```
Bobは以下へYYYcoinを送ります。

```math
\begin{align*}
& P' = P'_A + P'_B
\end{align*}
```

乱数は以下のとおりです。

```math
\begin{align*}
& R = R_A + R_B \\
& R' = R'_A + R'_B \\
\end{align*}
```

Bobは、Adaptor Signatureを作成しAliceに送る。

```math
\begin{align*}
& T =tG　\\
& s^{t}_B = t + r_B - {\bf H}(R,P,m)p_B \\
& s'^{t}_B = t + r'_B - {\bf H}(R',P',m')p'_B \\
&(s^{t}_B,R_B,T) \text{ : XXXcoinのAdaptor Signature}\\
&(s'^{t}_B,R'_B,T) \text{ : YYYcoinのAdaptor Signature}\\
\end{align*}
```

Aliceは、受け取ったAdaptor Signatureを検証する。

```math
\begin{align*}
& s^{t}_BG \overset{?}{=} T + R_B - {\bf H}(R,P,m)P_B \\
& s'^{t}_BG \overset{?}{=} T + R'_B - {\bf H}(R',P',m')P'_B \\
\end{align*}
```

正常であれば、AliceはXXXcoinの署名を作成しBobへ送信する。

```math
\begin{align*}
& s_A = r_A - {\bf H}(R,P,m)p_A \\
& \text{署名値 : } (s_A,R_A) \\
\end{align*}
```
Bobは、受け取った署名値を使ってXXXcoinを取得する

```math
\begin{align*}
& (s_A,R_A) \\
& s_B = r_B - {\bf H}(R,P,m)p_B \\
& s = s_A + s_B \\
& \text{署名値 : } (s,R) \\
\end{align*}
```

Aliceは、BobがXXXcoinを取得した値から`t`を計算しYYYcoinを取得する。

```math
\begin{align*}
& (s,R) \\
& t = s^{t}_B - s \\
& s'_A = r'_A - {\bf H}(R',P',m')p'_A \\
& s' = s'^{t}_B - t + s'_A \\
& \text{署名値 : } (s',R') \\
\end{align*}
```

※※※　注意　※※※
一見、正常に見えますが、マルチ署名アドレスに送ったあと、
片方が消えてしまった場合のリカバリー処理がありません。
通常のAtomic Swapは、LockTimeを使って回避します。

# まとめ

利用時に必要なパラメータは、いずれも以下となります。

```math
\begin{align*}
& \text{署名値 : }(s,R) \\
\end{align*}
```

従って、受け取ったフルノードは、どの利用方法で使われたのかを判別できませんが、
利用できるかどうかの検証は可能となります。
これにより、プライバシー（privacy）や、代替可能性（fungibility）に有効となります。


# 参考

Scriptless Scripts / Andrew Poelstra / March 4, 2017 / MIT Bitcoin Expo 2017 ?
https://download.wpsoftware.net/bitcoin/wizardry/mw-slides/2017-03-mit-bitcoin-expo/slides.pdf

Adaptor Signatures and Atomic Swaps from Scriptless Scripts / Andrew Poelstra / 30 Oct 2017
https://github.com/apoelstra/scriptless-scripts/blob/master/md/atomic-swap.md

Using Chains for what They’re Good For / Andrew Poelstra / November 5, 2017 / Scaling Bitcoin Stanford
https://scalingbitcoin.org/stanford2017/Day2/Using-the-Chain-for-what-Chains-are-Good-For.pdf

Scriptless Scriptで実現するAtomic Swap / 安土 茂亨 / 2017-11-11
https://techmedia-think.hatenablog.com/entry/2017/11/11/134311

---
# 付録

## Adaptor Signature

Schnorr Signatureの拡張です。
署名者が以下を検証者に渡します。

```math
\begin{align*}
& P = pG \\
& R = rG \\
& T = tG \\
& s' = t + r + {\bf H}(R,P,m)p \\
& \text{署名値 : }(s',R,T)
\end{align*}
```

検証者は以下を検証する事により、
署名者がSchnorr Signatureを証明可能である事を知る事が出来ます。

```math
\begin{align*}
& s'G = T + R + {\bf H}(R,P,m)P \\
\end{align*}
```

また、署名者が`s`を利用すると、検証者は`t`の値を知る事ができます。

<!--
## 乱数の合意

署名する場合、AliceとBobは乱数を以下に記します。

```math
\begin{align*}
& \text{Aliceの乱数}\\
& R_a = r_aG \\
& \text{Bobの乱数}\\
& R_b = r_bG \\
\end{align*}
```

これを、お互いに合意するシーケンスですが、いきなり乱数`R`を渡すと危険です。

```math
\begin{align*}
& {\bf H}_{com}(\cdot)\ \text{ : コミットメントハッシュ関数}\\
& \text{Step 1 : Aliceは乱数のコミットメントをBobに送る} \\
& c_a = {\bf H}_{com}(R_a)\\
& \text{Alice }\overset{c_a}{\rightarrow}\text{Bob}\\
& \text{Step 2 : Bobは乱数のコミットメントをAliceに送る} \\
& c_b = {\bf H}_{com}(R_b)\\
& \text{Bob }\overset{c_b}{\rightarrow}\text{Alice }\\
& \text{Step 3 : Aliceは乱数をBobに送る} \\
& \text{Alice }\overset{R_a}{\rightarrow}\text{Bob}\\
& \text{Step 4 : BobはAliceの乱数をチェックし、乱数をAliceに送る} \\
& c_a \overset{?}{=} {\bf H}_{com}(R_a)\\
& \text{Bob }\overset{R_b}{\rightarrow}\text{Alice }\\
& \text{Step 5 : AliceはBobの乱数をチェック} \\
& c_b \overset{?}{=} {\bf H}_{com}(R_b)\\
\end{align*}
```
これも、ゼロ知識証明（zero-knowledge proof）の一種だそうです。

-->

---