Merge branch 'master' into make_txbuilder_take_ref_to_wallet

This commit is contained in:
LLFourn 2021-01-30 13:12:13 +11:00
commit 6689384c8a
No known key found for this signature in database
GPG Key ID: A27093B54DA11F65
6 changed files with 65 additions and 22 deletions

View File

@ -41,6 +41,8 @@ jobs:
run: rustup set profile minimal run: rustup set profile minimal
- name: Add clippy - name: Add clippy
run: rustup component add clippy run: rustup component add clippy
- name: Update toolchain
run: rustup update
- name: Build - name: Build
run: cargo build --features ${{ matrix.features }} --no-default-features run: cargo build --features ${{ matrix.features }} --no-default-features
- name: Clippy - name: Clippy
@ -66,6 +68,8 @@ jobs:
run: rustup default nightly run: rustup default nightly
- name: Set profile - name: Set profile
run: rustup set profile minimal run: rustup set profile minimal
- name: Update toolchain
run: rustup update
- name: Test - name: Test
run: cargo test --features test-md-docs --no-default-features -- doctest::ReadmeDoctests run: cargo test --features test-md-docs --no-default-features -- doctest::ReadmeDoctests
@ -96,6 +100,8 @@ jobs:
run: $HOME/.cargo/bin/rustup default stable run: $HOME/.cargo/bin/rustup default stable
- name: Set profile - name: Set profile
run: $HOME/.cargo/bin/rustup set profile minimal run: $HOME/.cargo/bin/rustup set profile minimal
- name: Update toolchain
run: $HOME/.cargo/bin/rustup update
- name: Start core - name: Start core
run: ./ci/start-core.sh run: ./ci/start-core.sh
- name: Test - name: Test
@ -129,6 +135,8 @@ jobs:
run: rustup set profile minimal run: rustup set profile minimal
- name: Add target wasm32 - name: Add target wasm32
run: rustup target add wasm32-unknown-unknown run: rustup target add wasm32-unknown-unknown
- name: Update toolchain
run: rustup update
- name: Check - name: Check
run: cargo check --target wasm32-unknown-unknown --features esplora --no-default-features run: cargo check --target wasm32-unknown-unknown --features esplora --no-default-features
@ -144,5 +152,7 @@ jobs:
run: rustup set profile minimal run: rustup set profile minimal
- name: Add clippy - name: Add clippy
run: rustup component add rustfmt run: rustup component add rustfmt
- name: Update toolchain
run: rustup update
- name: Check fmt - name: Check fmt
run: cargo fmt --all -- --check run: cargo fmt --all -- --check

View File

@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Misc
#### Added
- Added a function to get the version of BDK at runtime
### Wallet
#### Changed
- Removed the explicit `id` argument from `Wallet::add_signer()` since that's now part of `Signer` itself
## [v0.3.0] - [v0.2.0] ## [v0.3.0] - [v0.2.0]
### Descriptor ### Descriptor

View File

@ -32,13 +32,14 @@ Pre-`v1.0.0` our "major" releases only affect the "minor" semver value. Accordin
- If it's a minor issue you can just fix it in the release branch, since it will be merged back to `master` eventually - If it's a minor issue you can just fix it in the release branch, since it will be merged back to `master` eventually
- For bigger issues you can fix them on `master` and then *cherry-pick* the commit to the release branch - For bigger issues you can fix them on `master` and then *cherry-pick* the commit to the release branch
6. Update the changelog with the new release version. 6. Update the changelog with the new release version.
7. On release day, make a commit on the release branch to bump the version to `x.y.z`. The message should be "Bump version to x.y.z". 7. Update `src/lib.rs` with the new version (line ~59)
8. Add a tag to this commit. The tag name should be `vx.y.z` (for example `v0.5.0`), and the message "Release x.y.z". Make sure the tag is signed, for extra safety use the explicit `--sign` flag. 8. On release day, make a commit on the release branch to bump the version to `x.y.z`. The message should be "Bump version to x.y.z".
9. Push the new commits to the upstream release branch, wait for the CI to finish one last time. 9. Add a tag to this commit. The tag name should be `vx.y.z` (for example `v0.5.0`), and the message "Release x.y.z". Make sure the tag is signed, for extra safety use the explicit `--sign` flag.
10. Publish **all** the updated crates to crates.io. 10. Push the new commits to the upstream release branch, wait for the CI to finish one last time.
11. Make a new commit to bump the version value to `x.y.(z+1)-dev`. The message should be "Bump version to x.y.(z+1)-dev". 11. Publish **all** the updated crates to crates.io.
12. Merge the release branch back into `master`. 12. Make a new commit to bump the version value to `x.y.(z+1)-dev`. The message should be "Bump version to x.y.(z+1)-dev".
13. Create the release on GitHub: go to "tags", click on the dots on the right and select "Create Release". Then set the title to `vx.y.z` and write down some brief release notes. 13. Merge the release branch back into `master`.
14. Make sure the new release shows up on crates.io and that the docs are built correctly on docs.rs. 14. Create the release on GitHub: go to "tags", click on the dots on the right and select "Create Release". Then set the title to `vx.y.z` and write down some brief release notes.
15. Announce the release on Twitter, Discord and Telegram. 15. Make sure the new release shows up on crates.io and that the docs are built correctly on docs.rs.
16. Celebrate :tada: 16. Announce the release on Twitter, Discord and Telegram.
17. Celebrate :tada:

