したがって、AがBにコインを送信する状況を想像してください。彼はトランザクションを作成して署名し、確認のためにネットワークにリリースします。 残念ながら、トランザクションは長時間にわたって確認されず、トランザクションのコミッションが少なすぎます(または、通常の状況ではコミッションは正常ですが、現時点では未確認のトランザクションのキューが大きすぎるため、マイナーはコミッションの高いトランザクションをマイニングすることを好みます)。 ユーザーAは何をすべきですか? オプション:a)確認を待つ(長時間待つことができる)b)トランザクションがキャンセルされるのを待つ(ほとんどのノードが最終的にトランザクションをmempoolから破棄することを決定する)と、解放されたコインは再び破棄できる(つまり、トランザクションを作成し、プールはそれらを二重に消費して拒否しない) )トランザクションを手数料の増加(RBF)に置き換えます
そのため、RBFは、既存のトランザクションをより高い手数料の新しいトランザクションに置き換えています。 置換とは、新しいトランザクションで古いトランザクションと同じ入力が使用されることを意味し、これは二重支出(読み取り、詐欺)とは見なされません。 その結果、1つのトランザクションのみがブロックチェーンに追加されます(高い確率で、手数料が高いトランザクションになります)。
RBFはBIP-0125で説明されています
どのトランザクションを置き換えることができますか? これはいい質問です。 トランザクションの置換は、システムの作成者である中本Sによって提供されましたが、ある時点でオフになりました。 その後、RBFにファイナライズされ、ビットコインコアコード0.12以降に含まれました。 トランザクションデータを置き換えるために、特別なintフィールドnSequenceが提供されます。これは、どのトランザクションがどのトランザクションよりも古いかを示します。 トランザクションを潜在的に置換可能にするには、nSequenceを小さくする必要があります(0xffffffff-1)。
デフォルトでは、最新のnSequenceウォレットのほとんどはすぐに最大に設定され、設定でトランザクションを置き換える機能を有効にする必要があります。 Electrumウォレットでは、次のようになります。

