Проверка подписи Биткойн

Я пытаюсь реализовать код операции OP_CHECKSIG Биткойн и проверить, действительна ли подпись или нет. У меня есть подпись, которую я получаю из данных транзакции и открытого ключа (шестнадцатеричное поле транзакции P2PKH должно содержать и то, и другое). Я пытаюсь выяснить, что такое подписанный дайджест сообщения. Насколько я знаю, это обязательные предметы...

1. Номер версии (4 байта)
2. Количество входов (1 байт)
3. Хэш транзакции выкупаемых входных данных
4. Индекс выкупаемых выходных данных (4 байта)
5. ScriptPubKey выкупаемых выходных данных с предшествующим длина сценария
6. Порядковый номер (4 байта)
7. Количество выходов, которые мы подписываем (1 байт)
8. Общее значение вывода (8 байтов)
9. ScriptSig для вывода с добавленной длиной
10.locktime поле (4 байта)
11. тип хэш-кода (4 байта)

Итак, если я дважды хэширую эти данные в байтовом формате, используя алгоритм SHA256, пройдет ли проверка моей подписи? Я пытаюсь реализовать это с помощью Java, и это мой код -

public static boolean verifyUsingSecp256k1(byte[] pub, byte[] dataForSigning,
    BigInteger[] rs) throws Exception {
ECDSASigner signer = new ECDSASigner();
X9ECParameters params = SECNamedCurves.getByName("secp256k1");
ECDomainParameters ecParams = new ECDomainParameters(params.getCurve(),
        params.getG(), params.getN(), params.getH());
ECPublicKeyParameters pubKeyParams = new ECPublicKeyParameters(ecParams
        .getCurve().decodePoint(pub), ecParams);
signer.init(false, pubKeyParams);

return signer.verifySignature(dataForSigning, rs[0].abs(), rs[1].abs());}

Однако, когда я пытаюсь проверить свою подпись, она возвращается как ложная. Я что-то пропустил здесь?

Сначала прочтите этот ответ . Для проверки нужно сделать те же первые 14 шагов.
@CodingEnthusiast Я больше хочу получить ответ о проверке транзакции, а не о ее подписании. С первыми 14 шагами я перепробовал все, но, похоже, не работает.
Не могли бы вы опубликовать массив байтов (шаг 13) перед хэшированием на шаге 14. Обычно легко пропустить порядок байтов, CompactIntразмер SignatureScriptпосле его замены на PubkeyScript,... Что касается проверки, вы должны проверить код, который вы используете, не уверен, что это за библиотека .
@CodingEnthusiast Here is my byte array - 0200000001ce8310077e52959fc1046478629a1d7e522ba8445ff780d0229367ee48ac8146000000001976a9141c156160c943f58b30c1ff2be1cc225485f903bd88acffffffff01808900610d0000001976a914505ec67e233a71908713c500487307c59a6c5c1f88ac0000000081000000 I am using the Sighash type as - ALLL|ANYONE_CAN_PAY hence 81 at the end. Я надеюсь, что это не проблема в том, как мы собираем данные сообщения.
Я не вижу никаких проблем с этими байтами, и ваш хеш (dataForSigning) должен быть двойным SHA256, что означаетc3b0386c0d990ab628ac505e8fb612f67d052c5f3cd0ac517854c2efc24ab3e7
@CodingEnthusiast Я использую библиотеку Bouncy Castle для процедуры проверки! Поэтому я должен передать двойные хешированные данные сообщения SHA-256 функции выше!

Ответы (1)

Все вышеперечисленные шаги верны, хотя. Единственная загвоздка здесь в том, что, кроме скриптов, все остальное записано в формате Little Endian (по каким-то причинам). Таким образом, за исключением шагов 5 и 9, все остальные данные хранятся в формате Little Endian. Мне потребовалось время, чтобы добраться до этого ответа! Просто небольшой совет, который следует учитывать при реализации!