У меня есть следующая беззнаковая сырая сделка взята из этот пример:
Код:
01000000
01
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2
01000000
19
76a914010966776006953d5567439e5e39f86a0d273bee88ac
FFFFFFFF
01
605af40500000000
19
76a914097072524438d003d23a2f23edb65aae1bb3e46988ac
00000000
01000000
01
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2
01000000
19
76a914010966776006953d5567439e5e39f86a0d273bee88ac
FFFFFFFF
01
605af40500000000
19
76a914097072524438d003d23a2f23edb65aae1bb3e46988ac
00000000
01000000
Я могу разобрать его в читаемую форму с JSON-RPC API:
Код:
локон --user USERNAME --data-бинарная «{"Я бы":"t0", "метод": "decoderawtransaction", "Титулы": [
"0100000001eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2010000001976a914010966776006953d5567439e5e39f86a0d273bee88acffffffff01605af405000000001976a914097072524438d003d23a2f23edb65aae1bb3e46988ac0000000001000000"]
"0100000001eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2010000001976a914010966776006953d5567439e5e39f86a0d273bee88acffffffff01605af405000000001976a914097072524438d003d23a2f23edb65aae1bb3e46988ac0000000001000000"]
Код:
{"результат": {"TXID":"7584a4e1f3b46ea7af8230b761711dd4f03494f26d5da86995aa80c5b54e6a59","версия": 1,"Locktime": 0,"Vin": [{"TXID":"f2b3eb2deb76566e7324307cd47c35eeb88413f971d88519859b1834307ecfec","Vout": 1,"scriptSig": {"как м":"OP_DUP OP_HASH160 010966776006953d5567439e5e39f86a0d273bee OP_EQUALVERIFY OP_CHECKSIG","наговор":"76a914010966776006953d5567439e5e39f86a0d273bee88ac"},"последовательность": 4294967295}],"Vout": [{"стоимость": 0.99900000,"N": 0,"scriptPubKey": {"как м":"OP_DUP OP_HASH160 097072524438d003d23a2f23edb65aae1bb3e469 OP_EQUALVERIFY OP_CHECKSIG","наговор":"76a914097072524438d003d23a2f23edb65aae1bb3e46988ac","reqSigs": 1,"тип":"pubkeyhash","адреса": ["1runeksijzfVxyrpiyCY2LCBvYsSiFsCm"]}}]},"ошибка":ноль,"Я бы":"t0"}
Но я не могу подписать его, даже когда я добавляю соответствующую предыдущую операцию и закрытый ключ (это не реальная сделка, хотя).
Код:
локон --user USERNAME --data-бинарная «{"Я бы":"t0", "метод": "signrawtransaction", "Титулы": [
"0100000001eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2010000001976a914010966776006953d5567439e5e39f86a0d273bee88acffffffff01605af405000000001976a914097072524438d003d23a2f23edb65aae1bb3e46988ac0000000001000000",
["f2b3eb2deb76566e7324307cd47c35eeb88413f971d88519859b1834307ecfec"],
["2g82vgrZTviKG5sN1g2VM7FHgHTm16ej4gmr8ECMzab6"]
]}»Http://127.0.0.1:8332/
"0100000001eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2010000001976a914010966776006953d5567439e5e39f86a0d273bee88acffffffff01605af405000000001976a914097072524438d003d23a2f23edb65aae1bb3e46988ac0000000001000000",
["f2b3eb2deb76566e7324307cd47c35eeb88413f971d88519859b1834307ecfec"],
["2g82vgrZTviKG5sN1g2VM7FHgHTm16ej4gmr8ECMzab6"]
]}»Http://127.0.0.1:8332/
Код:
{"результат":ноль,"ошибка": {"код": -22,"сообщение":"TX расшифровывает не удалось"},"Я бы":"t0"}
Я также думаю, что это странно, что я получаю ошибку декодирования TX здесь, и я подозреваю, acutally не правильное сообщение, см мой Github билет.
Это делает его трудно для меня, чтобы понять, что я делаю неправильно в моей попытке подписать сделку в рубин.
Код:
@keypair = OpenSSL :: PKey :: EC.new ("secp256k1")
@ Keypair.private_key = @ YourPrivateKey.hex
@ Keypair.public_key = :: OpenSSL :: PKey :: EC :: Point.from_hex (@ keypair.group, @YourPublicKey)
transaction_hash_bytes = [sha_second] .pack ("ЧАС*")
signature_bytes = @ keypair.dsa_sign_asn1 (transaction_hash_bytes)
подпись = signature_bytes.unpack ("ЧАС*").первый
@ Keypair.private_key = @ YourPrivateKey.hex
@ Keypair.public_key = :: OpenSSL :: PKey :: EC :: Point.from_hex (@ keypair.group, @YourPublicKey)
transaction_hash_bytes = [sha_second] .pack ("ЧАС*")
signature_bytes = @ keypair.dsa_sign_asn1 (transaction_hash_bytes)
подпись = signature_bytes.unpack ("ЧАС*").первый
Пачка("ЧАС*") И распаковать только предположение, но наиболее близок к тому, что я сделал с ССЗОМ. В результате шестигранной различной длины (70-72 байт).
Каждый раз, когда вы делаете подпись с secp256k1 это разные, так что я не могу использовать подпись, которая обеспечивается в данном примере в качестве опорной точки. Единственный способ я знаю, как проверить это, чтобы подписать реальные сделки и попытаться отправить его через страница сделки толчка Blockchain.info в.
Так что я попытался это с реальной сделкой самостоятельно, но потом я получаю "подпись недействительна" сообщение. Я предполагаю, что сообщение означает, что он говорит.
Если я пытаюсь sendrawtransaction через JSON-RPC Я просто {"результат":ноль,"ошибка": {"код": -22,"сообщение":"TX отвергнута"},"Я бы":"t0"}. Я в состоянии выполнить decoderawtransaction как на моей неподписанную и подписанную реальной сделку. Но когда я пытаюсь подписать его с помощью JSON-RPC, я получаю ту же ошибку, как я показал выше.
Подписи применяется к SHA-256 ^ 2 хэш без знака транзакции. Я в состоянии воспроизвести этот хэш в рубине с использованием входных параметров в качестве примера, в поэтому я предполагаю, что мой сценарий правильно до этого момента.
Я подозреваю, что я делаю что-то неправильно, связанное с кодированием, когда я подписываю хэш. Ша-256 методы в рубин ожидать в Bignum ("10".hex => 16) в качестве входных данных и производить строку в качестве вывода с считываемых значений шестнадцатеричных человека, которые можно затем преобразовать в Bignum снова. Однако это менее ясно, что методы подписания с помощью secp256k1 ожидают ввода и обеспечить как выход. Он просто принимает строку и возвращает строку, независимо от того, что в нем. Он содержит метод, который позволяет проверить подпись, которая работает, когда я кормлю выход обратно в нее, но ничего не говорит.
Насколько я знаю, никто не имеет (публично) подписал сделку Bitcoin перед использованием Ruby, так что я не могу исключить возможность ошибки.
Есть ли способ, чтобы проверить подпись, не пытаясь на самом деле отправить сделку?