既存の銀行システムについて話すと、あるアルファ銀行内の取引は、貸借対照表を編集しているだけです。名前は、名前の反対側で減少し、反対側で増加します。 銀行間振替の場合、SWIFTなどの一部のサードパーティ組織が接続されていますが、実際にはすべてがほぼ同じように機能します。
ブロックチェーンベースの金融システムを扱う場合、送金プロセスはまったく異なって見えます。 ビットコインには、<address、balance>という形式の一般的なテーブルはありません。このテーブルを編集するレギュレーターが存在しないのと同じです。 この記事では、ビットコインのトランザクションとは何か、どのように構築されるか、そしてビットコインが独自のプログラミング言語を追加した理由を説明します。
本
- ビットコインの概要-暗号化
- ビットコインの概要-トランザクション
- ビットコインの概要-プロトコル
- 一言で言えばビットコイン-ブロックチェーン
- ビットコインの概要-マイニング
目次
- はじめに
- 入力と出力
- 料金
- ウチョ
- TXN構造
- スクリプト
- トランザクションのロックとロック解除
- パスワードスクリプト
- 公開鍵ハッシュに支払う(P2PKH)
- P2Pストレージ
- リンク集
はじめに
上で言ったように、ビットコインには、各アドレスの現在の残高が一致する単一の構造はありません。 代わりに、同じ悪名高いブロックチェーンが使用されます。つまり、通常、すべてのトランザクションが保存されます。 簡単にするために、今のところ、これらは次の形式のメッセージであると仮定できます。
<address 1> sent <amount> BTC to <address 2>
そのため、ブロックチェーン全体を回る場合、特定のアドレスに「属する」コインの数を計算できます。
入力と出力
ビットコインネットワークでの実際のトランザクションは、実際には上記のものよりも少し複雑です。 実際、これは面倒な構造であり、その主なコンポーネントは入力(入力)と出力(出力)です。
入力は、「参照」するトランザクションです。 3つのトランザクションがあなたのアドレスXに一度送信されたと想像してください:
- TXN_ID -123456、 VALUE -40 BTC
- TXN_ID -6453795、 VALUE -10 BTC
- TXN_ID - 888888 、 VALUE -100 BTC
たとえば、45 BTCを使用する必要がある場合は、トランザクション888888または2つのトランザクション123456と6453795を一度に参照できます。 必要に応じて、3つのトランザクションすべてを参照することもできますが、理由は明らかではありません。
出力 -文字通り「出力」。 今のところ、これらは取引の結果として資金が「送信」されるアドレスであると仮定できます(そうではありませんが)。 複数の出口が存在する場合もあり、それぞれに独自の量があります。
次の図では、新しいトランザクションCが作成されます 。これは、2つの出力-AとBを参照しています。 その結果、トランザクションは入力で0.008 BTCを受信し、その後2つの出力に分割されます。0.003BTCは最初のアドレスに送信され、 0.004 BTCは2番目のアドレスに送信されます。
一度に複数の出口を指定する機能は非常に重要な機能です。トランザクション(またはその出力)は入力として一度だけ使用でき、全体としてのみ使用できるためです。 つまり、10 BTCで着信トランザクションがあり、そのうち8つを一部のスターバックスで使用する必要がある場合、1つの入力と2つの出力でトランザクションを作成します:ストアへの8 BTCと住所への2 BTC。 出力の合計が入力の合計よりも小さいトランザクションを作成する場合(図のように)、ブロックにトランザクションを書き込んだマイナーのアドレスに差が送信されます。
料金
この入力の合計と出力の合計の差が、 取引手数料 、つまり取引手数料と呼ばれます。 それは鉱夫にとって2番目に重要な収入源であり、トランザクションがブロックチェーンに含まれるのにかかる時間はそれに依存します。 これは、各鉱夫がブロック内にあると主張する未確認のトランザクションの特定のプールを持っているという事実によるものであり、原則として、鉱夫は単純に降順でそれらをソートし、それにより利益を最大化します。 したがって、コミッションが高ければ高いほど、あなたはキューに入り、支払いが速くなります。
以下の図では、135,000 ドルの手数料で取引を受け取った鉱夫の身元を確認できます。
ウチョ
新しいトランザクションがブロックチェーンに入力されるとすぐに、その出力を入力として使用できます。 まだ使用されていない出力などには、 UTXO ( 未使用トランザクション出力 )という特別な名前があります。 既に述べたように、各出力は1回だけ入力として使用できます。したがって、実際には未使用の出力が重要であり、既に使用されている出力はシステムのセキュリティへのオマージュとしてより多く保存されます。
UTXOによるBTWは、多くの場合、未使用の出力の配列全体を意味しますが、教育を受けた若者はUTXOプール、または極端な場合にはUTXOセットを作成する必要があります 。
記事の最初に戻ると、ブロックチェーン全体をソートする必要のないアドレスの残高を計算するには、 UTXOプールをソートするだけで十分であることを理解する必要があります。これは明らかに高速です。
構造
トランザクションの一般的な見解は、 公式のプロトコル仕様で説明されています 。ここでは、 Ken Shirriffブログからのライブ例を紹介します。
何らかの不思議な理由で、 値と以前の出力ハッシュはリトルエンディアン形式で表されなければなりません。つまり、このケースでは、参照するトランザクションのハッシュは実際には81 b4 c8 32 ...です。 as ... 32 c8 b4 81 。 同様に、トランザクション量は0.00091234 BTCまたは16進数の0x016462ですが、プロトコルでは62 64 01 01 00 00 00 00 00 00と記述されています。
BTWトランザクションハッシュは非常に単純であると見なされます-トランザクション全体を一連のバイトとして取得し(上記の例では、 010000000148 .... 00という形式の文字列を取得します)、SHA-256ハッシュをダブルカウントし 、結果をリトルエンディアン形式で表示します。
以前の出力インデックス -ハッシュ自体は以前の出力hashで指定されているトランザクション自体ではなく、その出力の1つを指します。 このパラメーターでは、関心のある特定の出力を示します;番号付けはゼロから始まります。 ちなみに、本文ではしばしば「トランザクションへのリンク」について話しますが、これは言語の表現力のためだけです。
ブロックロック時間 -このパラメーターは実際にはほとんど使用されません。 0に等しくなく、5億未満の場合、これは、このトランザクションを入力として使用できるブロック番号です。 平均して10分ごとにブロックが表示されるため、トランザクションが「開く」時間を見積もることは難しくありません。
ロック時間が 5億を超える場合、UNIXタイムスタンプを意味し、そこからトランザクションが利用可能になります。 私たちの場合、費用は0です。つまり、トランザクションはすぐに利用可能です。
シーケンス -この機能は使用されなくなりました 。 こちらで読むことができます 。
名前にscriptという単語が含まれるパラメーターは、はるかに複雑です。以下で説明します。
スクリプト
おそらく、暗号アルゴリズム+秘密/公開キーペアに基づいたビットコインネットワークのメカニズムがあることを既に聞いたことがあるでしょう。これにより、秘密キーの所有者のみがこのキーから取得したアドレスに関連付けられたコインを使用できるシステムを作成できます。 次に、これが「内部」でどのように実装されるかを示します。
まず、ビットコインにはスクリプトと呼ばれる独自のプログラミング言語があります。 Bitcoin wikiがそれについて書いていることは次のとおりです。
ビットコインは、トランザクションにスクリプトシステムを使用します。 Forthのように、スクリプトはシンプルでスタックベースで、左から右に処理されます。 意図的にループなしのチューリング完全ではありません。
要するに、言語はコルクのように単純で、スタックベースでチューリングが不完全です。 典型的なプログラムの例を次に示します。
1 OP_DUP OP_DUP 5 OP_HASH160
各命令はオペコードと呼ばれます- それらの約80があるので、言語は本当に非常に原始的です。 以下の図は、プログラム2 3 OP_ADD 5 OP_EQUAL
の実行を示しています。
トランザクションのロックとロック解除
少し後で言語に戻りましょうが、最初にここでそれが必要な理由を理解しましょう。
これを行うには、トランザクションの構造と2つのパラメーターscriptSigとscriptPubKeyを 思い出してください 。 他のパラメーターとは異なり、これら2つの目的はまったく明らかではありません。これはビットコインで最も難しいことです。
私は、ビットコインのスクリプトとは何か、そしてそれらを直感的なレベルで理解する方法を説明するための多くの試み(通常は失敗)を見てきました。 それにもかかわらず、私はチャンスを取り、別の類推を試みます。 これを行うには 、次のような遺言状を考えてみましょう。
18歳になった後にのみ、アリスに1,000,000ドルが支払われる
この場合、遺言のテキストは、お金を使用できる条件であり(読み取り、 入力として$ 1,000,000の取引を使用できます )、19歳のパスポートのコピーは条件が満たされていることの証拠であり、お金を取得する時間です。
出力を費やすことができる条件を設定し、条件が満たされ、SCRIPT、秘密/公開キー、およびその他の困難が必要であることを確認できるようにするためです。
ビットコインの場合、遺言はロックスクリプトであり、 pk_scriptフィールド内のトランザクションで示されます。 また、一般的には暗号化とは何の関係もないかもしれませんが、ほとんどの場合、公開鍵またはアドレスを含むプログラムであるという事実から、 scriptPubKeyとも呼ばれます。
ロックスクリプトからの条件が満たされる一種の「証拠」はロック 解除スクリプトと呼ばれ、署名スクリプトフィールドに書き込まれ、多くの場合scriptSigと呼ばれます。理由を推測してください。
スクリプト検証メカニズム自体は非常に単純です-これを行うには、 ロック解除スクリプト + ロックスクリプトを接続し、結果としてプログラム全体を実行する必要があります。 実行後、 TRUE
がスタックの一番上に残っている場合、トランザクションは有効であり、それ以外の場合は無効です。
乗算ベースのスクリプト
ほとんどの場合、あなたは何も理解していなかったので、最終的にすべてを理解するために、最大限にシンプルなスクリプトを書きましょう。 考えは、 370
ような数でお金をブロックすることです。 ロックスクリプトはOP_MUL 370 OP_EQUAL
ようになります。トランザクションのロックを解除するには、製品に370を示す2つの数字を指定する必要があります。
スクリプトの実験では、ビットコインスクリプトの起動とデバッグにオンラインプラットフォームを使用します 。 ロック解除スクリプトで、たとえば10 37
と記述します。 私たちはチェックします:
公開鍵ハッシュに支払う(P2PKH)
P2PKHはおそらく100のうち99のトランザクションで使用されるため、その仕組みを理解する必要があります。 一般的なビューは次のとおりです。
このスクリプトは、ビットコインの出現以来知られており、サトシ自身によって発明された可能性があります。 私が上で書いたタスクを実行するのは彼です。 秘密鍵の所有者だけがこの鍵から取得したアドレスに関連付けられたコインを使用できるようにするためです。
指では、次のようになります。友人Bが秘密鍵Pを所有するようにします。 彼は公開鍵K 、アドレスAを受け取り、そのアドレスをあなたに報告します。 次に、アドレスA 1 BTCに送信し、 ロックスクリプトフィールドに次のように書き込みます。
アドレスAの秘密キーを所有している人のみがこのトランザクションを使用できます。 証拠として、最初に公開鍵K 、次に秘密鍵Pを使用したトランザクションの署名をロック解除スクリプトに記述します。
Bがトランザクションを入力として使用することを決定すると、BTCは、たとえば0.5 BTCまでに自分のトランザクションを作成し、 ロック解除スクリプトフィールドに、プライベートキーP- <sig>
とパブリックキーK自体 - <PubK>
を使用してトランザクションの署名を挿入します。
- トランザクション署名がスタックにプッシュされます
- 公開鍵はスタックにプッシュされます
-
OP_DUP
はスタックの一番上の要素をOP_DUP
複製します。スタックの一番上には2つの公開キーがあります。 -
OP_HASH160
は、スタックの最上位要素をハッシュRIPEMD160(SHA256(x))
置き換えます - 同じ公開鍵ハッシュがスタックに追加されますが、すでにトランザクションの送信者によって計算されています。 Bitcoinを一言で注意深く読むと
RIPEMD160(SHA256(public_key))
、RIPEMD160(SHA256(public_key))
とアドレスが基本的に同じものであることは明らかです。 -
OP_EQUALVERIFY
はスタックの上位2つの要素を削除し、それらが等しくない場合、プログラムの実行はエラーで中断されます -
OP_CHECKSIG
は、トランザクションに対して署名を検証します。 すべてが正しい場合、署名を削除し、公開鍵を削除してTRUE
を追加します
P2Pストレージ
ビットコイン、および一般的なブロックチェーン技術の最も興味深い特性の1つは、そこに到達するすべてのものの不変性と仮想的な「永遠性」です。 時間が経つにつれて、自分の目的でこれを使用したい人がいたことは驚くことではありません。 そして、彼らに最初に起こったのは、サードパーティのデータをブロックチェーンに保存し、P2Pドロップボックスを取得しようとすることでした。
あなたはすでにこれがどのように行われるか理解していると思います。 「 Make America great again
」の行Make America great again
して、 ロックスクリプトで記述します 。 これは依然として完全に正しいスクリプトです。別のことは、彼が資金をロック解除するためのロック解除スクリプトを思い付かないことです。 しかし、このようなスクリプトを使用して出口に送信すると、比較的言えば0.0000001 BTCであり、原則としてそれは残念ではありません。 唯一の制限は、トランザクションのサイズです。 実際にはすべてが少し複雑ですが、100 KBを超えることはできないことを考慮してください 。 ここで読むことができます 。
誰もがこの状況を好むわけではないことは明らかです。 ビットコインにはスケーラビリティに関する大きな問題が既にあります。また、ここではすでにかなり大きいブロックチェーンも、あらゆる種類の残されたデータで詰まり始めます。 さらに、このようなトランザクションは使用できないことを覚えています。つまり、常にUTXOプールに残ることになります 。
妥協点に到達するために、 OP_RETURN
が追加されました。これにより、ブロックチェーンに最大40バイトのデータを「合法的に」保存できます。
OP_RETURNは、トランザクション出力を無効としてマークするために使用されるスクリプトオペコードです。 OP_RETURNの後のデータはビットコインの支払いとは無関係であるため、OP_RETURNの後の出力に任意のデータを追加できます- ビットコインwiki
以下は、彼が参加した最も簡単なロックスクリプトです: OP_RETURN <40kb data>
。 注目に値するのは、このようなスクリプトを使用したexitは、 証明できないほど消費可能になります。 このため、彼はUTXOプールにさえ入らないため、貴重なスペースを節約できます。 OP_RETURN <data>
代わりにOP_RETURN <data>
を使用する他の理由は、 ここにあります 。
ネタバレ-もちろんあなたが確信した利他主義者でない限り、彼らはそこにいません。