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

Class Method Details

.tweak(internal_key, merkle_root) ⇒ String

Calculate tweak value from internal_pubkey and merkle_root.

Parameters:

  • internal_key (Bitcoin::Key)

    Internal key with hex format(x-only public key).

  • merkle_root (String)

    Merkle root value of script tree with hex format.

Returns:

  • (String)

    teak value with binary format.

Raises:



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.

Parameters:

  • internal_key (Bitcoin::Key)

    Internal key with hex format(x-only public key).

  • merkle_root (String)

    Merkle root value of script tree with hex format.

Returns:



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