Grin でのトランザクションの説明
編集者注: この記事は以下から引用しましたイーサリアム愛好家編集者注: この記事は以下から引用しましたBrandon Arvanaghiイーサリアム愛好家
(ID: ethfans)、著者:
、翻訳・校正:stormpang & Min Min、許可を得て掲載。
編集者注: Grin は、MimbleWimble プロトコルに基づいた新しい暗号通貨です。この記事は詳細なチュートリアルであり、MimbleWimble プロトコルでのトランザクションがどのように構成されているか、および暗号化を使用して両当事者のアドレスとトランザクション金額を明らかにすることなく通貨の二重支払いを防ぎ、通貨のみを暗号化する方法を段階的に説明しています。通貨所有者は通貨を使用できます。
この記事は、Grin トランザクションの動作原理を共有し、Grin トランザクションが実際にどのように動作するかを誰もが理解できるようにすることを目的としています。

Grin トランザクションの出力は Pederson コミットメントであり、次の形式になります。
画像の説明
- Grin 出力は Pedersen の約束です。 -
ペルダーセンの約束は情報を隠すための優れた方法です。ペルダーセン コミットメントの概念を初めて聞いた場合は、その言葉を目にするたびに、「シールドされた値」という概念を思い浮かべてください。
次のテキストは Grin の wiki (Grin トランザクションがどのように機能するかを理解するための最良の入門書) からの抜粋です。
非常に大きな数 k を秘密鍵として選択し、k * H を対応する公開鍵として選択するとします。たとえ誰かが公開鍵 k * H の値を知っていたとしても、そこから k の値を推測することはほとんど不可能です...
r はブラインド要素として使用される秘密鍵、G は楕円曲線上の固定点、それらの積 r * G はこの曲線上の r の公開鍵です。
v は入力値または出力値、H は楕円曲線上の別の固定点です。
秘密鍵 k と秘密鍵 j がわかっている場合、(k+j) * H = k * H + j * H、つまり、2 つの秘密鍵の合計に固定小数点 H を乗算することによって生成される公開鍵 (( k+j) * H) ) は、2 つの秘密鍵にそれぞれ固定小数点 H を乗算することによって生成される 2 つの公開鍵の合計 k * H + j * H に等しくなります。
暗号化についてさらに詳しく知りたい場合は、ECC 入門ブログをご覧ください。つまり、Grin の出力を使用するには、ブラインド係数 (r) と Grin の取引額 (v) の両方がわかっていなければなりません。これら 2 つの値は、約束を破ることによって逆に推定することはできません。したがって、Grin の出力は、これらの値が事前にわかっている場合にのみ使用できます。
ブラインド係数 20 を使用して、この出力に 40 Grin が含まれているとします。

(間奏: 実際に送信される Grin の数は、原子単位 1 NanoGrin の整数倍です。ここでは、話を簡単にするために、例として Grin の整数を使用します):
- この出力では、ブラインド係数は 20、笑顔の数は 40 です。 -

Grin ブラウザで Grin トランザクションの出力を見ると、実際の出力が上の図のような明確な式で表示されていないことがわかります。 Grin の出力は実際には次のようになります。
-Grin 出力 (「コミット」列内)。 -
繰り返しますが、この出力から「20」(盲検係数)または「40」(Grin の量)を推測することは不可能です。
副題
先ほど述べた出力がアリスのものであると仮定します。さて、アリスはこれら 40 個のグリンのうち 25 個をボブに送りたいと考えています。話を簡単にするために、マイナーの取引手数料を無視しましょう。

