¿Una clave privada siempre genera la misma clave pública y dirección?

Parece que, dependiendo del método, obtienes diferentes claves y direcciones públicas cuando usas bitcoin-ruby con la misma clave privada. Probablemente estoy haciendo algo mal, pero no estoy seguro de dónde está...

Puedo generar una clave privada, una clave pública y una dirección usando

def generate_address
  private_key, public_key = Bitcoin::generate_key
  address = Bitcoin::pubkey_to_address(public_key)
  [private_key, public_key, address]
end

Y, como ejemplo, esto podría generar:

priv_key= "9d524654045c891327a1dc0c329bcd42311b1767b81d7e997486e841ca5a2a87"
publ_key = "04353457464a32ede1b80fd7299f616320b52cc22796cd27d5b41594f418c2ea26dfeec97273f89b2d908a44fce981ff19f2e2de1408538bb0c0528992ce47f3be"
address = "n1693JDDu5ukbtNh2sHXdZSobKnVEpdtjL"

Sin embargo, si luego coloco la clave privada en otra función que genera los detalles de la clave de una manera diferente, ¡obtengo una dirección diferente! ¿Por qué es esto?

def key_details(prikey)
  #returns prikey, prikey_hash58, pubkey_hash58, pubkey_uncompressed, address as a hash
  my_key = Bitcoin::Key.new(prikey)
  # binding.pry
  { prikey:prikey, 
    prikey_base58:my_key.to_base58, 
    pubkey_58:my_key.pub, 
    pubkey: my_key.pub_uncompressed, 
    address:my_key.addr
  }
end

Respuestas (1)

La diferencia es que la primera función usa claves públicas sin comprimir y la segunda función usa claves públicas comprimidas. Las claves públicas sin comprimir son de 65 bytes y las comprimidas son de 33 bytes.

Para obtener más información sobre las claves públicas comprimidas, consulte: ¿Qué es una clave Bitcoin comprimida?