Add wallet creation example using RPC - #519

Merged
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet
Mar 29, 2022
Merged

Add wallet creation example using RPC#519
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet

Conversation

@rajarshimaitra

Copy link
Copy Markdown
Contributor

Description

As mentioned in bitcoindevkit/bitcoindevkit.org#83 (comment) it would be helpful
to have wallet creation example code in the example directory.

This is an attempt to create the most simplistic bdk wallet with a RPC backend and demonstrate receiving, creating, signing
and broadcasting transaction.

The code is a refinement of the RPC tutorial https://bitcoindevkit.org/blog/bitcoin-core-rpc-demo/ with more elaborate doc comments.

Notes to the reviewers

To automate the background RPC process electrsd is used which is already a dev-dependency of bdk.

Checklists

All Submissions:

  • I've signed all my commits
  • I followed the contribution guidelines
  • I ran cargo fmt and cargo clippy before committing

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Apparently cargo test is trying to run the example which has some extra feature dependency and causing the test failure in CI.

I am not sure why thats not the case for other examples though (they also have special required deps).

@notmandatory@afilini am I missing something in the cargo configuration?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed build failure, all tests passing..

@ConorOkus

Copy link
Copy Markdown

Trying to run this locally at the moment, but failing. What command should I run? cargo run --example rpcwallet?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

@ConorOkus this should work cargo run --features="all-keys key-value-db rpc" --example rpcwallet.

@ConorOkus

Copy link
Copy Markdown

tACK

@LLFourn

Copy link
Copy Markdown
Collaborator

utACK does the example get run in the ci?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

utACK does the example get run in the ci?

I think currently it doesn't. But we can explicitly ask the CI to run examples I think. Haven't tried that out.

@afilini

Copy link
Copy Markdown
Member

I think it's ok if we just compile this example in the CI, I'm guessing what it does is already covered by specific unit tests

@ConorOkus

Copy link
Copy Markdown

I'm trying to do a similar thing in LDK here

@afilini

Copy link
Copy Markdown
Member

It's not as easy for BDK because different examples might require different features. So if you just compile them like you did, they will most likely fail.

You would have to get the list of features from the Cargo.toml and then compile using those

@rajarshimaitra

rajarshimaitra commented Feb 9, 2022

Copy link
Copy Markdown
ContributorAuthor

Retested

All looks good on this one to me.. Its good to go I think..

@notmandatory

Copy link
Copy Markdown
Member

This example LGTM but I'm going hold off merging it until #535 goes in so it can be refactored as needed first. Also removing from next milestone since we're already a bit behind and have some higher priority PRs to get in.

@xraid

Copy link
Copy Markdown

has this been massaged to accommodate new stuff in merged #535

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

has this been massaged to accommodate new stuff in merged #535

Good point, This will definitely have effect on the example. Will update it accordingly..

@notmandatory

Copy link
Copy Markdown
Member

I think this PR also needs a rebase to pick up the latest verify changes, in particular related to the CI Blockchain jobs.

@rajarshimaitra
rajarshimaitraforce-pushed the example-rpc-wallet branch 2 times, most recently from 14cb771 to a722c52CompareMarch 22, 2022 07:07
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed the example in light of #535 and rebased..

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried testing but got an error, do I need to do something else to run it?:

% cargo run --features keys-bip39,key-value-db,rpc --example rpcwallet
warning: field is never read: `network`
--> src/blockchain/rpc.rs:58:5
|
58 | network: Network,
| ^^^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `bdk` (lib) generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.07s
Running `target/debug/examples/rpcwallet`>> Setting up bitcoind
>> bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC
>> Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(Timeout)))

Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
This adds an example wallet creation code with sled DB and RPC
Blockchain.
The backend RPC is managed using electrsd::bitcoind
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @notmandatory for the review.. I fixed the nits.

I tried testing but got an error, do I need to do something else to run it?:

This seems very weird. Its not happening in my local. And it seems the error is originating from blockchain::rpc not the example. Thats even more odd. But I am not sure how to reproduce it.. Probably because of a different rustc version you are using??

@xraid

xraid commented Mar 27, 2022

Copy link
Copy Markdown

i get :

Setting up bitcoind
bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC

Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(SocketError(Os { code: 35, kind: WouldBlock, message: "Resource temporarily unavailable" }))))

when i swap out in file rpcwallet.rs to use :

use bdk::bitcoincore_rpc::{Auth as rpc_auth, Client, RpcApi};

with Client invocation dance => instead of using :

use electrsd;

the BDK wallet finds bitcoind and all is good ...

While running a local regtest bitcoind with correct auth ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @xraid for reporting.. I am still not being able to reproduce any of the issues. Its all working fine in my local as normal.

Did you mean you have to do the bitcoin core rpc setup manually instead of using electrsd crate and then it worked?

@xraid

xraid commented Mar 28, 2022

Copy link
Copy Markdown

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

i changed and used Client instead of the electrsd lines [50...75]