5 ドル札を持っていて、3 ドルで何かを買うと、2 ドルのお釣りが得られます。これがビットコイン システムのトランザクションの仕組みであり、Grin も例外ではありません。アリスが未使用トランザクション出力 40 グリンから 25 グリンを取り出してボブに送信したい場合、このトランザクションで新しい未使用トランザクション出力も作成し、残りの 15 グリン (変更) を自分のアドレスに返します。
画像の説明
この取引の 15 グリンはアリスに戻ります。つまり、アリスだけが 15 グリンを制御して再び使用できることになります。言い換えれば、ボブがアリスの小銭を使うことは不可能に違いありません。これを行うには、アリスは変更出力に対して新しいブラインド要素を作成する必要があります。アリスが 34 を選んだとします。

r (お釣りの出力の盲目係数) と v (お釣りを与えるグリンの量) の両方を知っているアリスは、お釣りの出力 (co) を作成するために必要な情報をすべて持っており、これはブロックチェーンに出力として記録されます。優れた。アリスがボブに送信しようとしている 25 グリンの出力にも同じことが当てはまります。
画像の説明
前に述べたように、出力は、それが使用するブラインド要素がわかっている場合にのみ使用できます。アリスは、自分が費やしたい生産量の盲目係数 (20) を知っていますが、彼女が知っていることをグリン システム内の他の人に証明する方法が必要です。

そのため、彼女は合計の盲目係数を解決する完全に別の計算を作成する必要があります。これは、アリスが自分の小銭出力用に作成したブラインド係数 (34) から、彼女が費やしたい出力のブラインド係数 (20) を引いたものです。
画像の説明
- アリスの盲目要素の総数。 -
rs (s は送信者、つまりアリスを意味します) はアリスのブラインド要素の総数を表し、この例では 14 です。 (間奏: カーネル オフセットを意図的に省略しました。)"アリスは次の情報をボブに送信します。実はGrinのデータは「メタデータ」と「メタデータ」に分かれているわけではなく、

データ (データ)」フィールドですが、明確にするために、この記事では意図的に 2 つを区別します。
画像の説明
- Grin トランザクションの最初のステップで、アリスがボブに送信する必要があるすべての情報。 -
メタデータフィールド:
送信する金額: アリスがボブに送信したいグリンの金額 (この例では 25)。
トランザクション固有 ID (TX UUID): このトランザクションを識別するためにデータを送受信するときにアリスとボブが使用する固有の識別子。
トランザクション手数料 (TX 料金): トランザクション手数料 (このチュートリアルでは説明しません)。
ロックの高さ (lock_height): トランザクションが有効になるブロック番号。
データ (データ) フィールド:
トランザクション入力 (TX 入力): アリスは、ボブに送信されるトランザクションへの入力として、1 つまたは複数の未使用の出力を使用します。
変更出力 (co): アリスの変更出力
ks • G: アリスのノンス ks に生成点 G を乗算し、得られた値がこのノンスの Pedersen コミットメントです。
rs • G: アリスの合計ブラインド係数 rs に生成点 G を乗算し、得られた値がこの rs の Pedersen コミットメントです。
ボブの行動

アリスによって送信された情報を受信した後、ボブは 2 つの変数 TX 料金とロック高さを連結して M (トランザクションの「メッセージ」) を生成します。
画像の説明
ボブは、アリスから受け取る 25 グリンのブラインド係数 rr を選択します (r は受信者、つまりボブを表します)。彼が 11 を選択したとします。同時に、彼は独自のランダムなノンス kr (r は受信機の略) も選択します。

アリスの操作と同じように、ボブは 2 つの値 rr と kr にそれぞれ生成点 G を乗算してペダーセン コミットメントを作成します。これらのデータを使用して、Bob は、変数 e で表される、このトランザクションに対応する Schnorr チャレンジを生成できます。
画像の説明
- 取引シュノアチャレンジ。 -
Schnorr チャレンジ SHA256 は、次の情報を順番にハッシュします。
取引のお知らせ。
ボブ (25 グリンの出力用に選択) のブラインディング ファクターのコミットメントと、アリスの合計ブラインディング ファクターのコミットメントの合計。

