Scriptless Script


Scriptless Script

今年Bitcoinに取り込まれるだろう(願望)技術、というよりSchnorr Signatureが可能になると出来る事です。

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

  • プライバシー(privacy)
  • 代替可能性(fungibility)

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

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

提供方法(予想)

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

\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かなと予想

Schnorr Signatureを簡単に記します。
詳しく知りたい場合はここを参照ください。

\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をそのまま使う

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

マルチ署名

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

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

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

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

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

\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*}

証明してみます。

\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側のパラメータ

\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側のパラメータ

\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を送ります。

\begin{align*}
& P = P_A + P_B
\end{align*}

Bobは以下へYYYcoinを送ります。

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

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

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

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

\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を検証する。

\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へ送信する。

\begin{align*}
& s_A = r_A - {\bf H}(R,P,m)p_A \\
& \text{署名値 : } (s_A,R_A) \\
\end{align*}

Bobは、受け取った署名値を使ってXXXcoinを取得する

\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を取得する。

\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を使って回避します。

まとめ

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

\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の拡張です。
署名者が以下を検証者に渡します。

\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を証明可能である事を知る事が出来ます。

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

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