line 103 reuse bitcoind object for bdk-wallet that was used for core-wallet prior
let rpc_config = RpcConfig { url: bitcoind.params.rpc_socket.to_string(), auth: bitcoind_auth,

i am still to fresh in Rust and the BDK code base to make any sense in try debug,

so i leave it to You and meanwhile watch ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

2 similar comments
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@xraid

xraid commented Mar 29, 2022

Copy link
Copy Markdown

i run a local Nigiri regtest bitcoind electrum and used the bdk::bitcoincore_rpc::Client for core-wallet and for bdk-wallet i use :

bdk::blockchain::rpc::RpcBlockchain

where i added auth and url in config :

// Set RPC username and password
let auth = Auth::UserPass {
username: "admin1".to_string(),
password: "123".to_string()
};
// Set RPC url
let mut rpc_url = "http://".to_string();
rpc_url.push_str("127.0.0.1:18443");
// Create a RPC configuration of the running bitcoind backend we created in last step
// Note: If you are using custom regtest node, use the appropriate url and auth
let rpc_config = RpcConfig {
url: rpc_url, // bitcoind.params.rpc_socket.to_string(),
auth: auth, //bitcoind_auth,
network: Network::Regtest,
wallet_name,
skip_blocks: None,
};
// Use the above configuration to create a RPC blockchain backend
let blockchain = RpcBlockchain::from_config(&rpc_config)?;

so there is 2 diff connections to bitcoind rpc - one for core and one for bdk

Why the example with using the use electrsd; succeeds with first connect to core wallet and fails when trying to connect from initiated bdk wallet, i dont know ...

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tACK 8a98e69

I verified this runs on my Linux (ubuntu 20.04) box. I'm still getting an error on my macOS system, but I suspect it's something specific to the mac. I'd like to know what's blocking it on the mac but not a reason to hold up this PR.

@notmandatory
notmandatory merged commit ff6db18 into bitcoindevkit:masterMar 29, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@rajarshimaitra@ConorOkus@LLFourn@afilini@notmandatory@xraid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add wallet creation example using RPC - #519

Merged
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet
Mar 29, 2022
Merged

Add wallet creation example using RPC#519
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet

Conversation

@rajarshimaitra

Copy link
Copy Markdown
Contributor

Description

As mentioned in bitcoindevkit/bitcoindevkit.org#83 (comment) it would be helpful
to have wallet creation example code in the example directory.

This is an attempt to create the most simplistic bdk wallet with a RPC backend and demonstrate receiving, creating, signing
and broadcasting transaction.

The code is a refinement of the RPC tutorial https://bitcoindevkit.org/blog/bitcoin-core-rpc-demo/ with more elaborate doc comments.

Notes to the reviewers

To automate the background RPC process electrsd is used which is already a dev-dependency of bdk.

Checklists

All Submissions:

  • I've signed all my commits
  • I followed the contribution guidelines
  • I ran cargo fmt and cargo clippy before committing

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Apparently cargo test is trying to run the example which has some extra feature dependency and causing the test failure in CI.

I am not sure why thats not the case for other examples though (they also have special required deps).

@notmandatory@afilini am I missing something in the cargo configuration?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed build failure, all tests passing..

@ConorOkus

Copy link
Copy Markdown

Trying to run this locally at the moment, but failing. What command should I run? cargo run --example rpcwallet?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

@ConorOkus this should work cargo run --features="all-keys key-value-db rpc" --example rpcwallet.

@ConorOkus

Copy link
Copy Markdown

tACK

@LLFourn

Copy link
Copy Markdown
Collaborator

utACK does the example get run in the ci?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

utACK does the example get run in the ci?

I think currently it doesn't. But we can explicitly ask the CI to run examples I think. Haven't tried that out.

@afilini

Copy link
Copy Markdown
Member

I think it's ok if we just compile this example in the CI, I'm guessing what it does is already covered by specific unit tests

@ConorOkus

Copy link
Copy Markdown

I'm trying to do a similar thing in LDK here

@afilini

Copy link
Copy Markdown
Member

It's not as easy for BDK because different examples might require different features. So if you just compile them like you did, they will most likely fail.

You would have to get the list of features from the Cargo.toml and then compile using those

@rajarshimaitra

rajarshimaitra commented Feb 9, 2022

Copy link
Copy Markdown
ContributorAuthor

Retested

All looks good on this one to me.. Its good to go I think..

@notmandatory

Copy link
Copy Markdown
Member

This example LGTM but I'm going hold off merging it until #535 goes in so it can be refactored as needed first. Also removing from next milestone since we're already a bit behind and have some higher priority PRs to get in.

@xraid

Copy link
Copy Markdown

has this been massaged to accommodate new stuff in merged #535

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

has this been massaged to accommodate new stuff in merged #535

Good point, This will definitely have effect on the example. Will update it accordingly..

@notmandatory

Copy link
Copy Markdown
Member

I think this PR also needs a rebase to pick up the latest verify changes, in particular related to the CI Blockchain jobs.

@rajarshimaitra
rajarshimaitraforce-pushed the example-rpc-wallet branch 2 times, most recently from 14cb771 to a722c52CompareMarch 22, 2022 07:07
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed the example in light of #535 and rebased..

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried testing but got an error, do I need to do something else to run it?:

% cargo run --features keys-bip39,key-value-db,rpc --example rpcwallet
warning: field is never read: `network`
--> src/blockchain/rpc.rs:58:5
|
58 | network: Network,
| ^^^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `bdk` (lib) generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.07s
Running `target/debug/examples/rpcwallet`>> Setting up bitcoind
>> bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC
>> Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(Timeout)))

Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
This adds an example wallet creation code with sled DB and RPC
Blockchain.
The backend RPC is managed using electrsd::bitcoind
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @notmandatory for the review.. I fixed the nits.

I tried testing but got an error, do I need to do something else to run it?:

This seems very weird. Its not happening in my local. And it seems the error is originating from blockchain::rpc not the example. Thats even more odd. But I am not sure how to reproduce it.. Probably because of a different rustc version you are using??

@xraid

xraid commented Mar 27, 2022

Copy link
Copy Markdown

i get :

Setting up bitcoind
bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC

Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(SocketError(Os { code: 35, kind: WouldBlock, message: "Resource temporarily unavailable" }))))

when i swap out in file rpcwallet.rs to use :

use bdk::bitcoincore_rpc::{Auth as rpc_auth, Client, RpcApi};

with Client invocation dance => instead of using :

use electrsd;

the BDK wallet finds bitcoind and all is good ...

While running a local regtest bitcoind with correct auth ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @xraid for reporting.. I am still not being able to reproduce any of the issues. Its all working fine in my local as normal.

Did you mean you have to do the bitcoin core rpc setup manually instead of using electrsd crate and then it worked?

@xraid

xraid commented Mar 28, 2022

Copy link
Copy Markdown

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

i changed and used Client instead of the electrsd lines [50...75]

line 103 reuse bitcoind object for bdk-wallet that was used for core-wallet prior
let rpc_config = RpcConfig { url: bitcoind.params.rpc_socket.to_string(), auth: bitcoind_auth,

i am still to fresh in Rust and the BDK code base to make any sense in try debug,

so i leave it to You and meanwhile watch ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

2 similar comments
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@xraid

xraid commented Mar 29, 2022

Copy link
Copy Markdown

i run a local Nigiri regtest bitcoind electrum and used the bdk::bitcoincore_rpc::Client for core-wallet and for bdk-wallet i use :

bdk::blockchain::rpc::RpcBlockchain

where i added auth and url in config :

// Set RPC username and password
let auth = Auth::UserPass {
username: "admin1".to_string(),
password: "123".to_string()
};
// Set RPC url
let mut rpc_url = "http://".to_string();
rpc_url.push_str("127.0.0.1:18443");
// Create a RPC configuration of the running bitcoind backend we created in last step
// Note: If you are using custom regtest node, use the appropriate url and auth
let rpc_config = RpcConfig {
url: rpc_url, // bitcoind.params.rpc_socket.to_string(),
auth: auth, //bitcoind_auth,
network: Network::Regtest,
wallet_name,
skip_blocks: None,
};
// Use the above configuration to create a RPC blockchain backend
let blockchain = RpcBlockchain::from_config(&rpc_config)?;

so there is 2 diff connections to bitcoind rpc - one for core and one for bdk

Why the example with using the use electrsd; succeeds with first connect to core wallet and fails when trying to connect from initiated bdk wallet, i dont know ...

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tACK 8a98e69

I verified this runs on my Linux (ubuntu 20.04) box. I'm still getting an error on my macOS system, but I suspect it's something specific to the mac. I'd like to know what's blocking it on the mac but not a reason to hold up this PR.

@notmandatory
notmandatory merged commit ff6db18 into bitcoindevkit:masterMar 29, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@rajarshimaitra@ConorOkus@LLFourn@afilini@notmandatory@xraid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add wallet creation example using RPC - #519

Merged
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet
Mar 29, 2022
Merged

Add wallet creation example using RPC#519
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet

Conversation

@rajarshimaitra

Copy link
Copy Markdown
Contributor

Description

As mentioned in bitcoindevkit/bitcoindevkit.org#83 (comment) it would be helpful
to have wallet creation example code in the example directory.

This is an attempt to create the most simplistic bdk wallet with a RPC backend and demonstrate receiving, creating, signing
and broadcasting transaction.

The code is a refinement of the RPC tutorial https://bitcoindevkit.org/blog/bitcoin-core-rpc-demo/ with more elaborate doc comments.

Notes to the reviewers

To automate the background RPC process electrsd is used which is already a dev-dependency of bdk.

Checklists

All Submissions:

  • I've signed all my commits
  • I followed the contribution guidelines
  • I ran cargo fmt and cargo clippy before committing

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Apparently cargo test is trying to run the example which has some extra feature dependency and causing the test failure in CI.

I am not sure why thats not the case for other examples though (they also have special required deps).

@notmandatory@afilini am I missing something in the cargo configuration?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed build failure, all tests passing..

@ConorOkus

Copy link
Copy Markdown

Trying to run this locally at the moment, but failing. What command should I run? cargo run --example rpcwallet?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

@ConorOkus this should work cargo run --features="all-keys key-value-db rpc" --example rpcwallet.

@ConorOkus

Copy link
Copy Markdown

tACK

@LLFourn

Copy link
Copy Markdown
Collaborator

utACK does the example get run in the ci?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

utACK does the example get run in the ci?

I think currently it doesn't. But we can explicitly ask the CI to run examples I think. Haven't tried that out.

@afilini

Copy link
Copy Markdown
Member

I think it's ok if we just compile this example in the CI, I'm guessing what it does is already covered by specific unit tests

@ConorOkus

Copy link
Copy Markdown

I'm trying to do a similar thing in LDK here

@afilini

Copy link
Copy Markdown
Member

It's not as easy for BDK because different examples might require different features. So if you just compile them like you did, they will most likely fail.

You would have to get the list of features from the Cargo.toml and then compile using those

@rajarshimaitra

rajarshimaitra commented Feb 9, 2022

Copy link
Copy Markdown
ContributorAuthor

Retested

All looks good on this one to me.. Its good to go I think..

@notmandatory

Copy link
Copy Markdown
Member

This example LGTM but I'm going hold off merging it until #535 goes in so it can be refactored as needed first. Also removing from next milestone since we're already a bit behind and have some higher priority PRs to get in.

@xraid

Copy link
Copy Markdown

has this been massaged to accommodate new stuff in merged #535

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

has this been massaged to accommodate new stuff in merged #535

Good point, This will definitely have effect on the example. Will update it accordingly..

@notmandatory

Copy link
Copy Markdown
Member

I think this PR also needs a rebase to pick up the latest verify changes, in particular related to the CI Blockchain jobs.

@rajarshimaitra
rajarshimaitraforce-pushed the example-rpc-wallet branch 2 times, most recently from 14cb771 to a722c52CompareMarch 22, 2022 07:07
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed the example in light of #535 and rebased..

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried testing but got an error, do I need to do something else to run it?:

% cargo run --features keys-bip39,key-value-db,rpc --example rpcwallet
warning: field is never read: `network`
--> src/blockchain/rpc.rs:58:5
|
58 | network: Network,
| ^^^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `bdk` (lib) generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.07s
Running `target/debug/examples/rpcwallet`>> Setting up bitcoind
>> bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC
>> Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(Timeout)))

Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
This adds an example wallet creation code with sled DB and RPC
Blockchain.
The backend RPC is managed using electrsd::bitcoind
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @notmandatory for the review.. I fixed the nits.

I tried testing but got an error, do I need to do something else to run it?:

This seems very weird. Its not happening in my local. And it seems the error is originating from blockchain::rpc not the example. Thats even more odd. But I am not sure how to reproduce it.. Probably because of a different rustc version you are using??

@xraid

xraid commented Mar 27, 2022

Copy link
Copy Markdown

i get :

Setting up bitcoind
bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC

Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(SocketError(Os { code: 35, kind: WouldBlock, message: "Resource temporarily unavailable" }))))

when i swap out in file rpcwallet.rs to use :

use bdk::bitcoincore_rpc::{Auth as rpc_auth, Client, RpcApi};

with Client invocation dance => instead of using :

use electrsd;

the BDK wallet finds bitcoind and all is good ...

While running a local regtest bitcoind with correct auth ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @xraid for reporting.. I am still not being able to reproduce any of the issues. Its all working fine in my local as normal.

Did you mean you have to do the bitcoin core rpc setup manually instead of using electrsd crate and then it worked?

@xraid

xraid commented Mar 28, 2022

Copy link
Copy Markdown

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

i changed and used Client instead of the electrsd lines [50...75]