ボブは、e (sr (r は受信者の略)) を介してトランザクションに対して独自の Schnoor 署名を生成します。 sr はボブの完全署名ですが、最終的にアリスの部分署名と結合されてトランザクション全体の署名が作成されるため、これをボブの部分署名と呼びます。
- トランザクションに対するボブの部分署名。 -

アリスが最終的に sr を受け取ったとき、kr または rr の実際の値を推測する方法はありません。ボブはアリスに次のメッセージを送信します。
画像の説明
- ボブは、部分的な署名、ノンスに対応するコミットメント、および 25 グリンの盲目係数に対応するコミットメントをアリスに送信します。 -
送信されるコンテンツには順番に次のものが含まれます。
sr: ボブの部分署名。
kr • G: ボブが選択したナンスに対応するコミットメント。
rr • G: ボブが受け取ろうとしている 25 グリンの盲目係数に相当するコミットメント。
これで、アリスは、このトランザクションの e と Schnorr チャレンジを計算するために必要なものをすべて手に入れました。 e をローカルで計算した後、アリスはボブの部分署名を検証できます。

覚えているとおり、ボブの部分署名 sr は次の要素で構成されています。
- トランザクションに対するボブの部分署名。 -

前に説明した楕円曲線の特性に基づいて、アリスが方程式の両辺に生成点 G を乗算した後でも方程式は成立します。
画像の説明
- アリスは方程式の両辺に母点 G を掛けます。 -
アリスはすでにボブから kr・G (ボブが選択したノンスに対応するコミットメント) と rr・G (ボブが受け取ることになるブラインド係数 25 Grin に対応するコミットメント) を受け取っており、ローカルで与えられた e を計算しているので、彼女は検証することができます。ボブの部分署名は、sr に生成点 G を単純に乗算して、方程式の右側の値と等しくなるようにします。
上記を行うことで、アリスは次のことを証明できます。
ボブは自分が受け取るグリンの量を知っています (25)。
ボブは自分のナンスの価値を知っています。
...この時点で、アリスはボブが選択したナンスと盲目的な要素を知らずに、ボブの部分的な署名を検証しました。

次に、アリスは自分自身の部分署名を生成します。
画像の説明

-取引に対するアリスの部分署名。 -
これで、アリスは、自分とボブの部分的な署名を含むトランザクションの署名を生成できるようになりました。
トランザクション署名は、アリスとボブの部分署名の合計と、それぞれのノンスに対応するコミットメントの合計で構成されます。
署名には順番に次の内容が含まれます。
アリスとボブの nonce に対応するコミットメントの合計 (どちらも相手の nonce 値を知りません)。

マージ後のトランザクション署名は次のように表現できます。
画像の説明
-取引署名-
このうち、s = ss + sr、k = ks + kr となります。
この署名を覚えておいてください。それが何を意味するかはすぐにわかります。
取引完了
デジタル通貨には「メモリ」が必要です。つまり、ある人に送金する場合、同じ送金を他の人に送ることはできません。 Grin を使用することで、Grin がいくら送ったか、誰が受け取ったかを隠します。では、このお金が「二重に使われていない」ことや、何もないところから生み出されたものではないことをどうやって証明すればよいのでしょうか?
Grin トランザクションでは、入力からすべての出力を差し引いた後、残りの Grin の量は 0 になるはずです。もう一度 5 ドル紙幣を例に挙げます。
(34•G) + (15•H) + (11•G) + (25•H) - (20•G) - (40•H) = (25•G) + (0•H)
レジ係への 3 ドル (出力) + 私に戻ってくる 2 ドルの小銭 (出力) - 5 ドルの請求書 (入力) = 0
同様に、正当な Grin トランザクションも上記の方程式を満たします。では、実際の値を公開せずに検証するにはどうすればよいでしょうか?アリスとボブの間のトランザクションの入力と出力を見てみましょう。
Grin トランザクションの出力の合計から入力の合計を引いた値から有効な楕円曲線公開キーが得られる場合、v の値をキャンセルする必要があることがわかります。既知の値 n に対して方程式の右辺が n・G + 0・H の形式でない場合、その取引は違法であることがわかります。これは、総生産量が総投入量よりも大きいことを意味します (例: あなたが 5 ドルを支払い、レジ係が 3 ドルを受け取り、代わりにあなたに 10 ドルを渡します)、または総投入量が総生産高よりも大きい (例: あなたが 5 ドルを支払い、レジ係が 3 ドルを受け取ります) のいずれかを意味します。 、ただしお金はもらえません)。

