Module: Bitcoin::Taproot
- Defined in:
- lib/bitcoin/taproot.rb,
lib/bitcoin/taproot/leaf_node.rb,
lib/bitcoin/taproot/control_block.rb,
lib/bitcoin/taproot/simple_builder.rb
Defined Under Namespace
Classes: ControlBlock, Error, LeafNode, SimpleBuilder
Class Method Summary collapse
-
.tweak(internal_key, merkle_root) ⇒ String
Calculate tweak value from
internal_pubkey
andmerkle_root
. -
.tweak_private_key(internal_private_key, merkle_root) ⇒ Object
Generate tweak private key.
-
.tweak_public_key(internal_key, merkle_root) ⇒ Bitcoin::Key
Generate tweak public key form
internal_pubkey
andmerkle_root
.
Class Method Details
.tweak(internal_key, merkle_root) ⇒ String
Calculate tweak value from internal_pubkey
and merkle_root
.
16 17 18 19 20 21 22 23 24 |
# File 'lib/bitcoin/taproot.rb', line 16 def tweak(internal_key, merkle_root) raise Error, 'internal_key must be Bitcoin::Key object.' unless internal_key.is_a?(Bitcoin::Key) merkle_root ||= '' t = Bitcoin.tagged_hash('TapTweak', internal_key.xonly_pubkey.htb + merkle_root.htb) raise Error, 'tweak value exceeds the curve order' if t.bti >= ECDSA::Group::Secp256k1.order t end |
.tweak_private_key(internal_private_key, merkle_root) ⇒ Object
Generate tweak private key
38 39 40 41 42 43 44 45 46 |
# File 'lib/bitcoin/taproot.rb', line 38 def tweak_private_key(internal_private_key, merkle_root) p = internal_private_key.to_point private_key = p.has_even_y? ? internal_private_key.priv_key.to_i(16) : ECDSA::Group::Secp256k1.order - internal_private_key.priv_key.to_i(16) t = tweak(internal_private_key, merkle_root) private_key = ECDSA::Format::IntegerOctetString.encode( (t.bti + private_key) % ECDSA::Group::Secp256k1.order, 32) Bitcoin::Key.new(priv_key: private_key.bth) end |
.tweak_public_key(internal_key, merkle_root) ⇒ Bitcoin::Key
Generate tweak public key form internal_pubkey
and merkle_root
.
30 31 32 33 34 |
# File 'lib/bitcoin/taproot.rb', line 30 def tweak_public_key(internal_key, merkle_root) t = tweak(internal_key, merkle_root) key = Bitcoin::Key.new(priv_key: t.bth, key_type: Key::TYPES[:compressed]) Bitcoin::Key.from_point(key.to_point + internal_key.to_point) end |