View File

@ -56,7 +56,7 @@
//! interact with the bitcoin P2P network. //! interact with the bitcoin P2P network.
//! //!
//! ```toml //! ```toml
//! bdk = "0.2.0" //! bdk = "0.3.0"
//! ``` //! ```
//! //!
//! ## Sync the balance of a descriptor //! ## Sync the balance of a descriptor
@ -265,3 +265,8 @@ pub use wallet::address_validator;
pub use wallet::signer; pub use wallet::signer;
pub use wallet::tx_builder::TxBuilder; pub use wallet::tx_builder::TxBuilder;
pub use wallet::Wallet; pub use wallet::Wallet;
/// Get the version of BDK at runtime
pub fn version() -> &'static str {
env!("CARGO_PKG_VERSION", "unknown")
}

View File

@ -58,7 +58,7 @@ pub use utils::IsDust;
use address_validator::AddressValidator; use address_validator::AddressValidator;
use coin_selection::DefaultCoinSelectionAlgorithm; use coin_selection::DefaultCoinSelectionAlgorithm;
use signer::{Signer, SignerId, SignerOrdering, SignersContainer}; use signer::{Signer, SignerOrdering, SignersContainer};
use tx_builder::{BumpFee, CreateTx, FeePolicy, TxBuilder, TxParams}; use tx_builder::{BumpFee, CreateTx, FeePolicy, TxBuilder, TxParams};
use utils::{ use utils::{
check_nlocktime, check_nsequence_rbf, descriptor_to_pk_ctx, After, Older, SecpCtx, check_nlocktime, check_nsequence_rbf, descriptor_to_pk_ctx, After, Older, SecpCtx,
@ -236,7 +236,6 @@ where
pub fn add_signer( pub fn add_signer(
&mut self, &mut self,
keychain: KeychainKind, keychain: KeychainKind,
id: SignerId,
ordering: SignerOrdering, ordering: SignerOrdering,
signer: Arc<dyn Signer>, signer: Arc<dyn Signer>,
) { ) {
@ -245,7 +244,7 @@ where
KeychainKind::Internal => Arc::make_mut(&mut self.change_signers), KeychainKind::Internal => Arc::make_mut(&mut self.change_signers),
}; };
signers.add_external(id, ordering, signer); signers.add_external(signer.id(&self.secp), ordering, signer);
} }
/// Add an address validator /// Add an address validator

View File