上に描かれたサインを覚えていますか?
画像の説明
この署名は、実際には、先ほど述べた過剰な盲検化要素に対応するコミットメントに署名します。これについては、以下で説明します。

ボブの部分署名の方程式の両辺に G を掛けると、次の方程式が得られることを思い出してください。
-点 G を生成した後、方程式の両辺にボブの部分署名が乗算されます-

同様に、アリスの部分署名の方程式の両辺に G を掛けると、次の方程式が得られます。
画像の説明
sr•G + ss•G = (kr • G) + (ks • G) + (e • (rr•G + rs•G))
- 点 G を生成した後、方程式の両辺にアリスの部分署名が乗算されます。 -
2 つの方程式を足し合わせるとどうなるでしょうか?次のものが得られます:
ここで、rr はボブのブラインド係数、rs はアリスのブラインド係数の総数、rr・G + rs・G は (rr + rs)・G に等しくなります。
sr•G + ss•G = (k•G) + (e • (r•G))
ボブの盲目係数は 11•G のコミットメントに相当します。アリスの合計ブラインド係数は 14・G のコミットメントに相当し、この 2 つを合計すると 25・G になります (トランザクション全体の過剰なブラインド係数コミットメントを表します)。したがって、sr (ボブの部分署名) と ss (アリスの部分署名) の合計が、過剰なブラインド係数に対応するコミットメントに等しい場合、トランザクション全体が合法であることを証明できます。
sr•G + ss•G = (k•G) + (e • (25•G))
この方程式をさらに単純化すると、次のようになります。
または:
あとは、方程式の両辺が等しいかどうかを確認するだけです。
方程式内のすべての変数 (部分的な署名の合計、e の部分、過剰なブラインディング要素のコミットメント、ノンスの合計のコミットメント) は誰でも見ることができるため、誰でも検証できることに注意してください。アリスのブラインド要因もボブのブラインド要因も知らなくてもトランザクションを検証できます。それらの部分署名を追加し、その合計が超過盲検化係数に対応するコミットメントと等しいことを検証することで、次のことを証明できます。
アリスとボブがトランザクションを作成するとき、彼らは両方ともそれぞれの出力の盲目的な要因を知っています。これは、出力がロックされないように、トランザクションによって生成された新しい出力を使用できることを意味します。
トランザクションの検証に使用した情報は、トランザクション カーネルに配置されます。
副題
トランザクションカーネル
出力に加えて、トランザクション カーネルも Grin トランザクションによって生成される情報の一部です。各トランザクションはトランザクション カーネルを生成しますが、それに関連付けられたトランザクション カーネルは、Grin ブロックチェーン上の出力をクエリしても見つかりません。すべての Grin トランザクションにはトランザクション カーネルが含まれており、余分な Grin が何もないところから作成されたわけではないことを証明します。
次の情報がトランザクション カーネルに保存されます。
トランザクション手数料 (transaction Fee) とロックの高さ (lock_height)。 (幕間: Coinbase トランザクションの場合、これら 2 つの情報部分は含まれません)。
要約する
副題
要約する
これらすべての操作の後、次のトランザクション関連情報のみがネットワークにブロードキャストされます。
入力が費やされました。
新しく生成された出力。
トランザクションコア。
カーネル オフセット (ここでは説明しません)。







