Bitcoin Forum

Local => Новички => Topic started by: Erzhan_ast on April 07, 2014, 01:42:06 PM



Title: Transaction malleability на примере
Post by: Erzhan_ast on April 07, 2014, 01:42:06 PM
Всем доброго времени суток!

Пишу дипломную работу, как вы наверное догадались на тему Биткоин. Было много шумихи по поводу краха MtGox и я решил попробовать провести пример того, как гибкость транзакции работает(я не хочу обманывать биржи и т.д поэтому буду использовать созданные мной самим транзакции, которые посылают BTC с одного моего адреса на другой).
Теоретический шаги:
1) создаю TX1 с одним входом и одним выходом
2) пока она еще не подтверждена, нахожу ее в списке неподтвержденных транзакций, немного меняю подпись и отправляю уже измененную транзакцию обратно в сеть(TX2).

Т.е в сети будут две по сути одинаковые транзакции(одинаковая сумма посылается с одного адреса на другой), но в следствии измененной подписи в TX2 у них будет разный хэш(TX ID). Никакого double-spending'а или чего то подобного.

Практические шаги:
1) в Bitcoin QT открываю консоль, выписываю список неподтвержденных транзакции с помощью приказа getrawmempool
2) нахожу там нужную и выписываю ее: getrawtransaction "..."
3) получаю данные этой транзакции в hex форме, меняю какие то данные в подписи и отправляю обратно с помощью приказа sendrawtransaction "..."

Теперь вопрос: что именно и каким образов я могу изменить в результатах приказа getrawtransaction "..."? Знаю что можно перевести эти данные в нормальный вид с помощью приказа decoderawtransaction, чтобы посмотреть в JSON виде что там к чему.
Помогите пожалуйста студенту, буду очень благодарен!

Всем заранее спасибо,
Ержан:)

P.S не прошу сделать всю работу за меня, прошу лишь подсказать что и где можно поменять. Изучаю ECDSA подписи, постепенно вникаю, но времени осталось до 17 апреля, надо сдать готовую работу.


Title: Re: Transaction malleability на примере
Post by: CyberMOS on April 07, 2014, 03:11:20 PM
Меняй байт OP_0 на OP_PUSHDATA2


Title: Re: Transaction malleability на примере
Post by: yurm on April 07, 2014, 09:18:54 PM
Небольшой практический нюанс: bitcoind не отправит вторую транзакцию в сеть, ибо выходы он будет считать уже потраченными. Эксперимент нужно проводить так: готовим две malleable транзакции с помощью createrawtransaction/signrawtransaction, одну отправляем через https://blockchain.info/pushtx (https://blockchain.info/pushtx), одновременно вторую из кошелька посредством sendrawtransaction. Чем одновременнее, тем лучше.


Title: Re: Transaction malleability на примере
Post by: Erzhan_ast on April 08, 2014, 08:51:45 AM
Меняй байт OP_0 на OP_PUSHDATA2

Можно на примере этой транзакции показать где именно найти этот байт OP_0?
"txid" : "890b15aeeac3db018173aecc95087cca8c7ce3c997387e332c5a9bd65b9aa8d2"

Приказом getrawtransaction 890b15aeeac3db018173aecc95087cca8c7ce3c997387e332c5a9bd65b9aa8d2 показывает следующее:
Code:
{
"txid" : "890b15aeeac3db018173aecc95087cca8c7ce3c997387e332c5a9bd65b9aa8d2",
"version" : 1,
"locktime" : 0,
"vin" : [
{
"txid" : "31600be5f8f783b5926466c263c3fcfd3fe9c41599169113500784390c602805",
"vout" : 0,
"scriptSig" : {
"asm" : "304502206efc8d7d7c481c77b1a4a63bb3177ab20d49a32c939c5e875baef7ac9370a8ac022100aa8dc1a5b405aff965e4f721eee98998f66f931ccb720fb555344c28fed951f901 022217e7b72aa617c34965c36b269c0141b78d17215e0aa82f06111fd6be59ea40",
"hex" : "48304502206efc8d7d7c481c77b1a4a63bb3177ab20d49a32c939c5e875baef7ac9370a8ac022100aa8dc1a5b405aff965e4f721eee98998f66f931ccb720fb555344c28fed951f90121022217e7b72aa617c34965c36b269c0141b78d17215e0aa82f06111fd6be59ea40"
},
"sequence" : 4294967295
}
],
"vout" : [
{
"value" : 0.03940000,
"n" : 0,
"scriptPubKey" : {
"asm" : "OP_DUP OP_HASH160 761d75822ab4c43ca15bffbcf206afc6a84e5e63 OP_EQUALVERIFY OP_CHECKSIG",
"hex" : "76a914761d75822ab4c43ca15bffbcf206afc6a84e5e6388ac",
"reqSigs" : 1,
"type" : "pubkeyhash",
"addresses" : [
"1BmY2V6YBicuHUYmNDL3K7mbMvk2yYkLEw"
]
}
},
{
"value" : 0.00050000,
"n" : 1,
"scriptPubKey" : {
"asm" : "OP_DUP OP_HASH160 a48e2c158f968db09f3c43e1fe317a9903184758 OP_EQUALVERIFY OP_CHECKSIG",
"hex" : "76a914a48e2c158f968db09f3c43e1fe317a990318475888ac",
"reqSigs" : 1,
"type" : "pubkeyhash",
"addresses" : [
"1G168kyFVmktKVzVGu9yrG4Ac1kje1My2k"
]
}
}
]
}


