LoginSignup
3
0

More than 5 years have passed since last update.

Scriptless Script

Posted at

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の値を知る事ができます。


3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0