Bitcoin Forum
May 06, 2024, 12:54:43 PM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Transaction malleability на примере  (Read 1149 times)
Erzhan_ast (OP)
Newbie
*
Offline Offline

Activity: 5
Merit: 0


View Profile
April 07, 2014, 01:42:06 PM
 #1

Всем доброго времени суток!

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

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

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

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

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

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

Posts: 1715000083

View Profile Personal Message (Offline)

Ignore
1715000083
Reply with quote  #2

1715000083
Report to moderator
If you see garbage posts (off-topic, trolling, spam, no point, etc.), use the "report to moderator" links. All reports are investigated, though you will rarely be contacted about your reports.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1715000083
Hero Member
*
Offline Offline

Posts: 1715000083

View Profile Personal Message (Offline)

Ignore
1715000083
Reply with quote  #2

1715000083
Report to moderator
1715000083
Hero Member
*
Offline Offline

Posts: 1715000083

View Profile Personal Message (Offline)

Ignore
1715000083
Reply with quote  #2

1715000083
Report to moderator
CyberMOS
Hero Member
*****
Offline Offline

Activity: 504
Merit: 500



View Profile
April 07, 2014, 03:11:20 PM
 #2

Меняй байт OP_0 на OP_PUSHDATA2
yurm
Full Member
***
Offline Offline

Activity: 216
Merit: 100


View Profile
April 07, 2014, 09:18:54 PM
 #3

Небольшой практический нюанс: bitcoind не отправит вторую транзакцию в сеть, ибо выходы он будет считать уже потраченными. Эксперимент нужно проводить так: готовим две malleable транзакции с помощью createrawtransaction/signrawtransaction, одну отправляем через https://blockchain.info/pushtx, одновременно вторую из кошелька посредством sendrawtransaction. Чем одновременнее, тем лучше.

BTC donation:1DPUVJWeN2CNgJvRx5MtbsYWnFsKHxXWrc
Erzhan_ast (OP)
Newbie
*
Offline Offline

Activity: 5
Merit: 0


View Profile
April 08, 2014, 08:51:45 AM
 #4

Меняй байт 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"
]
}
}
]
}
Erzhan_ast (OP)
Newbie
*
Offline Offline

Activity: 5
Merit: 0


View Profile
April 08, 2014, 09:01:40 AM
 #5

готовим две 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. Прошу прощения если вопросы глупые, понимаю что "гугл в помощь" и т.д, но время поджимает, поэтому и спрашиваю у тех кто в этом разбирается
Erzhan_ast (OP)
Newbie
*
Offline Offline

Activity: 5
Merit: 0


View Profile
April 08, 2014, 01:35:57 PM
 #6

ок, в этих двух приказах наконец то разобрался, если кому то из новичков будет интересно, то перед тем как подписывать транзакцию, надо разблокировать кошелек с помощью команды 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...
Erzhan_ast (OP)
Newbie
*
Offline Offline

Activity: 5
Merit: 0


View Profile
April 08, 2014, 04:33:33 PM
 #7

почитал я всякие разные форумы... и понял что менять надо что то здесь:
Code:
"scriptSig" : {
"asm" : "304502206efc8d7d7c481c77b1a4a63bb3177ab20d49a32c939c5e875baef7ac9370a8ac022100aa8dc1a5b405aff965e4f721eee98998f66f931ccb720fb555344c28fed951f901 022217e7b72aa617c34965c36b269c0141b78d17215e0aa82f06111fd6be59ea40",
"hex" : "48304502206efc8d7d7c481c77b1a4a63bb3177ab20d49a32c939c5e875baef7ac9370a8ac022100aa8dc1a5b405aff965e4f721eee98998f66f931ccb720fb555344c28fed951f90121022217e7b72aa617c34965c36b269c0141b78d17215e0aa82f06111fd6be59ea40"
}
Оно закодировано в DER формате, если я правильно понял. Как это раскодировать?
CyberMOS
Hero Member
*****
Offline Offline

Activity: 504
Merit: 500



View Profile
April 09, 2014, 06:02:36 PM
 #8

http://bitcoin.stackexchange.com/questions/22051/transaction-malleability-in-the-blockchain
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!