トランザクションの操作

概要

トランザクションはBitcoinプロトコルの基本要素です。
トランザクションにはBitocoinの所有権が含まれており、使用する際に必要な条件となります。

この記事では以下を取り上げます。

トランザクションとは何か?
・Transactionクラスが与えるもの
トランザクションの信頼性
トランザクションを使用する様々な方法

トランザクションとは何か?

トランザクションの本質はインプットとアウトプットです。
トランザクションには、現在のbitcoinネットワークでは使用されていないロックタイムとbitcoinjで示されるメタデータ(信頼度の測定)が含まれています。これらはすべてTransactionクラスを使用してアウトプットすことができます。

アウトプットは従来、scriptPubKeyと呼ばれており、公開鍵のハッシュ値と送金先アドレスのスクリプトが含まれたデータです。アウトプットは、トランザクションインプットによって得られたスクリプトの一部を特定のプログラムに割り当てます。プログラムを満たすことができるインプットを持っている場合、取引で価値の所有権を主張することができます。アウトプットのスクリプトは、インプットの署名と公開鍵に対してチェックを行います。

インプットはスクリプト(バイト配列のリスト)と、他のトランザクションのアウトプットの参照先を含むデータ構造です。アウトポイントはインデックスが特定のトランザクションのどのアウトプットであるかを識別するもので、Bitcoinではハッシュでトランザクションを識別するのに使います。インプットはアウトプットと合わせて使います。インプットは従来、scriptSigsと呼ばれており、スクリプトのオペコードを含まれています。インプットスクリプトは、署名や鍵などの定数をスタックにプッシュするのに使います。

インプットにはシーケンス番号も含まれます。シーケンス番号は現在Bitcoinネットワークでは使用されておらず、bitcoinjによって公開されていません。契約をサポートするためにあります。

トランザクションのインプットと、そのトランザクションで消費したアウトプットの量の差分を手数料と言います。明らかに、アウトプットの量がアウトプットで集められたものよりも大きい取引は無効とみなされますが、その逆は無効にはなりません。おつりでない値は、そのトランザクションを含むブロックをマイニングした人が正当に請求することができます。

インプットには値フィールドが含まれていないことに注意してください。インプットの値を調べるには、接続されているアウトプットの値をチェックする必要があります。これは、スタンドアロントランザクションの場合、インプットが接続されているすべてのトランザクションを持っていない限り、その手数料がわからないことを意味します。

トランザクションシリアライズされ、P2Pネットワークを介してブロードキャストすることができます。この場合、マイナーはブロードキャストされたトランザクションをブロックに含めたり、他のプロトコルを使用しているネットワークでアクセスします。

Transactionクラス

Transactionクラスを使用すると、トランザクションを逆シリアライズシリアライズ、ビルド、検査することができます。また、ブロックが含まれているか、トランザクションが逆転、二重払いされないことをどれだけ信頼できるかなど、トランザクションに関する興味深いメタデータを追跡するのに役立ちます。

インプットはTransactionInputクラスで、アウトプットはTransactionOutputクラスで処理されます。インプットは符号なしにすることができ、その場合はトランザクションがネットワークによって有効であると見なされませんが、中間状態はときどき処理するのに便利です。


一般的なタスク:

1.getInputs()、getOutputs()、addInput()、addOutput()を使用して入出力をアクセスします。addInput()には2つの形式があります。1つはTransactionInputを受け取ります。もう一方はTransactionOutputを受け取り、そのアウトプットに接続する署名のないインプットを作成します。

2.signInputs()を使用してトランザクションインプットを署名します。現在は最初のパラメータとして常にSigHash.ALLを渡す必要があります。将来、他の種類のSigHashフラグもサポートされるようになります。それらは契約のために使用されます。この方法では、インプットと出力で使用される鍵を含むウォレットも必要です。あなたが秘密鍵を持っていない場合、値を要求することはできません。

3.getAppearsInHashes()を使用し、何処にトランザクションを含むブロックがあるのか見つけることが出来ます。トランザクションにはブロックヘッダーのハッシュのみを格納するため、追加されたBlockStoreを使用してブロックデータを取得する必要があります。

4.getConfidenceを使用してチェーン内のトランザクションの状態について調べます。これは、トランザクションブロックチェーンに含まれた日時と場所に関するさまざまなデータを表すTransactionConfidenceオブジェクトを返します。

コンフィデンスレベル