デコードされたトランザクションの例:
... "inputs": [ { "addresses": [ "...." ], "output_index": 0, "output_value": 1010000, "prev_hash": "...", "script": "...", "script_type": "pay-to-pubkey-hash", "sequence": 0 }, ...
トランザクションエントリごとにシーケンスが指定されます。
同じElectrumウォレットで、RBFオプションを有効にすると、GUIで取引手数料を直接引き上げることが可能になりますが、RBF取引を手作業で収集します。 なんで? まず、それを把握するため、そして次に柔軟性を高めるために、たとえばこの場合、RBFトランザクションで、転送のために完全に異なるターゲットアドレスを指定することができ、攻撃者は定期的に使用を試みます。
次のように見えます。AはBに支払いたいと考えています。AはBのコインを転送するためのトランザクションを作成、署名、送信しますが、故意に減額またはゼロ手数料を投入します。 Bが十分な注意を払っていない場合、未確認のトランザクションをカウントします(たとえば、商品Aを渡します)。 その後、Aはトランザクションを置き換え、トランザクションの出力をCにリダイレクトします。CはAによって制御されます。
Bはこれをどのように回避できますか? ただし、Bが未確認のトランザクションを(速度のために)カウントすることを好む場合、プラスチックトランザクション(nSequenceでトランザクションを置き換えることができる)をカウントしません。 そして一般的に、そのような取引を疑うこと。 かつてプラスチック取引を数えた場合、不正行為の事実を再確認し、支払い者が不正である場合は制裁を適用するのがいいでしょう。 当然のことながら、少なくとも2つの確認を待つことが理想的です。
例。
すばらしいオープンソースツールgithub.com/OutCast3k/coinbinを使用します。これを使用すると、必要な入力と出力を使用してトランザクションを簡単に手動で作成できます。 サーバーと通信することなく、ブラウザーで完全に機能します。 coinb.inで利用可能なライブバージョン
新規→トランザクションでトランザクションを作成します。 WIF形式の秘密キーを取得し、このキーに使用可能な(未使用の)出力を読み込みます。 [出力]タブで、宛先アドレスを指定し、金額を指定します。 [詳細オプション]で、[これをRBFトランザクションにする]チェックボックスをオンにすることを忘れないでください。この場合、トランザクションnSequenceは最大値より小さくなります。 Submitをクリックします。

トランザクションが作成されました。 取引手数料に注意してください-これは、すべてのMINUS入力からの合計で利用可能なコインの数と、すべての出力の合計(この場合は1出力)の差です。 違いは、鉱夫が自分で取る手数料です。 この例では、特別にゼロです。
[署名]をクリックし、受信した16進トランザクションをコピーしてすべて同じ秘密キーを貼り付け、トランザクションに署名します。

トランザクションをネットワークにブロードキャストします(任意のエンドポイントを使用できます)。

したがって、トランザクションは次のようになります。

次に、RBFを使用しましょう。 新しいトランザクションを作成し、同じWIFから入力を取得します。 しかし、出力は完全に異なります! 出力1CWHWkTWaq1K5hevimJia3cyinQsrgXUvgの1つを示します-作成者coinb.inの寄付アドレス
取引手数料が迅速な確認に十分であるように指定する金額。

[入力]タブに注意してください -ソースアドレスが再利用可能で、その上に多くのトランザクションがある場合は、置き換える必要のあるトランザクションの一部である入力のみを手動で入力する必要があります(不要なものは削除し、必要なもののみを残します)。 何百もの入力がある可能性があり、場合によっては非常に骨の折れる作業になる可能性があります。
私たちは署名します:

放送します:

これが、blockchain.infoでの表示方法です。 新しいトランザクションは、以前のバージョンよりも前のブロックに含まれる可能性があります。

待っています。 確認があります:

トランザクションをRBFに置き換えただけで、コインは当初必要だった間違ったアドレスに送信されました。
再び安全
必ずしもnSequence = MAXは、トランザクションが最終であり、置き換えられないことを保証するわけではありません。 実際、「これをRBFトランザクションにする」チェックボックスは設定できませんでしたが、
- トランザクションを置き換えるとき、すべてのノードがmempool-conflictを参照して、新しいバージョンのリレーに同意するわけではありません
- 一部のノードはトランザクションを受け入れ、それでもネットワークに中継します
- blockchain.infoのような情報リソースは、DOUBLE SPENDを直接書き込みます
- すべてのプールがこのトランザクションをマイニングするわけではなく、当然のことながらダブル支出と見なされます。 プールによってはマイニングするものもありますが、時間がかかる場合があります(ネットワーク全体でマイニングする場合と比較して)
- 新しいトランザクションがまだブロックに含まれている場合、これは完全に有効であり、ネットワークのルールに矛盾しません。 潜在的な詐欺師の主張はどこでも受け入れられません。
T.O. 少なくとも2ブロックで確認のないトランザクションは信頼できないという結論に達します。 1mではなく2xである理由 簡単な答えは、孤立ブロックです。
参考資料と資料 :
- github.com/bitcoin/bips/blob/master/bip-0125.mediawiki-BIP-0125
- github.com/OutCast3k/coinbin-coinb.inソース
- en.bitcoin.it/wiki/Transaction_broadcasting-トランザクションを中継できるエンドポイントのリスト。 二重支出トランザクションを受け入れる場合があります。
ボーナス!
歴史1。
どういうわけか、私のBitcoin支払いゲートウェイを使用しているプロジェクトの1つがハッキングされ、2 BTCが出力されました。 そのバージョンのゲートウェイでは、0.0001 BTCのコミッションがハードコーディングされていましたが、当時は非常に少額でした。 すべてを理解し、トランザクションを払い戻しに置き換える十分な時間があり、手数料を0.1 BTCに引き上げました。 攻撃者はおそらく動揺しています。 道徳-RBFを使用してください!
歴史2。
bitmedia.ioで 、 ビットコインでアカウントを補充しました。 アカウントは、着信トランザクションをユーザーの特別なトップアップアドレスにカウントし、トランザクションの金額をユーザーの合計残高に追加することにより、そこに補充されます。 確認が6件のトランザクションのみがカウントされます。
できるだけ早く残高を補充したかったため、最初のトランザクションがハングしたときに、トランザクションをRBFで数回置き換えました。 取引が確認されたとき-私が行ったRBF交換の何倍も残高が追加されました。 私はすぐにバグを修正するためにサポートに書きました。 感謝の気持ちで、余分な0.3 BTCがバグバウンティとして私に提示されました。 道徳-RBFを使用してシステムの動作を確認してください!