line 103 reuse bitcoind object for bdk-wallet that was used for core-wallet prior
let rpc_config = RpcConfig { url: bitcoind.params.rpc_socket.to_string(), auth: bitcoind_auth,

i am still to fresh in Rust and the BDK code base to make any sense in try debug,

so i leave it to You and meanwhile watch ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

2 similar comments
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@xraid

xraid commented Mar 29, 2022

Copy link
Copy Markdown

i run a local Nigiri regtest bitcoind electrum and used the bdk::bitcoincore_rpc::Client for core-wallet and for bdk-wallet i use :

bdk::blockchain::rpc::RpcBlockchain

where i added auth and url in config :

// Set RPC username and password
let auth = Auth::UserPass {
username: "admin1".to_string(),
password: "123".to_string()
};
// Set RPC url
let mut rpc_url = "http://".to_string();
rpc_url.push_str("127.0.0.1:18443");
// Create a RPC configuration of the running bitcoind backend we created in last step
// Note: If you are using custom regtest node, use the appropriate url and auth
let rpc_config = RpcConfig {
url: rpc_url, // bitcoind.params.rpc_socket.to_string(),
auth: auth, //bitcoind_auth,
network: Network::Regtest,
wallet_name,
skip_blocks: None,
};
// Use the above configuration to create a RPC blockchain backend
let blockchain = RpcBlockchain::from_config(&rpc_config)?;

so there is 2 diff connections to bitcoind rpc - one for core and one for bdk

Why the example with using the use electrsd; succeeds with first connect to core wallet and fails when trying to connect from initiated bdk wallet, i dont know ...

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tACK 8a98e69

I verified this runs on my Linux (ubuntu 20.04) box. I'm still getting an error on my macOS system, but I suspect it's something specific to the mac. I'd like to know what's blocking it on the mac but not a reason to hold up this PR.

@notmandatory
notmandatory merged commit ff6db18 into bitcoindevkit:masterMar 29, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@rajarshimaitra@ConorOkus@LLFourn@afilini@notmandatory@xraid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add wallet creation example using RPC - #519

Merged
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet
Mar 29, 2022
Merged

Add wallet creation example using RPC#519
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet

Conversation

@rajarshimaitra

Copy link
Copy Markdown
Contributor

Description

As mentioned in bitcoindevkit/bitcoindevkit.org#83 (comment) it would be helpful
to have wallet creation example code in the example directory.

This is an attempt to create the most simplistic bdk wallet with a RPC backend and demonstrate receiving, creating, signing
and broadcasting transaction.

The code is a refinement of the RPC tutorial https://bitcoindevkit.org/blog/bitcoin-core-rpc-demo/ with more elaborate doc comments.

Notes to the reviewers

To automate the background RPC process electrsd is used which is already a dev-dependency of bdk.

Checklists

All Submissions:

  • I've signed all my commits
  • I followed the contribution guidelines
  • I ran cargo fmt and cargo clippy before committing

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Apparently cargo test is trying to run the example which has some extra feature dependency and causing the test failure in CI.

I am not sure why thats not the case for other examples though (they also have special required deps).

@notmandatory@afilini am I missing something in the cargo configuration?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed build failure, all tests passing..

@ConorOkus

Copy link
Copy Markdown

Trying to run this locally at the moment, but failing. What command should I run? cargo run --example rpcwallet?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

@ConorOkus this should work cargo run --features="all-keys key-value-db rpc" --example rpcwallet.

@ConorOkus

Copy link
Copy Markdown

tACK

@LLFourn

Copy link
Copy Markdown
Collaborator

utACK does the example get run in the ci?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

utACK does the example get run in the ci?

I think currently it doesn't. But we can explicitly ask the CI to run examples I think. Haven't tried that out.

@afilini

Copy link
Copy Markdown
Member

I think it's ok if we just compile this example in the CI, I'm guessing what it does is already covered by specific unit tests

@ConorOkus

Copy link
Copy Markdown

I'm trying to do a similar thing in LDK here

@afilini

Copy link
Copy Markdown
Member

It's not as easy for BDK because different examples might require different features. So if you just compile them like you did, they will most likely fail.

You would have to get the list of features from the Cargo.toml and then compile using those

@rajarshimaitra

rajarshimaitra commented Feb 9, 2022

Copy link
Copy Markdown
ContributorAuthor

Retested

All looks good on this one to me.. Its good to go I think..

@notmandatory

Copy link
Copy Markdown
Member

This example LGTM but I'm going hold off merging it until #535 goes in so it can be refactored as needed first. Also removing from next milestone since we're already a bit behind and have some higher priority PRs to get in.

@xraid

Copy link
Copy Markdown

has this been massaged to accommodate new stuff in merged #535

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

has this been massaged to accommodate new stuff in merged #535

Good point, This will definitely have effect on the example. Will update it accordingly..

@notmandatory

Copy link
Copy Markdown
Member

I think this PR also needs a rebase to pick up the latest verify changes, in particular related to the CI Blockchain jobs.

@rajarshimaitra
rajarshimaitraforce-pushed the example-rpc-wallet branch 2 times, most recently from 14cb771 to a722c52CompareMarch 22, 2022 07:07
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed the example in light of #535 and rebased..

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried testing but got an error, do I need to do something else to run it?:

% cargo run --features keys-bip39,key-value-db,rpc --example rpcwallet
warning: field is never read: `network`
--> src/blockchain/rpc.rs:58:5
|
58 | network: Network,
| ^^^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `bdk` (lib) generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.07s
Running `target/debug/examples/rpcwallet`>> Setting up bitcoind
>> bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC
>> Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(Timeout)))

Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
This adds an example wallet creation code with sled DB and RPC
Blockchain.
The backend RPC is managed using electrsd::bitcoind
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @notmandatory for the review.. I fixed the nits.

I tried testing but got an error, do I need to do something else to run it?:

This seems very weird. Its not happening in my local. And it seems the error is originating from blockchain::rpc not the example. Thats even more odd. But I am not sure how to reproduce it.. Probably because of a different rustc version you are using??

@xraid

xraid commented Mar 27, 2022

Copy link
Copy Markdown

i get :

Setting up bitcoind
bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC

Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(SocketError(Os { code: 35, kind: WouldBlock, message: "Resource temporarily unavailable" }))))

when i swap out in file rpcwallet.rs to use :

use bdk::bitcoincore_rpc::{Auth as rpc_auth, Client, RpcApi};

with Client invocation dance => instead of using :

use electrsd;

the BDK wallet finds bitcoind and all is good ...

While running a local regtest bitcoind with correct auth ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @xraid for reporting.. I am still not being able to reproduce any of the issues. Its all working fine in my local as normal.

Did you mean you have to do the bitcoin core rpc setup manually instead of using electrsd crate and then it worked?

@xraid

xraid commented Mar 28, 2022

Copy link
Copy Markdown

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

i changed and used Client instead of the electrsd lines [50...75]

