Биткойн testnet3: невозможно отправить/опубликовать необработанную транзакцию: как проверить действительность транзакции?

Я создал необработанную транзакцию и теперь пытаюсь передать шестнадцатеричный формат в testnet3. Я использовал следующие два способа, и оба дают мне две разные ошибки, первую:

curl -d '{"hex":"TX_HASH"}' http://tbtc.blockr.io/api/v1/tx/push

Я получаю эту ошибку:

{"status":"fail","data":"Could not push your transaction!","code":500,"message":"Did you sign your transaction?"}

и второй по этой ссылке:

https://test.webbtc.com/relay_tx

дает мне эту ошибку:

Testnet3 - Error - Request took too long.

Не уверен, что здесь действительно проблема с подписью. Я использовал decode api из blockr.io, чтобы проверить свое сообщение — оно выглядит правильно и имеет длину 226 байт. Я поиграл с платой, задаваясь вопросом, была ли это проблема, но я думаю, что исключил и это.

Я также проверил правильность подписи в коде (вдохновленный руководством Дэвида Де Росы ). Любые советы о том, как я могу проверить действительность моей транзакции?

Спасибо.

Редактировать: теперь я получаю очень описательное сообщение об ошибке от blockr:

{"status":"error","data":"NULL","message":"It's looking like you may have taken a wrong turn. Don't worry... it happens to the best of us.","code":404}

Жаль, что эти ребята не использовали свое чувство юмора в сообщениях об ошибках :(

использовал API-интерфейс blockcypher для отправки необработанной транзакции. Это сообщение об ошибке, которое я получаю:

Error sending transaction: Error running script for input 0 referencing 87ce205d61e4bf63c0bcc42db1a58c36a2cac0048df32e470f3dc1bd39741367 at 0: Script was NOT verified successfully..

После подписания транзакции я проверил проверку подписи, ECDSA_verify(0,digest, sizeof(digest), sig, sig_len, key)и этот вызов функции возвращается 1. Поэтому я предположил, что моя подпись верна. Я ошибаюсь, предполагая это? Я пропустил что-то большое здесь?

Что вы передаете как дайджест?
Можете ли вы предоставить сериализованный tx, чтобы проверить правильность?

Ответы (1)

Нашел ошибку!

Я использую библиотеку OpenSSL и подписываюсь с помощью функции:ECDSA_Sign

Параметр, unsigned int *siglenпередаваемый этой функции, должен быть заполнен длиной подписи. Я использовал подпись (параметр sig) и длину из параметра siglen для сериализации данных. Оказывается, хотя генерируемая подпись всегда имела размер 72 байта, параметр siglen, по-видимому, заполнялся случайным образом 70, 71 или 72. И, следовательно, количество байтов подписи, которое копировалось в мой txn, было неверным. Интересно, что если я позвоню ECDSA_size(key)после вызова ECDSA_Sign(), я верну правильное 72значение.

АААА! Кто-нибудь сталкивался с этой проблемой раньше ECDSA_Sign? Я пока ничего не нашел в гугле.

Но успешно отправил необработанную подписанную транзакцию с помощью веб-инструмента / API blockcypher.

Можно подробнее, как вы решили проблему?