Author

Topic: Создание вручную транзакции с 2-мя входами (Read 1854 times)

legendary
Activity: 1260
Merit: 1019
Еще добрый совет дам:
Лучше экспериментировать на тестнете, а не с мелкими суммами в "главном биткойне".
Не потому что можно случайно проебать 3 рубля (никого такие суммы не парят), а просто чтобы не засирать блокчейн своими транзакциями и особенно  неизрасходованными выходами
Вы ж представьте себе - биткойн вечный! Ваши внуки успеют обзавестись правнуками, а эту вашу транзакцию, где вы себе пересылаете мелочь придется хранить всем фулл-нодам. Берегите экологию! Экономьте дисковое пространтво ваших потомков!
newbie
Activity: 14
Merit: 0
amaclin, огромное спаисбо, ДРУЖИЩЕ. благодаря твоим обьясненям про рыбу и хрен я все понял и заработало! код исправлен за 2 секунды и...Transaction submitted


Вот это что за хрень? Это не рыба, это стрихнин какой-то. Хрена к ней не хватает.
Перед тем как подписывать первый вход - в scriptSig2 должен быть пустой скрипт
А когда ты подписываешь второй вход - то в scriptSig1 будет пустой скрипт

legendary
Activity: 1260
Merit: 1019
Quote
рыба

version:01000000
input count:02
prev hash reversed:31eeaee20449874ae4c372c31d1c8e60de5cdb809ebfde71c88ac34f6d7ef96a
prev output index:01000000
script lenght:19
scriptSig:76a914636648b42b32ef8ee917e1ad36beed697499de0688ac
sequence:ffffffff
prev hash reversed2:6349f8056ae040af774a9d6c77d34fe81392c379cc0201f4883740a004f50939
prev output index2:00000000
script lenght2:19
scriptSig:76a914636648b42b32ef8ee917e1ad36beed697499de0688ac
sequence:ffffffff
output count:02
Formatted outputs:e8030000000000001976a91410387beb5f9da1771390106bdf11a0f5f880ffdd88ac28230000000 000001976a914636648b42b32ef8ee917e1ad36beed697499de0688ac
block lock time:00000000

Вот это что за хрень? Это не рыба, это стрихнин какой-то. Хрена к ней не хватает.
Перед тем как подписывать первый вход - в scriptSig2 должен быть пустой скрипт
А когда ты подписываешь второй вход - то в scriptSig1 будет пустой скрипт

и не вижу где в конце этого массива данных стоит SIGHASH_ALL = 0x01

рыба для каждого входа делается своя. вот тебе копипаста из моего кода - вдруг поможет?
Code:
const MyKey32 Transaction::rawData ( const UxToList& unspent, const int i, const quint64 fee )
{ // http://bitcoin.stackexchange.com/questions/3374/how-to-redeem-a-basic-tx
  MyByteArray data; data.reserve ( 1024 );
  data.putInt32 ( TX_VERSION );
  data.putVarInt ( unspent.size ( ) );
  for ( int j ( unspent.size ( ) ); --j >= 0; )  // люблю перебирать с конца
  {
    const UxTo& s ( unspent.at ( j ) );
    data.append ( s.getTxHash ( ) );
    data.putInt32 ( s.getIndex ( ) );
    data.putPrefixed ( ( i == j ) ? s.getScript ( ) : QByteArray ( ) );  // в рыбе один скриптсиг фиктивный, а остальные пустышки
    data.putInt32 ( TX_SEQUENCE );
  }
  appendOutputsLock ( data, unspent.sum ( ) - fee );  // формирование всех выходов в отдельном методе
  data.putInt32 ( SIGHASH_ALL );                             // вот это где в твоем коде?
  return MyKey32 ( data.constData ( ), data.size ( ) ); // sha256-дайджест. его надо подписать
}
newbie
Activity: 14
Merit: 0
дамп: команда print в теле программы

рыба