line 103 reuse bitcoind object for bdk-wallet that was used for core-wallet prior
let rpc_config = RpcConfig { url: bitcoind.params.rpc_socket.to_string(), auth: bitcoind_auth,

i am still to fresh in Rust and the BDK code base to make any sense in try debug,

so i leave it to You and meanwhile watch ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

2 similar comments
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@xraid

xraid commented Mar 29, 2022

Copy link
Copy Markdown

i run a local Nigiri regtest bitcoind electrum and used the bdk::bitcoincore_rpc::Client for core-wallet and for bdk-wallet i use :

bdk::blockchain::rpc::RpcBlockchain

where i added auth and url in config :

// Set RPC username and password
let auth = Auth::UserPass {
username: "admin1".to_string(),
password: "123".to_string()
};
// Set RPC url
let mut rpc_url = "http://".to_string();
rpc_url.push_str("127.0.0.1:18443");
// Create a RPC configuration of the running bitcoind backend we created in last step
// Note: If you are using custom regtest node, use the appropriate url and auth
let rpc_config = RpcConfig {
url: rpc_url, // bitcoind.params.rpc_socket.to_string(),
auth: auth, //bitcoind_auth,
network: Network::Regtest,
wallet_name,
skip_blocks: None,
};
// Use the above configuration to create a RPC blockchain backend
let blockchain = RpcBlockchain::from_config(&rpc_config)?;

so there is 2 diff connections to bitcoind rpc - one for core and one for bdk

Why the example with using the use electrsd; succeeds with first connect to core wallet and fails when trying to connect from initiated bdk wallet, i dont know ...

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tACK 8a98e69

I verified this runs on my Linux (ubuntu 20.04) box. I'm still getting an error on my macOS system, but I suspect it's something specific to the mac. I'd like to know what's blocking it on the mac but not a reason to hold up this PR.

@notmandatory
notmandatory merged commit ff6db18 into bitcoindevkit:masterMar 29, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@rajarshimaitra@ConorOkus@LLFourn@afilini@notmandatory@xraid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add wallet creation example using RPC - #519

Merged
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet
Mar 29, 2022
Merged

Add wallet creation example using RPC#519
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet

Conversation

@rajarshimaitra

Copy link
Copy Markdown
Contributor

Description

As mentioned in bitcoindevkit/bitcoindevkit.org#83 (comment) it would be helpful
to have wallet creation example code in the example directory.

This is an attempt to create the most simplistic bdk wallet with a RPC backend and demonstrate receiving, creating, signing
and broadcasting transaction.

The code is a refinement of the RPC tutorial https://bitcoindevkit.org/blog/bitcoin-core-rpc-demo/ with more elaborate doc comments.

Notes to the reviewers

To automate the background RPC process electrsd is used which is already a dev-dependency of bdk.

Checklists

All Submissions:

  • I've signed all my commits
  • I followed the contribution guidelines
  • I ran cargo fmt and cargo clippy before committing

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Apparently cargo test is trying to run the example which has some extra feature dependency and causing the test failure in CI.

I am not sure why thats not the case for other examples though (they also have special required deps).

@notmandatory@afilini am I missing something in the cargo configuration?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed build failure, all tests passing..

@ConorOkus

Copy link
Copy Markdown

Trying to run this locally at the moment, but failing. What command should I run? cargo run --example rpcwallet?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

@ConorOkus this should work cargo run --features="all-keys key-value-db rpc" --example rpcwallet.

@ConorOkus

Copy link
Copy Markdown

tACK

@LLFourn

Copy link
Copy Markdown
Collaborator

utACK does the example get run in the ci?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

utACK does the example get run in the ci?

I think currently it doesn't. But we can explicitly ask the CI to run examples I think. Haven't tried that out.

@afilini

Copy link
Copy Markdown
Member

I think it's ok if we just compile this example in the CI, I'm guessing what it does is already covered by specific unit tests

@ConorOkus

Copy link
Copy Markdown

I'm trying to do a similar thing in LDK here

@afilini

Copy link
Copy Markdown
Member

It's not as easy for BDK because different examples might require different features. So if you just compile them like you did, they will most likely fail.

You would have to get the list of features from the Cargo.toml and then compile using those

@rajarshimaitra

rajarshimaitra commented Feb 9, 2022

Copy link
Copy Markdown
ContributorAuthor

Retested

All looks good on this one to me.. Its good to go I think..

@notmandatory

Copy link
Copy Markdown
Member

This example LGTM but I'm going hold off merging it until #535 goes in so it can be refactored as needed first. Also removing from next milestone since we're already a bit behind and have some higher priority PRs to get in.

@xraid

Copy link
Copy Markdown

has this been massaged to accommodate new stuff in merged #535

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

has this been massaged to accommodate new stuff in merged #535

Good point, This will definitely have effect on the example. Will update it accordingly..

@notmandatory

Copy link
Copy Markdown
Member

I think this PR also needs a rebase to pick up the latest verify changes, in particular related to the CI Blockchain jobs.

@rajarshimaitra
rajarshimaitraforce-pushed the example-rpc-wallet branch 2 times, most recently from 14cb771 to a722c52CompareMarch 22, 2022 07:07
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed the example in light of #535 and rebased..

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried testing but got an error, do I need to do something else to run it?:

% cargo run --features keys-bip39,key-value-db,rpc --example rpcwallet
warning: field is never read: `network`
--> src/blockchain/rpc.rs:58:5
|
58 | network: Network,
| ^^^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `bdk` (lib) generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.07s
Running `target/debug/examples/rpcwallet`>> Setting up bitcoind
>> bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC
>> Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(Timeout)))

Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
This adds an example wallet creation code with sled DB and RPC
Blockchain.
The backend RPC is managed using electrsd::bitcoind
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @notmandatory for the review.. I fixed the nits.

I tried testing but got an error, do I need to do something else to run it?:

This seems very weird. Its not happening in my local. And it seems the error is originating from blockchain::rpc not the example. Thats even more odd. But I am not sure how to reproduce it.. Probably because of a different rustc version you are using??

@xraid

xraid commented Mar 27, 2022

Copy link
Copy Markdown

i get :

Setting up bitcoind
bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC

Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(SocketError(Os { code: 35, kind: WouldBlock, message: "Resource temporarily unavailable" }))))

when i swap out in file rpcwallet.rs to use :

use bdk::bitcoincore_rpc::{Auth as rpc_auth, Client, RpcApi};

with Client invocation dance => instead of using :

use electrsd;

the BDK wallet finds bitcoind and all is good ...

While running a local regtest bitcoind with correct auth ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @xraid for reporting.. I am still not being able to reproduce any of the issues. Its all working fine in my local as normal.

Did you mean you have to do the bitcoin core rpc setup manually instead of using electrsd crate and then it worked?

@xraid

xraid commented Mar 28, 2022

Copy link
Copy Markdown

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

i changed and used Client instead of the electrsd lines [50...75]