@ -33,7 +33,6 @@
//! # use bitcoin::secp256k1::{Secp256k1, All}; //! # use bitcoin::secp256k1::{Secp256k1, All};
//! # use bitcoin::*; //! # use bitcoin::*;
//! # use bitcoin::util::psbt; //! # use bitcoin::util::psbt;
//! # use bitcoin::util::bip32::Fingerprint;
//! # use bdk::signer::*; //! # use bdk::signer::*;
//! # use bdk::database::*; //! # use bdk::database::*;
//! # use bdk::*; //! # use bdk::*;
@ -46,6 +45,9 @@
//! # fn connect() -> Self { //! # fn connect() -> Self {
//! # CustomHSM //! # CustomHSM
//! # } //! # }
//! # fn get_id(&self) -> SignerId {
//! # SignerId::Dummy(0)
//! # }
//! # } //! # }
//! #[derive(Debug)] //! #[derive(Debug)]
//! struct CustomSigner { //! struct CustomSigner {
@ -71,6 +73,10 @@
//! Ok(()) //! Ok(())
//! } //! }
//! //!
//! fn id(&self, _secp: &Secp256k1<All>) -> SignerId {
//! self.device.get_id()
//! }
//!
//! fn sign_whole_tx(&self) -> bool { //! fn sign_whole_tx(&self) -> bool {
//! false //! false
//! } //! }
@ -82,7 +88,6 @@
//! let mut wallet = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?; //! let mut wallet = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?;
//! wallet.add_signer( //! wallet.add_signer(
//! KeychainKind::External, //! KeychainKind::External,
//! Fingerprint::from_str("e30f11b8").unwrap().into(),
//! SignerOrdering(200), //! SignerOrdering(200),
//! Arc::new(custom_signer) //! Arc::new(custom_signer)
//! ); //! );
@ -118,6 +123,8 @@ pub enum SignerId {
PkHash(hash160::Hash), PkHash(hash160::Hash),
/// The fingerprint of a BIP32 extended key /// The fingerprint of a BIP32 extended key
Fingerprint(Fingerprint), Fingerprint(Fingerprint),
/// Dummy identifier
Dummy(u64),
} }
impl From<hash160::Hash> for SignerId { impl From<hash160::Hash> for SignerId {
@ -184,6 +191,12 @@ pub trait Signer: fmt::Debug + Send + Sync {
/// input individually /// input individually
fn sign_whole_tx(&self) -> bool; fn sign_whole_tx(&self) -> bool;
/// Return the [`SignerId`] for this signer
///
/// The [`SignerId`] can be used to lookup a signer in the [`Wallet`](crate::Wallet)'s signers map or to
/// compare two signers.
fn id(&self, secp: &SecpCtx) -> SignerId;
/// Return the secret key for the signer /// Return the secret key for the signer
/// ///
/// This is used internally to reconstruct the original descriptor that may contain secrets. /// This is used internally to reconstruct the original descriptor that may contain secrets.
@ -234,6 +247,10 @@ impl Signer for DescriptorXKey<ExtendedPrivKey> {
false false
} }
fn id(&self, secp: &SecpCtx) -> SignerId {
SignerId::from(self.root_fingerprint(&secp))
}
fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> { fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> {
Some(DescriptorSecretKey::XPrv(self.clone())) Some(DescriptorSecretKey::XPrv(self.clone()))
} }
@ -285,6 +302,10 @@ impl Signer for PrivateKey {
false false
} }
fn id(&self, secp: &SecpCtx) -> SignerId {
SignerId::from(self.public_key(secp).to_pubkeyhash())
}
fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> { fn descriptor_secret_key(&self) -> Option<DescriptorSecretKey> {
Some(DescriptorSecretKey::SinglePriv(DescriptorSinglePriv { Some(DescriptorSecretKey::SinglePriv(DescriptorSinglePriv {
key: *self, key: *self,
@ -345,12 +366,7 @@ impl From<KeyMap> for SignersContainer {
for (_, secret) in keymap { for (_, secret) in keymap {
match secret { match secret {
DescriptorSecretKey::SinglePriv(private_key) => container.add_external( DescriptorSecretKey::SinglePriv(private_key) => container.add_external(
SignerId::from( SignerId::from(private_key.key.public_key(&secp).to_pubkeyhash()),
private_key
.key
.public_key(&Secp256k1::signing_only())
.to_pubkeyhash(),
),
SignerOrdering::default(), SignerOrdering::default(),
Arc::new(private_key.key), Arc::new(private_key.key),
), ),
@ -650,6 +666,10 @@ mod signers_container_tests {
Ok(()) Ok(())
} }
fn id(&self, _secp: &SecpCtx) -> SignerId {
SignerId::Dummy(42)
}
fn sign_whole_tx(&self) -> bool { fn sign_whole_tx(&self) -> bool {
true true
} }