Skip to content

Instantly share code, notes, and snippets.

@azuchi
Last active January 20, 2018 02:13
Show Gist options
  • Select an option

  • Save azuchi/7952209d79934d59b6ce7912c984b136 to your computer and use it in GitHub Desktop.

Select an option

Save azuchi/7952209d79934d59b6ce7912c984b136 to your computer and use it in GitHub Desktop.
ECDSAの署名から公開鍵を取得するサンプル
require 'ecdsa'
require 'bitcoin'
tx = Bitcoin::Tx.parse_from_payload('010000000201e4a0f1fa83c642b91feafae36a0f8fded4158dfa6fd650e046b4364b805684000000006a473044022045c65646abc12c71352335dbec2824b2dbdef9253366b4b83439b2190ce098d20220112f48fc8e2c76d079a4bc1d448ec134d22737d9765421b7a9b050dd4dc9368f01210259f6658325c4e3ca6fb38f657ffcbf4b1c45ef4f0c1dd86d5f6c0cebb0e09520ffffffff31137db564a7fad07c9db5b6b862786589977c68d1270819030a9079941ca6c9010000006a47304402204354565632eedd30fb9ca5c22bb70ef848afd74f7bed354d267705a6e71ea885022019159daf2d623ef634a65399ce70e34c4422c8eba19bf877e6b822ffc6a4607601210259f6658325c4e3ca6fb38f657ffcbf4b1c45ef4f0c1dd86d5f6c0cebb0e09520ffffffff02801d2c04000000001976a914322653c91d6038e08b6d971e4560842c155c8a8888ac80248706000000001976a9143b9722f91a2e50d913dadc3a6a8a88a58a7b859788ac00000000'.htb)
prev_out = Bitcoin::Script.parse_from_payload('76a9143b9722f91a2e50d913dadc3a6a8a88a58a7b859788ac'.htb)
## ↑の0番目のインプットを署名する際に使用するsighash=署名対象のメッセージ
sighash = tx.sighash_for_input(0, prev_out)
# 実際の署名データ
signature = ECDSA::Format::SignatureDerString.decode('3044022045c65646abc12c71352335dbec2824b2dbdef9253366b4b83439b2190ce098d20220112f48fc8e2c76d079a4bc1d448ec134d22737d9765421b7a9b050dd4dc9368f'.htb)
pubkeys = ECDSA.recover_public_key(ECDSA::Group::Secp256k1, sighash, signature).map do |p|
ECDSA::Format::PointOctetString.encode(p, compression: true).bth
end
puts pubkeys
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment