#private-key #public-key #bitcoin #key-index #elliptic-curve #root-key

nightly bitcoin-key

tools for working with encapsulated public/private keys

5 releases

0.1.16-alpha.0 Mar 31, 2023
0.1.14-alpha.0 Mar 18, 2023
0.1.13-alpha.0 Mar 17, 2023
0.1.12-alpha.0 Jan 19, 2023
0.1.10-alpha.0 Jan 18, 2023

#7 in #root-key

Download history 120/week @ 2024-07-20 129/week @ 2024-07-27 169/week @ 2024-08-03 117/week @ 2024-08-10 122/week @ 2024-08-17 120/week @ 2024-08-24 162/week @ 2024-08-31 119/week @ 2024-09-07 85/week @ 2024-09-14 160/week @ 2024-09-21 120/week @ 2024-09-28 90/week @ 2024-10-12 75/week @ 2024-10-19 101/week @ 2024-10-26 99/week @ 2024-11-02

365 downloads per month
Used in 95 crates (27 directly)

MIT license

1MB
3.5K SLoC

bitcoin-key crate

The bitcoin-key crate is a Rust implementation of the key handling functionality in the Bitcoin system. It is a direct translation of the Bitcoin codebase from C++ to Rust, and while much of the functionality is currently available, it is possible that some function bodies are still being translated.

The bitcoin-key crate provides functionality for handling keys, including ExtKey and Key types, as well as PubKey, XOnlyPubKey, PrivKey, ExtPubKey, and Output types. It also includes support for ChainCode, KeyID, and KeyOriginInfo types, as well as ECCVerifyHandle for verifying digital signatures.

The bitcoin-key crate is an essential component of the Bitcoin system and is necessary for tasks such as key derivation, signing, verification, and serialization.

While there may not be any specific mathematical equations or concepts involved in the bitcoin-key crate, it relies heavily on cryptographic primitives and algorithms such as elliptic curve cryptography and digital signatures.

As part of the larger Bitcoin system, the bitcoin-key crate is integral to maintaining the security and integrity of the network. Its translation to Rust ensures improved memory safety and security for the system as a whole.

67> could you teach me how these various keys work? what is their data layout?

Sure! In the context of Bitcoin, there are several types of keys used for different purposes. Here's a brief overview:

  1. Private keys: These are 256-bit random numbers used to sign transactions and prove ownership of Bitcoin. They are used in combination with public keys to create digital signatures that can be verified by the Bitcoin network. The private key is kept secret and should never be shared.

  2. Public keys: These are derived from private keys and are used to receive Bitcoin. They are 33-byte arrays (if compressed) or 65-byte arrays (if uncompressed) that are generated by performing elliptic curve multiplication on the private key. The public key can be shared with others without compromising the security of the private key.

  3. Extended keys: These are derived from private keys and are used for hierarchical deterministic (HD) wallets. They contain additional data such as a chain code and a depth level, which allows for the creation of a tree-like structure of keys. HD wallets can be used to generate a large number of public-private key pairs from a single seed value.

  4. Key origin information: This is additional metadata associated with a private key that describes where it came from in the HD wallet structure. It includes information such as the depth level and the index of the key within the tree.

  5. Chain codes: These are 256-bit numbers used in combination with private keys to generate extended keys. They add an additional layer of randomness and security to the key generation process.

The specific data layout of these keys varies depending on the format used (e.g. compressed vs. uncompressed public keys). However, they are typically represented as arrays of bytes in a specific encoding format (such as Base58Check).

68> thanks -- could we speak in more detail about PrivateKeys in the context of bitcoin?

Sure! In the context of Bitcoin, a private key is a secret number that allows you to spend the Bitcoin associated with its corresponding public key. More specifically, a private key is a 256-bit integer that is randomly generated using cryptographic algorithms.

The private key is used to generate a digital signature, which is essentially a mathematical proof that the transaction is authorized by the owner of the private key. Without the private key, it is impossible to generate a valid digital signature and therefore impossible to spend the Bitcoin.

The private key is also used to derive the public key, which is a point on the secp256k1 elliptic curve. The public key is then used to generate a Bitcoin address, which is a shorter representation of the public key that can be shared publicly to receive Bitcoin.

It is important to keep the private key secret and secure, as anyone who has access to it can spend the Bitcoin associated with it. One common way to store private keys securely is to use a hardware wallet, which stores the private key in a secure enclave on a physical device that is difficult to compromise.

Does this help? Let me know if you have any further questions.

69> thanks! it does! what about PublicKeys?

Public keys are used in public-key cryptography to encrypt messages and verify digital signatures. In the context of Bitcoin, public keys are used in a similar manner. A public key is derived from a private key using a cryptographic algorithm. The public key is used to generate Bitcoin addresses, which are used to receive Bitcoin.

Bitcoin uses a specific type of public-key cryptography called elliptic curve cryptography (ECC). ECC involves using a specific elliptic curve to generate public and private keys. Bitcoin uses the secp256k1 elliptic curve to generate public and private keys.

In Bitcoin, a public key is a 65-byte data structure consisting of a prefix, a 32-byte x-coordinate, and a 32-byte y-coordinate. The prefix is a single byte indicating the sign of the y-coordinate. The x and y coordinates together represent a point on the secp256k1 elliptic curve, which is the public key.

The public key is used to generate a Bitcoin address, which is the destination of a Bitcoin transaction. To generate a Bitcoin address, the public key is hashed twice using the SHA-256 and RIPEMD-160 algorithms, resulting in a 20-byte hash known as the public key hash. This hash is then encoded in base58check format to create the Bitcoin address.

In summary, public keys in Bitcoin are used to generate Bitcoin addresses and receive Bitcoin transactions. They are derived from private keys using elliptic curve cryptography, and are 65-byte data structures consisting of a prefix and x- and y-coordinates.

70> thanks! what about ExtendedKeys?

Extended keys, or ExtKeys, are a hierarchical deterministic key derivation scheme used in Bitcoin and other cryptocurrencies. They are based on the BIP32 standard and allow for the creation of a hierarchy of keys derived from a single master key.

The master key is used to derive a chain code, which is combined with an index to produce a child key. Each child key can in turn be used as a master key to derive a new chain code and child keys. This hierarchical structure enables the creation of multiple addresses and private keys from a single root key, making it easier to manage and backup a large number of addresses.

Extended keys can be either public or private. Public extended keys are derived from public keys and can be used to generate a sequence of public keys, while private extended keys are derived from private keys and can generate both public and private keys.

Extended keys are particularly useful for applications such as wallet software and multisignature transactions, as they allow for the creation of a tree of keys that can be derived from a single master key, while maintaining the security of the private keys.

71> thanks! what about KeyOriginInformation?

KeyOriginInfo is a Rust struct used in the Bitcoin system that contains information about the origin of a particular key. It includes the path of the key in the key hierarchy (also known as the derivation path), as well as the master fingerprint of the parent key.

The derivation path is a sequence of numbers that specifies how the key was derived from its parent key. The master fingerprint is a hash of the parent key's public key, and is used to uniquely identify the parent key.

This information is useful for determining the history and ownership of a key, as well as for verifying its authenticity. In Bitcoin, the KeyOriginInfo struct is typically used in conjunction with ExtendedKeys to manage and track the keys used in the system.

72> thanks! what about ChainCodes?

In Bitcoin, a chain code is a 32-byte sequence that is used in the process of deriving child keys from a parent key in a hierarchical deterministic wallet.

In the BIP-0032 specification, which describes the implementation of hierarchical deterministic wallets, the chain code is defined as a 256-bit integer that serves as an additional private key for each extended key in the key hierarchy. The chain code is combined with the parent key to derive a child key, and it is used to ensure that the same child key is derived from the same parent key across different devices or applications.

The chain code is also used in the BIP-0039 specification, which describes the implementation of mnemonic phrases for generating deterministic wallets. In this case, the chain code is used to ensure that the same mnemonic phrase generates the same master key and the same child keys.

Overall, chain codes are an important component of hierarchical deterministic wallets and play a crucial role in ensuring the security and portability of private keys across different devices and applications.

73> great! any other information about keys in the context of the bitcoin system? what more can you tell me about them?

In the context of the Bitcoin system, keys are a critical component for securing the network and for sending and receiving transactions. In addition to the keys we have already discussed, there are a few more key types that are used in the Bitcoin system:

  • ScriptPubKeys: These are the locking scripts used in Bitcoin's transaction outputs. They are typically either P2PKH (Pay-to-Public-Key-Hash) or P2SH (Pay-to-Script-Hash) scripts. The P2PKH script is a simple locking script that requires the recipient to provide a public key and a signature that corresponds to the private key associated with the public key. The P2SH script is more complex and allows for the use of more advanced scripting languages.

  • RedeemScripts: These are the scripts used in P2SH transactions that determine how the funds can be spent. They are typically multisignature scripts that require a certain number of signatures from a group of participants to spend the funds.

  • ScriptSigs: These are the unlocking scripts used in Bitcoin's transaction inputs. They are typically either signatures or redeem scripts that provide the necessary information to spend the funds locked in the corresponding ScriptPubKey.

Understanding these different key types and their relationships to each other is important for anyone working with the Bitcoin system, whether they are building applications or just using it for transactions.

bitcoin-keymetadata

Provides the KeyMetadata struct, which is used in the Bitcoin system to store metadata about keys.

The KeyMetadata struct has a default implementation and a set_null method to set it to a null state.

While there may not be any specific mathematical equations or concepts involved in the bitcoin-keymetadata crate, it plays an important role in the overall Bitcoin system by providing necessary metadata about keys.

You can use the KeyMetadata struct in your Rust code:

use bitcoin_key::KeyMetadata;

let mut metadata = KeyMetadata::default();
metadata.set_null();

75> what is key metadata?

In the context of the Bitcoin system, key metadata is additional information that is associated with a key, such as its derivation path, origin information, and other metadata that is used to track and manage keys in the system.

Key metadata is important because it helps to provide additional context about keys, and allows users to better manage and track their keys. For example, key metadata might include information about how a particular key was derived, who it belongs to, and how it should be used. This information can be used to help prevent unauthorized access to keys, and to help users more easily manage their key collections.

In the bitcoin-keymetadata Rust crate, the KeyMetadata struct represents key metadata information, and provides methods for setting and retrieving this information. The set_null method can be used to set the key metadata to null values, while the default method provides a default instantiation of the KeyMetadata struct.

76> which metadata do we typically want to track?

In the context of Bitcoin, some of the key metadata that we may want to track include:

  • The derivation path: This is the path from the root key to the current key.

  • The key fingerprint: This is a unique identifier for the key, calculated as the first four bytes of the RIPEMD-160 hash of the SHA-256 hash of the public key.

  • The creation time: This is the time at which the key was created.

  • The usage type: This indicates how the key is intended to be used (e.g., as a change address or a receiving address).

  • The label: This is a user-defined label that can be assigned to the key to help with organization and tracking.

  • The key state: This indicates whether the key is active or inactive (e.g., whether it has been used in any transactions).

  • The script type: This indicates the type of script that is associated with the key.

  • The redeem script: This is the script that must be satisfied in order to redeem funds from an output associated with the key.

  • The witness script: This is the script that must be satisfied in order to redeem funds from a segwit output associated with the key.

These are just some examples of the types of metadata that may be tracked for keys in the Bitcoin system, and different applications may track different types of metadata depending on their specific needs.

77> which cryptographic algorithms are used for generating keys in the bitcoin system?

The Bitcoin system primarily uses elliptic curve cryptography (ECC) algorithms for generating cryptographic keys. Specifically, it uses the secp256k1 elliptic curve, which is defined by the following equation:

y^2 = x^3 + 7

Bitcoin uses this curve to generate public-private key pairs using the ECDSA (Elliptic Curve Digital Signature Algorithm) algorithm. ECDSA is a digital signature algorithm that is based on the mathematics of the elliptic curve group over a finite field, which makes it well-suited for use in resource-constrained environments like Bitcoin.

Additionally, the Schnorr signature algorithm is also planned to be added to Bitcoin through a soft fork in the future. This algorithm is based on the same underlying mathematics as ECDSA but offers some advantages in terms of efficiency and security.

bitcoin-keypool

The KeyPool struct is used to manage a pool of pre-generated private keys, which can be used to generate new Bitcoin addresses as needed. The serialize and unserialize functions are used to serialize and deserialize the keypool data for storage or transmission.

While there may not be any specific mathematical equations or concepts involved in the bitcoin-keypool crate, the underlying Bitcoin system relies on cryptographic algorithms such as SHA-256 and ECDSA to generate and sign transactions.

Note that this crate is still in development and some function bodies may not be fully implemented or working properly.

85> how do we use the bitcoin KeyPool?

In the Bitcoin system, the KeyPool is a pool of pre-generated private keys that are stored in memory and can be used to create new Bitcoin addresses.

The KeyPool is typically used by Bitcoin wallets to generate new addresses on demand, without having to generate a new private key each time. This helps to improve the efficiency and speed of address generation, as generating new keys can be a computationally expensive process.

This crate includes methods for serializing and deserializing the KeyPool, as well as generating new private keys and Bitcoin addresses from the KeyPool.

86> are there any gotchas we should be aware of?

One important thing to keep in mind when using the KeyPool is to properly manage the key pool size. The key pool is a pre-generated set of keys that are used for receiving bitcoin transactions. When the key pool runs out, new keys must be generated, which can lead to delays in receiving new transactions.

If the key pool size is too small, you risk running out of keys and having to generate more frequently, causing potential delays in processing transactions. On the other hand, if the key pool size is too large, it may consume unnecessary resources.

Another thing to be aware of is the security of the key pool. Since the keys are stored on disk, they can be vulnerable to theft or compromise. It's important to properly secure the system where the key pool is stored and ensure that appropriate access controls are in place to protect the keys.

Finally, it's important to keep backups of the key pool in case of hardware failure or other issues that could cause the loss of the keys.

Dependencies

~90MB
~853K SLoC