version:01000000
input count:02
prev hash reversed:31eeaee20449874ae4c372c31d1c8e60de5cdb809ebfde71c88ac34f6d7ef96a
prev output index:01000000
script lenght:19
scriptSig:76a914636648b42b32ef8ee917e1ad36beed697499de0688ac
sequence:ffffffff
prev hash reversed2:6349f8056ae040af774a9d6c77d34fe81392c379cc0201f4883740a004f50939
prev output index2:00000000
script lenght2:19
scriptSig:76a914636648b42b32ef8ee917e1ad36beed697499de0688ac
sequence:ffffffff
output count:02
Formatted outputs:e8030000000000001976a91410387beb5f9da1771390106bdf11a0f5f880ffdd88ac28230000000 000001976a914636648b42b32ef8ee917e1ad36beed697499de0688ac
block lock time:00000000

подписал приватным ключом первого входа и вставил в scriptSig первого входа

version:01000000
input count:02
prev hash reversed:31eeaee20449874ae4c372c31d1c8e60de5cdb809ebfde71c88ac34f6d7ef96a
prev output index:01000000
script lenght:8c
scriptSig:49304602210093c0dcf6144131b53acf9645859c683f2eeae0fc8be9d1fe26263a5314e6a45f022 100e86dee142a525ffbbfc6885f54240eb9546aa9ccb1b92a7cac4c03258ad69558014104976f98 2979a1b2085855ad21bfe44ae8e4be12863bd9937bebd1081ef17cf157f6e67395df77bd66dd3c7 52d42c48df5751bfbd1a893cab618122bcbe3e5bbc3
sequence:ffffffff
prev hash reversed2:6349f8056ae040af774a9d6c77d34fe81392c379cc0201f4883740a004f50939
prev output index2:00000000
script lenght2:19
scriptSig:76a914636648b42b32ef8ee917e1ad36beed697499de0688ac
sequence:ffffffff
output count:02
Formatted outputs:e8030000000000001976a91410387beb5f9da1771390106bdf11a0f5f880ffdd88ac28230000000 000001976a914636648b42b32ef8ee917e1ad36beed697499de0688ac
block lock time:00000000

подписал приватным ключом второго входа и вставил в scriptSig второго входа

version:01000000
input count:02
prev hash reversed:31eeaee20449874ae4c372c31d1c8e60de5cdb809ebfde71c88ac34f6d7ef96a
prev output index:01000000
script lenght:8c
scriptSig:49304602210093c0dcf6144131b53acf9645859c683f2eeae0fc8be9d1fe26263a5314e6a45f022 100e86dee142a525ffbbfc6885f54240eb9546aa9ccb1b92a7cac4c03258ad69558014104976f98 2979a1b2085855ad21bfe44ae8e4be12863bd9937bebd1081ef17cf157f6e67395df77bd66dd3c7 52d42c48df5751bfbd1a893cab618122bcbe3e5bbc3
sequence:ffffffff
prev hash reversed2:6349f8056ae040af774a9d6c77d34fe81392c379cc0201f4883740a004f50939
prev output index2:00000000
script lenght2:8c
scriptSig:493046022100dd0667c393bc9bdda6ca0a709d17e3ddb256998f75e1b5f1dd811530ce536cbc022 100beca193c8964fbdd00f2b44035f15c84dfcdc6d54a921a3e44a5234c76681a65014104976f98 2979a1b2085855ad21bfe44ae8e4be12863bd9937bebd1081ef17cf157f6e67395df77bd66dd3c7 52d42c48df5751bfbd1a893cab618122bcbe3e5bbc3
sequence:ffffffff
output count:02
Formatted outputs:e8030000000000001976a91410387beb5f9da1771390106bdf11a0f5f880ffdd88ac28230000000 000001976a914636648b42b32ef8ee917e1ad36beed697499de0688ac
block lock time:00000000


