Я создал необработанную транзакцию и теперь пытаюсь передать шестнадцатеричный формат в 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
. Поэтому я предположил, что моя подпись верна. Я ошибаюсь, предполагая это? Я пропустил что-то большое здесь?
Нашел ошибку!
Я использую библиотеку OpenSSL и подписываюсь с помощью функции:ECDSA_Sign
Параметр, unsigned int *siglen
передаваемый этой функции, должен быть заполнен длиной подписи. Я использовал подпись (параметр sig) и длину из параметра siglen для сериализации данных. Оказывается, хотя генерируемая подпись всегда имела размер 72 байта, параметр siglen, по-видимому, заполнялся случайным образом 70, 71 или 72. И, следовательно, количество байтов подписи, которое копировалось в мой txn, было неверным. Интересно, что если я позвоню ECDSA_size(key)
после вызова ECDSA_Sign()
, я верну правильное 72
значение.
АААА! Кто-нибудь сталкивался с этой проблемой раньше ECDSA_Sign
? Я пока ничего не нашел в гугле.
Но успешно отправил необработанную подписанную транзакцию с помощью веб-инструмента / API blockcypher.
Питер Уилле
ср-ги