取引にはコンフィデンス(信頼度)というものがあります。これは、トランザクションの逆転(二重払い)される確率を計算するために使用するデータです。これは常にBitcoinの高速決済システムではリスクがありますが、従来の決済システムに比べれば確率は非常に低くなります。

コンフィデンス(信頼度)はTransactionConfidenceオブジェクトでモデル化されます。Transaction.getConfidence()を呼び出すことで1つ取得できます。コンフィデンスデータはBitcoinのシリアライズにはありませんが、Javaやバッファーのシリアライズにはあります。

信頼オブジェクトは以下の4つの状態のうち、1つを持ちます。

・BUILDINGの場合、トランザクションは最良のチェーンに含まれており、信頼性は向上しています。

・PENDINGの場合、トランザクションは未確認の状態です。随時ブロードキャストされ、ネットワークによって有効であると判断された場合にブロックに取り込まれますPeerGroup.addWallet()を使用し、ブロックを含むウォレットがライブでPeerGroupに接続されている場合には保留中のトランザクションが通知されます。TransactionConfidence.numBroadcastPeers()を使用して、1つのピアに送信した後に通知するノードの数を測定することで、トランザクションの包含確率を推定できます。もしくは、信頼できるピアからトランザクションを見た場合、トランザクションが有効であるとみなし、いつかはマイニングされます。

・DEADの場合、他のトランザクションでそのUTXOを使用しているため、別のリオーグがない限りトランザクションを確認しません。そのようなトランザクションは、サービス業者であれば商品の出荷を停止できるように、警告する必要があります。

・UNKNOWNの場合、このトランザクションにおけるコンフィデンスの情報がありません。
例えば、トランザクションがデシリアライズされ、ブロードキャストされていない場合。ブロックチェーン上でまだ見えていないため、トランザクション情報がない場合にUNKNOWNが使用されます。 UNKNOWNはデフォルトの状態です。

TransactionConfidence.getConfidenceType()を介した利用可能なコンフィデンスタイプは、トランザクション状態の詳細な内容です。オブジェクト上のゲッターを使ってより正確なビューを得ることができます。たとえば、BUILDINGの状態では、getDepthInBlocks()はブロック単位でトランザクションがどれくらい深く埋まっているかを示す必要があります。チェーンに埋もれているほど、取引が二重払いになる可能性は低くなります。

ブロックの深さは理解しやすく、トランザクションが確認された時間(平均1ブロック= 10分)にほぼ相当します。しかし、これは、取引を逆転させるためにどれくらいの労力がかかるかを安定的に測定するものではありません。なぜなら、ブロックで行われる作業の量は、マイニングされてる度合いによって変化するからです。

ディフィカルティとコンフィデンスについて理解する

コンフィデンスについて興味がある最も一般的な理由は、送られる来るBitcoinの損失リスクを測定したいからです。例えば商品の発送やサービスの提供を遅らせる場合など。


MP3や電子ブックのようなあまり価値のないものについてはゼロ認証を使用し、二重払いの危険にさらされる可能性があるものについては1〜2ブロック(10〜20分)、通貨交換のように堅固な確実性が求められる場合は6ブロック(1時間)です。

実際に、二重払いによる詐欺にあうサービス業者の報告はまれです。

上記のルールは、実作業ではなく目安のブロック数を示しています。したがって、Bitcoinの価格下落するとマイニングの活動が減衰し、取引が有効になるまでの時間が長くなります。逆にBitcoinの価格が上昇すると、マイニング活動が増加し、取引が有効になるまでの時間が短くなります。このため、私たちはコンフィデンスを測る方法も提供しています。

トランザクションの使用方法

トランザクションを使用する最も一般的な方法は次のとおりです。

1.ブロックチェーンまたはネットワークブロードキャストからウォレットにダウンロードする

2.消費するトランザクションを作り、それをブロードキャストする

他にも多くの可能性があります。

ダイレクトに送る

直接お金を送ることができます。この取引は、自分のタイミングでブロードキャストしたり、さらに変更することができます。これら方法は現在はうまくサポートされていませんが、将来Bitcoinを使用する一般的な方法になる可能性があります。

契約の参加

コントラクトにより、Bitcoinネットワークによって仲介されるさまざまな低信頼取引が可能になります。特定のスクリプト、署名、および構造を使用してトランザクションを慎重に構築することにより、信頼性の低い紛争調停、任意の条件(例:先物契約)、保証契約、スマートプロパティなど多くの可能性に縛られたコインを保有することができます。

このトピックの詳細については、WorkingWithContractsの記事を参照してください。