Title: Re: Transaction malleability на примере
Post by: Erzhan_ast on April 08, 2014, 09:01:40 AM
готовим две malleable транзакции с помощью createrawtransaction/signrawtransaction
Как я говорил, в этих всех приказах пока что разбираюсь слабо...

createrawtransaction [{"txid":txid,"vout":n},...] {address:amount,...}
получается здесь я должен буду все данные забить вручную, так?

signrawtransaction <hex string> [{"txid":txid,"vout":n,"scriptPubKey":hex},...] [<privatekey1>,...] [sighash="ALL"]
сюда напишу результат приказа createrawtransaction, так?

P.S. Прошу прощения если вопросы глупые, понимаю что "гугл в помощь" и т.д, но время поджимает, поэтому и спрашиваю у тех кто в этом разбирается


Title: Re: Transaction malleability на примере
Post by: Erzhan_ast on April 08, 2014, 01:35:57 PM
ок, в этих двух приказах наконец то разобрался, если кому то из новичков будет интересно, то перед тем как подписывать транзакцию, надо разблокировать кошелек с помощью команды walletpassphrase <pass> <time> где time - время в секундах.

теперь самое важное: как мне подготовить 2 почти одинаковые транзакции с разным ID? Ответили насчет того что надо поменять байт OP_0 на OP_PUSHDATA2. Ок, только где его найти? Судя по всему этот байт должен находится где то в подписи.
Code:
{
"txid" : "890b15aeeac3db018173aecc95087cca8c7ce3c997387e332c5a9bd65b9aa8d2",
"version" : 1,
"locktime" : 0,
"vin" : [
{
"txid" : "31600be5f8f783b5926466c263c3fcfd3fe9c41599169113500784390c602805",
"vout" : 0,
"scriptSig" : {
"asm" : "304502206efc8d7d7c481c77b1a4a63bb3177ab20d49a32c939c5e875baef7ac9370a8ac022100aa8dc1a5b405aff965e4f721eee98998f66f931ccb720fb555344c28fed951f901 022217e7b72aa617c34965c36b269c0141b78d17215e0aa82f06111fd6be59ea40",
"hex" : "48304502206efc8d7d7c481c77b1a4a63bb3177ab20d49a32c939c5e875baef7ac9370a8ac022100aa8dc1a5b405aff965e4f721eee98998f66f931ccb720fb555344c28fed951f90121022217e7b72aa617c34965c36b269c0141b78d17215e0aa82f06111fd6be59ea40"
},
"sequence" : 4294967295
}
],
"vout" : [
{
"value" : 0.03940000,
"n" : 0,
"scriptPubKey" : {
"asm" : "OP_DUP OP_HASH160 761d75822ab4c43ca15bffbcf206afc6a84e5e63 OP_EQUALVERIFY OP_CHECKSIG",
"hex" : "76a914761d75822ab4c43ca15bffbcf206afc6a84e5e6388ac",
"reqSigs" : 1,
"type" : "pubkeyhash",
"addresses" : [
"1BmY2V6YBicuHUYmNDL3K7mbMvk2yYkLEw"
]
}
},
{
"value" : 0.00050000,
"n" : 1,
"scriptPubKey" : {
"asm" : "OP_DUP OP_HASH160 a48e2c158f968db09f3c43e1fe317a9903184758 OP_EQUALVERIFY OP_CHECKSIG",
"hex" : "76a914a48e2c158f968db09f3c43e1fe317a990318475888ac",
"reqSigs" : 1,
"type" : "pubkeyhash",
"addresses" : [
"1G168kyFVmktKVzVGu9yrG4Ac1kje1My2k"
]
}
}
]
}
Code:
"scriptPubKey" : {
"asm" : "OP_DUP OP_HASH160 761d75822ab4c43ca15bffbcf206afc6a84e5e63 OP_EQUALVERIFY OP_CHECKSIG",
Code:
"scriptPubKey" : {
"asm" : "OP_DUP OP_HASH160 a48e2c158f968db09f3c43e1fe317a9903184758 OP_EQUALVERIFY OP_CHECKSIG",
Ткните пожалуйста пальцем куда именно надо написать OP_PUSHDATA2...


Title: Re: Transaction malleability на примере
Post by: Erzhan_ast on April 08, 2014, 04:33:33 PM
почитал я всякие разные форумы... и понял что менять надо что то здесь:
Code:
"scriptSig" : {
"asm" : "304502206efc8d7d7c481c77b1a4a63bb3177ab20d49a32c939c5e875baef7ac9370a8ac022100aa8dc1a5b405aff965e4f721eee98998f66f931ccb720fb555344c28fed951f901 022217e7b72aa617c34965c36b269c0141b78d17215e0aa82f06111fd6be59ea40",
"hex" : "48304502206efc8d7d7c481c77b1a4a63bb3177ab20d49a32c939c5e875baef7ac9370a8ac022100aa8dc1a5b405aff965e4f721eee98998f66f931ccb720fb555344c28fed951f90121022217e7b72aa617c34965c36b269c0141b78d17215e0aa82f06111fd6be59ea40"
}
Оно закодировано в DER формате, если я правильно понял. Как это раскодировать?


Title: Re: Transaction malleability на примере
Post by: CyberMOS on April 09, 2014, 06:02:36 PM
http://bitcoin.stackexchange.com/questions/22051/transaction-malleability-in-the-blockchain