line 103 reuse bitcoind object for bdk-wallet that was used for core-wallet prior
let rpc_config = RpcConfig { url: bitcoind.params.rpc_socket.to_string(), auth: bitcoind_auth,

i am still to fresh in Rust and the BDK code base to make any sense in try debug,

so i leave it to You and meanwhile watch ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

2 similar comments
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@xraid

xraid commented Mar 29, 2022

Copy link
Copy Markdown

i run a local Nigiri regtest bitcoind electrum and used the bdk::bitcoincore_rpc::Client for core-wallet and for bdk-wallet i use :

bdk::blockchain::rpc::RpcBlockchain

where i added auth and url in config :

// Set RPC username and password
let auth = Auth::UserPass {
username: "admin1".to_string(),
password: "123".to_string()
};
// Set RPC url
let mut rpc_url = "http://".to_string();
rpc_url.push_str("127.0.0.1:18443");
// Create a RPC configuration of the running bitcoind backend we created in last step
// Note: If you are using custom regtest node, use the appropriate url and auth
let rpc_config = RpcConfig {
url: rpc_url, // bitcoind.params.rpc_socket.to_string(),
auth: auth, //bitcoind_auth,
network: Network::Regtest,
wallet_name,
skip_blocks: None,
};
// Use the above configuration to create a RPC blockchain backend
let blockchain = RpcBlockchain::from_config(&rpc_config)?;

so there is 2 diff connections to bitcoind rpc - one for core and one for bdk

Why the example with using the use electrsd; succeeds with first connect to core wallet and fails when trying to connect from initiated bdk wallet, i dont know ...

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tACK 8a98e69

I verified this runs on my Linux (ubuntu 20.04) box. I'm still getting an error on my macOS system, but I suspect it's something specific to the mac. I'd like to know what's blocking it on the mac but not a reason to hold up this PR.

@notmandatory
notmandatory merged commit ff6db18 into bitcoindevkit:masterMar 29, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@rajarshimaitra@ConorOkus@LLFourn@afilini@notmandatory@xraid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add wallet creation example using RPC - #519

Merged
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet
Mar 29, 2022
Merged

Add wallet creation example using RPC#519
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet

Conversation

@rajarshimaitra

Copy link
Copy Markdown
Contributor

Description

As mentioned in bitcoindevkit/bitcoindevkit.org#83 (comment) it would be helpful
to have wallet creation example code in the example directory.

This is an attempt to create the most simplistic bdk wallet with a RPC backend and demonstrate receiving, creating, signing
and broadcasting transaction.

The code is a refinement of the RPC tutorial https://bitcoindevkit.org/blog/bitcoin-core-rpc-demo/ with more elaborate doc comments.

Notes to the reviewers

To automate the background RPC process electrsd is used which is already a dev-dependency of bdk.

Checklists

All Submissions:

  • I've signed all my commits
  • I followed the contribution guidelines
  • I ran cargo fmt and cargo clippy before committing

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Apparently cargo test is trying to run the example which has some extra feature dependency and causing the test failure in CI.

I am not sure why thats not the case for other examples though (they also have special required deps).

@notmandatory@afilini am I missing something in the cargo configuration?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed build failure, all tests passing..

@ConorOkus

Copy link
Copy Markdown

Trying to run this locally at the moment, but failing. What command should I run? cargo run --example rpcwallet?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

@ConorOkus this should work cargo run --features="all-keys key-value-db rpc" --example rpcwallet.

@ConorOkus

Copy link
Copy Markdown

tACK

@LLFourn

Copy link
Copy Markdown
Collaborator

utACK does the example get run in the ci?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

utACK does the example get run in the ci?

I think currently it doesn't. But we can explicitly ask the CI to run examples I think. Haven't tried that out.

@afilini

Copy link
Copy Markdown
Member

I think it's ok if we just compile this example in the CI, I'm guessing what it does is already covered by specific unit tests

@ConorOkus

Copy link
Copy Markdown

I'm trying to do a similar thing in LDK here

@afilini

Copy link
Copy Markdown
Member

It's not as easy for BDK because different examples might require different features. So if you just compile them like you did, they will most likely fail.

You would have to get the list of features from the Cargo.toml and then compile using those

@rajarshimaitra

rajarshimaitra commented Feb 9, 2022

Copy link
Copy Markdown
ContributorAuthor

Retested

All looks good on this one to me.. Its good to go I think..

@notmandatory

Copy link
Copy Markdown
Member

This example LGTM but I'm going hold off merging it until #535 goes in so it can be refactored as needed first. Also removing from next milestone since we're already a bit behind and have some higher priority PRs to get in.

@xraid

Copy link
Copy Markdown

has this been massaged to accommodate new stuff in merged #535

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

has this been massaged to accommodate new stuff in merged #535

Good point, This will definitely have effect on the example. Will update it accordingly..

@notmandatory

Copy link
Copy Markdown
Member

I think this PR also needs a rebase to pick up the latest verify changes, in particular related to the CI Blockchain jobs.

@rajarshimaitra
rajarshimaitraforce-pushed the example-rpc-wallet branch 2 times, most recently from 14cb771 to a722c52CompareMarch 22, 2022 07:07
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed the example in light of #535 and rebased..

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried testing but got an error, do I need to do something else to run it?:

% cargo run --features keys-bip39,key-value-db,rpc --example rpcwallet
warning: field is never read: `network`
--> src/blockchain/rpc.rs:58:5
|
58 | network: Network,
| ^^^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `bdk` (lib) generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.07s
Running `target/debug/examples/rpcwallet`>> Setting up bitcoind
>> bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC
>> Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(Timeout)))

Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
This adds an example wallet creation code with sled DB and RPC
Blockchain.
The backend RPC is managed using electrsd::bitcoind
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @notmandatory for the review.. I fixed the nits.

I tried testing but got an error, do I need to do something else to run it?:

This seems very weird. Its not happening in my local. And it seems the error is originating from blockchain::rpc not the example. Thats even more odd. But I am not sure how to reproduce it.. Probably because of a different rustc version you are using??

@xraid

xraid commented Mar 27, 2022

Copy link
Copy Markdown

i get :

Setting up bitcoind
bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC

Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(SocketError(Os { code: 35, kind: WouldBlock, message: "Resource temporarily unavailable" }))))

when i swap out in file rpcwallet.rs to use :

use bdk::bitcoincore_rpc::{Auth as rpc_auth, Client, RpcApi};

with Client invocation dance => instead of using :

use electrsd;

the BDK wallet finds bitcoind and all is good ...

While running a local regtest bitcoind with correct auth ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @xraid for reporting.. I am still not being able to reproduce any of the issues. Its all working fine in my local as normal.

Did you mean you have to do the bitcoin core rpc setup manually instead of using electrsd crate and then it worked?

@xraid

xraid commented Mar 28, 2022

Copy link
Copy Markdown

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

i changed and used Client instead of the electrsd lines [50...75]

line 103 reuse bitcoind object for bdk-wallet that was used for core-wallet prior
let rpc_config = RpcConfig { url: bitcoind.params.rpc_socket.to_string(), auth: bitcoind_auth,

i am still to fresh in Rust and the BDK code base to make any sense in try debug,

so i leave it to You and meanwhile watch ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

2 similar comments
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@xraid

xraid commented Mar 29, 2022

Copy link
Copy Markdown

i run a local Nigiri regtest bitcoind electrum and used the bdk::bitcoincore_rpc::Client for core-wallet and for bdk-wallet i use :

bdk::blockchain::rpc::RpcBlockchain

where i added auth and url in config :

// Set RPC username and password
let auth = Auth::UserPass {
username: "admin1".to_string(),
password: "123".to_string()
};
// Set RPC url
let mut rpc_url = "http://".to_string();
rpc_url.push_str("127.0.0.1:18443");
// Create a RPC configuration of the running bitcoind backend we created in last step
// Note: If you are using custom regtest node, use the appropriate url and auth
let rpc_config = RpcConfig {
url: rpc_url, // bitcoind.params.rpc_socket.to_string(),
auth: auth, //bitcoind_auth,
network: Network::Regtest,
wallet_name,
skip_blocks: None,
};
// Use the above configuration to create a RPC blockchain backend
let blockchain = RpcBlockchain::from_config(&rpc_config)?;

so there is 2 diff connections to bitcoind rpc - one for core and one for bdk

Why the example with using the use electrsd; succeeds with first connect to core wallet and fails when trying to connect from initiated bdk wallet, i dont know ...

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tACK 8a98e69

I verified this runs on my Linux (ubuntu 20.04) box. I'm still getting an error on my macOS system, but I suspect it's something specific to the mac. I'd like to know what's blocking it on the mac but not a reason to hold up this PR.

@notmandatory
notmandatory merged commit ff6db18 into bitcoindevkit:masterMar 29, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@rajarshimaitra@ConorOkus@LLFourn@afilini@notmandatory@xraid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add wallet creation example using RPC - #519

Merged
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet
Mar 29, 2022
Merged

Add wallet creation example using RPC#519
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet

Conversation

@rajarshimaitra

Copy link
Copy Markdown
Contributor

Description

As mentioned in bitcoindevkit/bitcoindevkit.org#83 (comment) it would be helpful
to have wallet creation example code in the example directory.

This is an attempt to create the most simplistic bdk wallet with a RPC backend and demonstrate receiving, creating, signing
and broadcasting transaction.

The code is a refinement of the RPC tutorial https://bitcoindevkit.org/blog/bitcoin-core-rpc-demo/ with more elaborate doc comments.

Notes to the reviewers

To automate the background RPC process electrsd is used which is already a dev-dependency of bdk.

Checklists

All Submissions:

  • I've signed all my commits
  • I followed the contribution guidelines
  • I ran cargo fmt and cargo clippy before committing

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Apparently cargo test is trying to run the example which has some extra feature dependency and causing the test failure in CI.

I am not sure why thats not the case for other examples though (they also have special required deps).

@notmandatory@afilini am I missing something in the cargo configuration?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed build failure, all tests passing..

@ConorOkus

Copy link
Copy Markdown

Trying to run this locally at the moment, but failing. What command should I run? cargo run --example rpcwallet?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

@ConorOkus this should work cargo run --features="all-keys key-value-db rpc" --example rpcwallet.

@ConorOkus

Copy link
Copy Markdown

tACK

@LLFourn

Copy link
Copy Markdown
Collaborator

utACK does the example get run in the ci?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

utACK does the example get run in the ci?

I think currently it doesn't. But we can explicitly ask the CI to run examples I think. Haven't tried that out.

@afilini

Copy link
Copy Markdown
Member

I think it's ok if we just compile this example in the CI, I'm guessing what it does is already covered by specific unit tests

@ConorOkus

Copy link
Copy Markdown

I'm trying to do a similar thing in LDK here

@afilini

Copy link
Copy Markdown
Member

It's not as easy for BDK because different examples might require different features. So if you just compile them like you did, they will most likely fail.

You would have to get the list of features from the Cargo.toml and then compile using those

@rajarshimaitra

rajarshimaitra commented Feb 9, 2022

Copy link
Copy Markdown
ContributorAuthor

Retested

All looks good on this one to me.. Its good to go I think..

@notmandatory

Copy link
Copy Markdown
Member

This example LGTM but I'm going hold off merging it until #535 goes in so it can be refactored as needed first. Also removing from next milestone since we're already a bit behind and have some higher priority PRs to get in.

@xraid

Copy link
Copy Markdown

has this been massaged to accommodate new stuff in merged #535

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

has this been massaged to accommodate new stuff in merged #535

Good point, This will definitely have effect on the example. Will update it accordingly..

@notmandatory

Copy link
Copy Markdown
Member

I think this PR also needs a rebase to pick up the latest verify changes, in particular related to the CI Blockchain jobs.

@rajarshimaitra
rajarshimaitraforce-pushed the example-rpc-wallet branch 2 times, most recently from 14cb771 to a722c52CompareMarch 22, 2022 07:07
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed the example in light of #535 and rebased..

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried testing but got an error, do I need to do something else to run it?:

% cargo run --features keys-bip39,key-value-db,rpc --example rpcwallet
warning: field is never read: `network`
--> src/blockchain/rpc.rs:58:5
|
58 | network: Network,
| ^^^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `bdk` (lib) generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.07s
Running `target/debug/examples/rpcwallet`>> Setting up bitcoind
>> bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC
>> Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(Timeout)))

Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
This adds an example wallet creation code with sled DB and RPC
Blockchain.
The backend RPC is managed using electrsd::bitcoind
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @notmandatory for the review.. I fixed the nits.

I tried testing but got an error, do I need to do something else to run it?:

This seems very weird. Its not happening in my local. And it seems the error is originating from blockchain::rpc not the example. Thats even more odd. But I am not sure how to reproduce it.. Probably because of a different rustc version you are using??

@xraid

xraid commented Mar 27, 2022

Copy link
Copy Markdown

i get :

Setting up bitcoind
bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC

Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(SocketError(Os { code: 35, kind: WouldBlock, message: "Resource temporarily unavailable" }))))

when i swap out in file rpcwallet.rs to use :

use bdk::bitcoincore_rpc::{Auth as rpc_auth, Client, RpcApi};

with Client invocation dance => instead of using :

use electrsd;

the BDK wallet finds bitcoind and all is good ...

While running a local regtest bitcoind with correct auth ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @xraid for reporting.. I am still not being able to reproduce any of the issues. Its all working fine in my local as normal.

Did you mean you have to do the bitcoin core rpc setup manually instead of using electrsd crate and then it worked?

@xraid

xraid commented Mar 28, 2022

Copy link
Copy Markdown

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

i changed and used Client instead of the electrsd lines [50...75]

line 103 reuse bitcoind object for bdk-wallet that was used for core-wallet prior
let rpc_config = RpcConfig { url: bitcoind.params.rpc_socket.to_string(), auth: bitcoind_auth,

i am still to fresh in Rust and the BDK code base to make any sense in try debug,

so i leave it to You and meanwhile watch ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

2 similar comments
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@xraid

xraid commented Mar 29, 2022

Copy link
Copy Markdown

i run a local Nigiri regtest bitcoind electrum and used the bdk::bitcoincore_rpc::Client for core-wallet and for bdk-wallet i use :

bdk::blockchain::rpc::RpcBlockchain

where i added auth and url in config :

// Set RPC username and password
let auth = Auth::UserPass {
username: "admin1".to_string(),
password: "123".to_string()
};
// Set RPC url
let mut rpc_url = "http://".to_string();
rpc_url.push_str("127.0.0.1:18443");
// Create a RPC configuration of the running bitcoind backend we created in last step
// Note: If you are using custom regtest node, use the appropriate url and auth
let rpc_config = RpcConfig {
url: rpc_url, // bitcoind.params.rpc_socket.to_string(),
auth: auth, //bitcoind_auth,
network: Network::Regtest,
wallet_name,
skip_blocks: None,
};
// Use the above configuration to create a RPC blockchain backend
let blockchain = RpcBlockchain::from_config(&rpc_config)?;

so there is 2 diff connections to bitcoind rpc - one for core and one for bdk

Why the example with using the use electrsd; succeeds with first connect to core wallet and fails when trying to connect from initiated bdk wallet, i dont know ...

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tACK 8a98e69

I verified this runs on my Linux (ubuntu 20.04) box. I'm still getting an error on my macOS system, but I suspect it's something specific to the mac. I'd like to know what's blocking it on the mac but not a reason to hold up this PR.

@notmandatory
notmandatory merged commit ff6db18 into bitcoindevkit:masterMar 29, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@rajarshimaitra@ConorOkus@LLFourn@afilini@notmandatory@xraid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add wallet creation example using RPC - #519

Merged
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet
Mar 29, 2022
Merged

Add wallet creation example using RPC#519
notmandatory merged 1 commit into
bitcoindevkit:masterfrom
rajarshimaitra:example-rpc-wallet

Conversation

@rajarshimaitra

Copy link
Copy Markdown
Contributor

Description

As mentioned in bitcoindevkit/bitcoindevkit.org#83 (comment) it would be helpful
to have wallet creation example code in the example directory.

This is an attempt to create the most simplistic bdk wallet with a RPC backend and demonstrate receiving, creating, signing
and broadcasting transaction.

The code is a refinement of the RPC tutorial https://bitcoindevkit.org/blog/bitcoin-core-rpc-demo/ with more elaborate doc comments.

Notes to the reviewers

To automate the background RPC process electrsd is used which is already a dev-dependency of bdk.

Checklists

All Submissions:

  • I've signed all my commits
  • I followed the contribution guidelines
  • I ran cargo fmt and cargo clippy before committing

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Apparently cargo test is trying to run the example which has some extra feature dependency and causing the test failure in CI.

I am not sure why thats not the case for other examples though (they also have special required deps).

@notmandatory@afilini am I missing something in the cargo configuration?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed build failure, all tests passing..

@ConorOkus

Copy link
Copy Markdown

Trying to run this locally at the moment, but failing. What command should I run? cargo run --example rpcwallet?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

@ConorOkus this should work cargo run --features="all-keys key-value-db rpc" --example rpcwallet.

@ConorOkus

Copy link
Copy Markdown

tACK

@LLFourn

Copy link
Copy Markdown
Collaborator

utACK does the example get run in the ci?

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

utACK does the example get run in the ci?

I think currently it doesn't. But we can explicitly ask the CI to run examples I think. Haven't tried that out.

@afilini

Copy link
Copy Markdown
Member

I think it's ok if we just compile this example in the CI, I'm guessing what it does is already covered by specific unit tests

@ConorOkus

Copy link
Copy Markdown

I'm trying to do a similar thing in LDK here

@afilini

Copy link
Copy Markdown
Member

It's not as easy for BDK because different examples might require different features. So if you just compile them like you did, they will most likely fail.

You would have to get the list of features from the Cargo.toml and then compile using those

@rajarshimaitra

rajarshimaitra commented Feb 9, 2022

Copy link
Copy Markdown
ContributorAuthor

Retested

All looks good on this one to me.. Its good to go I think..

@notmandatory

Copy link
Copy Markdown
Member

This example LGTM but I'm going hold off merging it until #535 goes in so it can be refactored as needed first. Also removing from next milestone since we're already a bit behind and have some higher priority PRs to get in.

@xraid

Copy link
Copy Markdown

has this been massaged to accommodate new stuff in merged #535

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

has this been massaged to accommodate new stuff in merged #535

Good point, This will definitely have effect on the example. Will update it accordingly..

@notmandatory

Copy link
Copy Markdown
Member

I think this PR also needs a rebase to pick up the latest verify changes, in particular related to the CI Blockchain jobs.

@rajarshimaitra
rajarshimaitraforce-pushed the example-rpc-wallet branch 2 times, most recently from 14cb771 to a722c52CompareMarch 22, 2022 07:07
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Fixed the example in light of #535 and rebased..

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried testing but got an error, do I need to do something else to run it?:

% cargo run --features keys-bip39,key-value-db,rpc --example rpcwallet
warning: field is never read: `network`
--> src/blockchain/rpc.rs:58:5
|
58 | network: Network,
| ^^^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `bdk` (lib) generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.07s
Running `target/debug/examples/rpcwallet`>> Setting up bitcoind
>> bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC
>> Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(Timeout)))

Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
Comment threadexamples/rpcwallet.rs Outdated
This adds an example wallet creation code with sled DB and RPC
Blockchain.
The backend RPC is managed using electrsd::bitcoind
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @notmandatory for the review.. I fixed the nits.

I tried testing but got an error, do I need to do something else to run it?:

This seems very weird. Its not happening in my local. And it seems the error is originating from blockchain::rpc not the example. Thats even more odd. But I am not sure how to reproduce it.. Probably because of a different rustc version you are using??

@xraid

xraid commented Mar 27, 2022

Copy link
Copy Markdown

i get :

Setting up bitcoind
bitcoind setup complete
Available coins in Core wallet : 50.00000000 BTC

Setting up BDK wallet
Error: Rpc(JsonRpc(Transport(SocketError(Os { code: 35, kind: WouldBlock, message: "Resource temporarily unavailable" }))))

when i swap out in file rpcwallet.rs to use :

use bdk::bitcoincore_rpc::{Auth as rpc_auth, Client, RpcApi};

with Client invocation dance => instead of using :

use electrsd;

the BDK wallet finds bitcoind and all is good ...

While running a local regtest bitcoind with correct auth ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

Thanks @xraid for reporting.. I am still not being able to reproduce any of the issues. Its all working fine in my local as normal.

Did you mean you have to do the bitcoin core rpc setup manually instead of using electrsd crate and then it worked?

@xraid

xraid commented Mar 28, 2022

Copy link
Copy Markdown

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

i changed and used Client instead of the electrsd lines [50...75]

line 103 reuse bitcoind object for bdk-wallet that was used for core-wallet prior
let rpc_config = RpcConfig { url: bitcoind.params.rpc_socket.to_string(), auth: bitcoind_auth,

i am still to fresh in Rust and the BDK code base to make any sense in try debug,

so i leave it to You and meanwhile watch ...

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

2 similar comments
@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@rajarshimaitra

Copy link
Copy Markdown
ContributorAuthor

the err says it blocks ? @afilini mentioned something about sharing connections to backends - that might not be the issue here, maybe it is the bitcoin.cookie in auth for the bdk-wallet ?

This should not be an issue because elecrsd deploys a local bitcoind only for the code in concern, and deletes it once the example ends.. So there should be only one instance of bdk trying to connect with the temporary bitcoind.

i changed and used Client instead of the electrsd lines [50...75]

In that case did you manually deploy the regtest node in the background?

Ya I will keep digging to see if I can repro this..

@xraid

xraid commented Mar 29, 2022

Copy link
Copy Markdown

i run a local Nigiri regtest bitcoind electrum and used the bdk::bitcoincore_rpc::Client for core-wallet and for bdk-wallet i use :

bdk::blockchain::rpc::RpcBlockchain

where i added auth and url in config :

// Set RPC username and password
let auth = Auth::UserPass {
username: "admin1".to_string(),
password: "123".to_string()
};
// Set RPC url
let mut rpc_url = "http://".to_string();
rpc_url.push_str("127.0.0.1:18443");
// Create a RPC configuration of the running bitcoind backend we created in last step
// Note: If you are using custom regtest node, use the appropriate url and auth
let rpc_config = RpcConfig {
url: rpc_url, // bitcoind.params.rpc_socket.to_string(),
auth: auth, //bitcoind_auth,
network: Network::Regtest,
wallet_name,
skip_blocks: None,
};
// Use the above configuration to create a RPC blockchain backend
let blockchain = RpcBlockchain::from_config(&rpc_config)?;

so there is 2 diff connections to bitcoind rpc - one for core and one for bdk

Why the example with using the use electrsd; succeeds with first connect to core wallet and fails when trying to connect from initiated bdk wallet, i dont know ...

@notmandatorynotmandatory left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tACK 8a98e69

I verified this runs on my Linux (ubuntu 20.04) box. I'm still getting an error on my macOS system, but I suspect it's something specific to the mac. I'd like to know what's blocking it on the mac but not a reason to hold up this PR.

@notmandatory
notmandatory merged commit ff6db18 into bitcoindevkit:masterMar 29, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@rajarshimaitra@ConorOkus@LLFourn@afilini@notmandatory@xraid