ALL:
010000000231eeaee20449874ae4c372c31d1c8e60de5cdb809ebfde71c88ac34f6d7ef96a01000 0008c49304602210093c0dcf6144131b53acf9645859c683f2eeae0fc8be9d1fe26263a5314e6a4 5f022100e86dee142a525ffbbfc6885f54240eb9546aa9ccb1b92a7cac4c03258ad695580141049 76f982979a1b2085855ad21bfe44ae8e4be12863bd9937bebd1081ef17cf157f6e67395df77bd66 dd3c752d42c48df5751bfbd1a893cab618122bcbe3e5bbc3ffffffff6349f8056ae040af774a9d6 c77d34fe81392c379cc0201f4883740a004f50939000000008c493046022100dd0667c393bc9bdd a6ca0a709d17e3ddb256998f75e1b5f1dd811530ce536cbc022100beca193c8964fbdd00f2b4403 5f15c84dfcdc6d54a921a3e44a5234c76681a65014104976f982979a1b2085855ad21bfe44ae8e4 be12863bd9937bebd1081ef17cf157f6e67395df77bd66dd3c752d42c48df5751bfbd1a893cab61 8122bcbe3e5bbc3ffffffff02e8030000000000001976a91410387beb5f9da1771390106bdf11a0 f5f880ffdd88ac28230000000000001976a914636648b42b32ef8ee917e1ad36beed697499de068 8ac00000000
legendary
Activity: 1260
Merit: 1019
Quote
транзакцию с одним входом я собираю правильно. в чем различие когда входов несколько?

В ДНК.
Вместо того чтоб задавать вопросы - сделал бы что я прошу.

Ты не полощи нам мозг, в твоем коде мало кто захочет искать ошибки, тут и так народу с гулькин хуй, а кодеров со знанием питона и желанием помочь ближнему и того меньше. Хочешь, могу дать код на C++/Qt но он у меня такой что "посмотреть можно", а "для запустить нужна еще тонна другого кода" - так что разбираться тебе с C++ будет как разбираться мне с питоном.

Не сцы. Я не прошу у тебя приватные ключи от адреса 1A4aRosKx8zg9gZ9F99LTPoh94w9nRKc1S на котором 0.00011 BTC
Я хочу чтобы ты поставил "брейкпойнт" и показал бы что у тебя получается на определенном этапе.
Так как этот этап происходит *до* подписывания - то приватные ключи еще не используются - можешь вообще на этом отладочном запуске поставить любой другой приватный ключ (что, кстати, я и собираюсь сделать). Да, в этом случае транзакция стопудово получится невалидной, но мы ошибку ищем в логике, а не в подписи.
newbie
Activity: 14
Merit: 0
подписываются входы, а не выходы, так будет вернее.
и порядок следования непринципиален - результат один и тот же - либо правильно, либо нет
транзакцию с одним входом я собираю правильно. в чем различие когда входов несколько?
legendary
Activity: 1260
Merit: 1019
подписываются входы, а не выходы, так будет вернее.
и порядок следования непринципиален - результат один и тот же - либо правильно, либо нет
newbie
Activity: 14
Merit: 0
Прочитал тему. Спасибо. Подскажите, пожалуйста, в какой последовательности подписываются выходы?
legendary
Activity: 1260
Merit: 1019
Ну значит что-то не так подписал. Одно из трех
- либо неправильно сделал данные и дайджест для подписи
- либо проблема в библиотеке-подписывалке
- либо с приватным ключом накосячил

Скорее первое.

В ваших питонах я не понимаю, так что сделай-ка вот что:
нужен хекс-дамп того, что ты подписываешь при формировании первой и второй подписи - разбираться в питоне неохота
ну и можно еще sha256 ( sha256 ( x )  ) от этих данных - то что на вход sign_digest подается
я просто сделаю то же самое и результат должен оказаться тем же самым.


Кстати, я на этом форуме тоже начинал с данного вопроса:
https://bitcointalksearch.org/topic/m.4892601
может поможет
тогда я тоже был "зеленым новичком"
newbie
Activity: 14
Merit: 0
Не получается создать транзакцию с 2-мя входами. Почему? Пишет - неверная подпись.
Подскажите, пожалуйста, программисты.

Jump to: