Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0 - #652

Merged
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0
Jul 5, 2022
Merged

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0#652
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0

Conversation

@evanlinjin

Copy link
Copy Markdown
Member
  • Ensure chunk_size is > 0 during wallet sync.

  • Slight refactoring for better readability.

  • Add test: test_electrum_blockchain_factory_sync_with_stop_gaps

Description

Wallet::sync hangs indefinitely when syncing with Electrum with stop_gap set as 0.

The culprit is having chunk_size set as stop_gap. A zero value results in syncing not being able to progress.

Fixes#651

Checklists

All Submissions:

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

Bugfixes:

* [ ] This pull request breaks the existing API

  • I've added tests to reproduce the issue which are now passing
  • I'm linking the issue being fixed by this PR

@evanlinjinevanlinjin changed the title Fix hang when ElectrumBlockchainConfig::stop_gap == 0Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjinevanlinjin changed the title Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjin

This comment was marked as resolved.

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

Interesting bug. I'm not sure about the semantics of stop_gap = 0? Maybe the correct thing is to do nothing. If I am going to stop after I find a gap of 0 then I should just stop right away no? (you start off with a gap of 0).

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

ACK. See #652 (comment)

chunk_size was set wrongly before. Thanks!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 629604f to 475b005CompareJuly 4, 2022 06:46

@afiliniafilini 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.

Concept ACK, a couple of things:

  • did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code
  • once you are done fixing the various comments, could you squash the commits into the first one?

Comment threadsrc/blockchain/electrum.rs Outdated
Comment threadsrc/blockchain/electrum.rs Outdated
// [1] actual_gap: Range size of address indexes without a balance
// [2] addrs_before: Range size of address indexes (before gap) which contains a balance
// [3] addrs_after: Range size of address indexes (after gap) which contains a balance
let test_vectors: Vec<[u64; 4]> = vec![

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.

Wouldn't it be better to use usize here? I see that you have to cast these values in a few places

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It seems that if we do this, other variables will need casting... Should we leave it as is?

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.

Yeah at a quick glance I thought using usize would be fine, but if you need to cast anyway there's no reason to change it

@evanlinjin

evanlinjin commented Jul 4, 2022

Copy link
Copy Markdown
MemberAuthor

did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code

@afilini I've made a trait that can be reused for testing both esplora and electrum. I've also made it expandable, so in the future we can implement more tests in it. Let me know whether these changes make sense!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch 3 times, most recently from 924b320 to 35a49fdCompareJuly 4, 2022 13:45
* Ensure chunk_size is > 0 during wallet sync.
* Slight refactoring for better readability.
* Add test: test_electrum_blockchain_factory_sync_with_stop_gaps
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 35a49fd to 3533afaCompareJuly 4, 2022 13:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

once you are done fixing the various comments, could you squash the commits into the first one?

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

What do you think?

@evanlinjin
evanlinjin requested review from LLFourn and afiliniJuly 4, 2022 13:56
@notmandatorynotmandatory added the bug Something isn't working label Jul 4, 2022
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 3533afa to a884a63CompareJuly 4, 2022 23:43
This is a continuation of the bitcoindevkit#651 fix. We should also check whether the
same bug affects esplora as noted by @afilini. To achieve this, I've
introduced a `ConfigurableBlockchainTester` trait that can test multiple
blockchain implementations.
* Introduce `ConfigurableBlockchainTester` trait.
* Use the aforementioned trait to also test esplora.
* Change the electrum test to also use the new trait.
* Fix some complaints by clippy in ureq.rs file (why is CI not seeing
this?).
* Refactor some code.
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from a884a63 to 612da16CompareJuly 4, 2022 23:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

Ensuring that the Blockchain implementations respect the stop_gap parameter can potentially be important for avoiding address reuse.

The test I have included checks for this.

assert!(
wallet_balance >= min_balance,
"wallet balance is smaller than expected: {}",
details
);

@afilini

afilini commented Jul 5, 2022

Copy link
Copy Markdown
Member

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

Yeah two commits works for me, as long as they are self-contained (they should both compile and run cargo test with no errors) and they have a good commit message

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

I don't think this is as critical as that other one, but if this is ready in time yes, this is also important

@afiliniafilini 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.

@afilini
afilini merged commit 0e92820 into bitcoindevkit:masterJul 5, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Setting electrum client's stop_gap as 0 results in hang

4 participants

@evanlinjin@LLFourn@afilini@notmandatory
, '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

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0 - #652

Merged
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0
Jul 5, 2022
Merged

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0#652
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0

Conversation

@evanlinjin

Copy link
Copy Markdown
Member
  • Ensure chunk_size is > 0 during wallet sync.

  • Slight refactoring for better readability.

  • Add test: test_electrum_blockchain_factory_sync_with_stop_gaps

Description

Wallet::sync hangs indefinitely when syncing with Electrum with stop_gap set as 0.

The culprit is having chunk_size set as stop_gap. A zero value results in syncing not being able to progress.

Fixes#651

Checklists

All Submissions:

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

Bugfixes:

* [ ] This pull request breaks the existing API

  • I've added tests to reproduce the issue which are now passing
  • I'm linking the issue being fixed by this PR

@evanlinjinevanlinjin changed the title Fix hang when ElectrumBlockchainConfig::stop_gap == 0Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjinevanlinjin changed the title Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjin

This comment was marked as resolved.

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

Interesting bug. I'm not sure about the semantics of stop_gap = 0? Maybe the correct thing is to do nothing. If I am going to stop after I find a gap of 0 then I should just stop right away no? (you start off with a gap of 0).

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

ACK. See #652 (comment)

chunk_size was set wrongly before. Thanks!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 629604f to 475b005CompareJuly 4, 2022 06:46

@afiliniafilini 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.

Concept ACK, a couple of things:

  • did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code
  • once you are done fixing the various comments, could you squash the commits into the first one?

Comment threadsrc/blockchain/electrum.rs Outdated
Comment threadsrc/blockchain/electrum.rs Outdated
// [1] actual_gap: Range size of address indexes without a balance
// [2] addrs_before: Range size of address indexes (before gap) which contains a balance
// [3] addrs_after: Range size of address indexes (after gap) which contains a balance
let test_vectors: Vec<[u64; 4]> = vec![

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.

Wouldn't it be better to use usize here? I see that you have to cast these values in a few places

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It seems that if we do this, other variables will need casting... Should we leave it as is?

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.

Yeah at a quick glance I thought using usize would be fine, but if you need to cast anyway there's no reason to change it

@evanlinjin

evanlinjin commented Jul 4, 2022

Copy link
Copy Markdown
MemberAuthor

did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code

@afilini I've made a trait that can be reused for testing both esplora and electrum. I've also made it expandable, so in the future we can implement more tests in it. Let me know whether these changes make sense!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch 3 times, most recently from 924b320 to 35a49fdCompareJuly 4, 2022 13:45
* Ensure chunk_size is > 0 during wallet sync.
* Slight refactoring for better readability.
* Add test: test_electrum_blockchain_factory_sync_with_stop_gaps
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 35a49fd to 3533afaCompareJuly 4, 2022 13:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

once you are done fixing the various comments, could you squash the commits into the first one?

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

What do you think?

@evanlinjin
evanlinjin requested review from LLFourn and afiliniJuly 4, 2022 13:56
@notmandatorynotmandatory added the bug Something isn't working label Jul 4, 2022
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 3533afa to a884a63CompareJuly 4, 2022 23:43
This is a continuation of the bitcoindevkit#651 fix. We should also check whether the
same bug affects esplora as noted by @afilini. To achieve this, I've
introduced a `ConfigurableBlockchainTester` trait that can test multiple
blockchain implementations.
* Introduce `ConfigurableBlockchainTester` trait.
* Use the aforementioned trait to also test esplora.
* Change the electrum test to also use the new trait.
* Fix some complaints by clippy in ureq.rs file (why is CI not seeing
this?).
* Refactor some code.
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from a884a63 to 612da16CompareJuly 4, 2022 23:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

Ensuring that the Blockchain implementations respect the stop_gap parameter can potentially be important for avoiding address reuse.

The test I have included checks for this.

assert!(
wallet_balance >= min_balance,
"wallet balance is smaller than expected: {}",
details
);

@afilini

afilini commented Jul 5, 2022

Copy link
Copy Markdown
Member

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

Yeah two commits works for me, as long as they are self-contained (they should both compile and run cargo test with no errors) and they have a good commit message

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

I don't think this is as critical as that other one, but if this is ready in time yes, this is also important

@afiliniafilini 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.

@afilini
afilini merged commit 0e92820 into bitcoindevkit:masterJul 5, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Setting electrum client's stop_gap as 0 results in hang

4 participants

@evanlinjin@LLFourn@afilini@notmandatory
, '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

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0 - #652

Merged
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0
Jul 5, 2022
Merged

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0#652
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0

Conversation

@evanlinjin

Copy link
Copy Markdown
Member
  • Ensure chunk_size is > 0 during wallet sync.

  • Slight refactoring for better readability.

  • Add test: test_electrum_blockchain_factory_sync_with_stop_gaps

Description

Wallet::sync hangs indefinitely when syncing with Electrum with stop_gap set as 0.

The culprit is having chunk_size set as stop_gap. A zero value results in syncing not being able to progress.

Fixes#651

Checklists

All Submissions:

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

Bugfixes:

* [ ] This pull request breaks the existing API

  • I've added tests to reproduce the issue which are now passing
  • I'm linking the issue being fixed by this PR

@evanlinjinevanlinjin changed the title Fix hang when ElectrumBlockchainConfig::stop_gap == 0Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjinevanlinjin changed the title Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjin

This comment was marked as resolved.

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

Interesting bug. I'm not sure about the semantics of stop_gap = 0? Maybe the correct thing is to do nothing. If I am going to stop after I find a gap of 0 then I should just stop right away no? (you start off with a gap of 0).

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

ACK. See #652 (comment)

chunk_size was set wrongly before. Thanks!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 629604f to 475b005CompareJuly 4, 2022 06:46

@afiliniafilini 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.

Concept ACK, a couple of things:

  • did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code
  • once you are done fixing the various comments, could you squash the commits into the first one?

Comment threadsrc/blockchain/electrum.rs Outdated
Comment threadsrc/blockchain/electrum.rs Outdated
// [1] actual_gap: Range size of address indexes without a balance
// [2] addrs_before: Range size of address indexes (before gap) which contains a balance
// [3] addrs_after: Range size of address indexes (after gap) which contains a balance
let test_vectors: Vec<[u64; 4]> = vec![

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.

Wouldn't it be better to use usize here? I see that you have to cast these values in a few places

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It seems that if we do this, other variables will need casting... Should we leave it as is?

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.

Yeah at a quick glance I thought using usize would be fine, but if you need to cast anyway there's no reason to change it

@evanlinjin

evanlinjin commented Jul 4, 2022

Copy link
Copy Markdown
MemberAuthor

did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code

@afilini I've made a trait that can be reused for testing both esplora and electrum. I've also made it expandable, so in the future we can implement more tests in it. Let me know whether these changes make sense!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch 3 times, most recently from 924b320 to 35a49fdCompareJuly 4, 2022 13:45
* Ensure chunk_size is > 0 during wallet sync.
* Slight refactoring for better readability.
* Add test: test_electrum_blockchain_factory_sync_with_stop_gaps
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 35a49fd to 3533afaCompareJuly 4, 2022 13:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

once you are done fixing the various comments, could you squash the commits into the first one?

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

What do you think?

@evanlinjin
evanlinjin requested review from LLFourn and afiliniJuly 4, 2022 13:56
@notmandatorynotmandatory added the bug Something isn't working label Jul 4, 2022
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 3533afa to a884a63CompareJuly 4, 2022 23:43
This is a continuation of the bitcoindevkit#651 fix. We should also check whether the
same bug affects esplora as noted by @afilini. To achieve this, I've
introduced a `ConfigurableBlockchainTester` trait that can test multiple
blockchain implementations.
* Introduce `ConfigurableBlockchainTester` trait.
* Use the aforementioned trait to also test esplora.
* Change the electrum test to also use the new trait.
* Fix some complaints by clippy in ureq.rs file (why is CI not seeing
this?).
* Refactor some code.
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from a884a63 to 612da16CompareJuly 4, 2022 23:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

Ensuring that the Blockchain implementations respect the stop_gap parameter can potentially be important for avoiding address reuse.

The test I have included checks for this.

assert!(
wallet_balance >= min_balance,
"wallet balance is smaller than expected: {}",
details
);

@afilini

afilini commented Jul 5, 2022

Copy link
Copy Markdown
Member

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

Yeah two commits works for me, as long as they are self-contained (they should both compile and run cargo test with no errors) and they have a good commit message

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

I don't think this is as critical as that other one, but if this is ready in time yes, this is also important

@afiliniafilini 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.

@afilini
afilini merged commit 0e92820 into bitcoindevkit:masterJul 5, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Setting electrum client's stop_gap as 0 results in hang

4 participants

@evanlinjin@LLFourn@afilini@notmandatory
, '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

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0 - #652

Merged
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0
Jul 5, 2022
Merged

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0#652
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0

Conversation

@evanlinjin

Copy link
Copy Markdown
Member
  • Ensure chunk_size is > 0 during wallet sync.

  • Slight refactoring for better readability.

  • Add test: test_electrum_blockchain_factory_sync_with_stop_gaps

Description

Wallet::sync hangs indefinitely when syncing with Electrum with stop_gap set as 0.

The culprit is having chunk_size set as stop_gap. A zero value results in syncing not being able to progress.

Fixes#651

Checklists

All Submissions:

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

Bugfixes:

* [ ] This pull request breaks the existing API

  • I've added tests to reproduce the issue which are now passing
  • I'm linking the issue being fixed by this PR

@evanlinjinevanlinjin changed the title Fix hang when ElectrumBlockchainConfig::stop_gap == 0Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjinevanlinjin changed the title Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjin

This comment was marked as resolved.

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

Interesting bug. I'm not sure about the semantics of stop_gap = 0? Maybe the correct thing is to do nothing. If I am going to stop after I find a gap of 0 then I should just stop right away no? (you start off with a gap of 0).

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

ACK. See #652 (comment)

chunk_size was set wrongly before. Thanks!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 629604f to 475b005CompareJuly 4, 2022 06:46

@afiliniafilini 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.

Concept ACK, a couple of things:

  • did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code
  • once you are done fixing the various comments, could you squash the commits into the first one?

Comment threadsrc/blockchain/electrum.rs Outdated
Comment threadsrc/blockchain/electrum.rs Outdated
// [1] actual_gap: Range size of address indexes without a balance
// [2] addrs_before: Range size of address indexes (before gap) which contains a balance
// [3] addrs_after: Range size of address indexes (after gap) which contains a balance
let test_vectors: Vec<[u64; 4]> = vec![

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.

Wouldn't it be better to use usize here? I see that you have to cast these values in a few places

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It seems that if we do this, other variables will need casting... Should we leave it as is?

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.

Yeah at a quick glance I thought using usize would be fine, but if you need to cast anyway there's no reason to change it

@evanlinjin

evanlinjin commented Jul 4, 2022

Copy link
Copy Markdown
MemberAuthor

did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code

@afilini I've made a trait that can be reused for testing both esplora and electrum. I've also made it expandable, so in the future we can implement more tests in it. Let me know whether these changes make sense!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch 3 times, most recently from 924b320 to 35a49fdCompareJuly 4, 2022 13:45
* Ensure chunk_size is > 0 during wallet sync.
* Slight refactoring for better readability.
* Add test: test_electrum_blockchain_factory_sync_with_stop_gaps
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 35a49fd to 3533afaCompareJuly 4, 2022 13:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

once you are done fixing the various comments, could you squash the commits into the first one?

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

What do you think?

@evanlinjin
evanlinjin requested review from LLFourn and afiliniJuly 4, 2022 13:56
@notmandatorynotmandatory added the bug Something isn't working label Jul 4, 2022
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 3533afa to a884a63CompareJuly 4, 2022 23:43
This is a continuation of the bitcoindevkit#651 fix. We should also check whether the
same bug affects esplora as noted by @afilini. To achieve this, I've
introduced a `ConfigurableBlockchainTester` trait that can test multiple
blockchain implementations.
* Introduce `ConfigurableBlockchainTester` trait.
* Use the aforementioned trait to also test esplora.
* Change the electrum test to also use the new trait.
* Fix some complaints by clippy in ureq.rs file (why is CI not seeing
this?).
* Refactor some code.
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from a884a63 to 612da16CompareJuly 4, 2022 23:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

Ensuring that the Blockchain implementations respect the stop_gap parameter can potentially be important for avoiding address reuse.

The test I have included checks for this.

assert!(
wallet_balance >= min_balance,
"wallet balance is smaller than expected: {}",
details
);

@afilini

afilini commented Jul 5, 2022

Copy link
Copy Markdown
Member

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

Yeah two commits works for me, as long as they are self-contained (they should both compile and run cargo test with no errors) and they have a good commit message

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

I don't think this is as critical as that other one, but if this is ready in time yes, this is also important

@afiliniafilini 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.

@afilini
afilini merged commit 0e92820 into bitcoindevkit:masterJul 5, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Setting electrum client's stop_gap as 0 results in hang

4 participants

@evanlinjin@LLFourn@afilini@notmandatory
, '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

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0 - #652

Merged
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0
Jul 5, 2022
Merged

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0#652
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0

Conversation

@evanlinjin

Copy link
Copy Markdown
Member
  • Ensure chunk_size is > 0 during wallet sync.

  • Slight refactoring for better readability.

  • Add test: test_electrum_blockchain_factory_sync_with_stop_gaps

Description

Wallet::sync hangs indefinitely when syncing with Electrum with stop_gap set as 0.

The culprit is having chunk_size set as stop_gap. A zero value results in syncing not being able to progress.

Fixes#651

Checklists

All Submissions:

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

Bugfixes:

* [ ] This pull request breaks the existing API

  • I've added tests to reproduce the issue which are now passing
  • I'm linking the issue being fixed by this PR

@evanlinjinevanlinjin changed the title Fix hang when ElectrumBlockchainConfig::stop_gap == 0Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjinevanlinjin changed the title Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjin

This comment was marked as resolved.

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

Interesting bug. I'm not sure about the semantics of stop_gap = 0? Maybe the correct thing is to do nothing. If I am going to stop after I find a gap of 0 then I should just stop right away no? (you start off with a gap of 0).

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

ACK. See #652 (comment)

chunk_size was set wrongly before. Thanks!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 629604f to 475b005CompareJuly 4, 2022 06:46

@afiliniafilini 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.

Concept ACK, a couple of things:

  • did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code
  • once you are done fixing the various comments, could you squash the commits into the first one?

Comment threadsrc/blockchain/electrum.rs Outdated
Comment threadsrc/blockchain/electrum.rs Outdated
// [1] actual_gap: Range size of address indexes without a balance
// [2] addrs_before: Range size of address indexes (before gap) which contains a balance
// [3] addrs_after: Range size of address indexes (after gap) which contains a balance
let test_vectors: Vec<[u64; 4]> = vec![

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.

Wouldn't it be better to use usize here? I see that you have to cast these values in a few places

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It seems that if we do this, other variables will need casting... Should we leave it as is?

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.

Yeah at a quick glance I thought using usize would be fine, but if you need to cast anyway there's no reason to change it

@evanlinjin

evanlinjin commented Jul 4, 2022

Copy link
Copy Markdown
MemberAuthor

did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code

@afilini I've made a trait that can be reused for testing both esplora and electrum. I've also made it expandable, so in the future we can implement more tests in it. Let me know whether these changes make sense!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch 3 times, most recently from 924b320 to 35a49fdCompareJuly 4, 2022 13:45
* Ensure chunk_size is > 0 during wallet sync.
* Slight refactoring for better readability.
* Add test: test_electrum_blockchain_factory_sync_with_stop_gaps
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 35a49fd to 3533afaCompareJuly 4, 2022 13:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

once you are done fixing the various comments, could you squash the commits into the first one?

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

What do you think?

@evanlinjin
evanlinjin requested review from LLFourn and afiliniJuly 4, 2022 13:56
@notmandatorynotmandatory added the bug Something isn't working label Jul 4, 2022
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 3533afa to a884a63CompareJuly 4, 2022 23:43
This is a continuation of the bitcoindevkit#651 fix. We should also check whether the
same bug affects esplora as noted by @afilini. To achieve this, I've
introduced a `ConfigurableBlockchainTester` trait that can test multiple
blockchain implementations.
* Introduce `ConfigurableBlockchainTester` trait.
* Use the aforementioned trait to also test esplora.
* Change the electrum test to also use the new trait.
* Fix some complaints by clippy in ureq.rs file (why is CI not seeing
this?).
* Refactor some code.
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from a884a63 to 612da16CompareJuly 4, 2022 23:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

Ensuring that the Blockchain implementations respect the stop_gap parameter can potentially be important for avoiding address reuse.

The test I have included checks for this.

assert!(
wallet_balance >= min_balance,
"wallet balance is smaller than expected: {}",
details
);

@afilini

afilini commented Jul 5, 2022

Copy link
Copy Markdown
Member

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

Yeah two commits works for me, as long as they are self-contained (they should both compile and run cargo test with no errors) and they have a good commit message

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

I don't think this is as critical as that other one, but if this is ready in time yes, this is also important

@afiliniafilini 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.

@afilini
afilini merged commit 0e92820 into bitcoindevkit:masterJul 5, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Setting electrum client's stop_gap as 0 results in hang

4 participants

@evanlinjin@LLFourn@afilini@notmandatory
, '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

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0 - #652

Merged
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0
Jul 5, 2022
Merged

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0#652
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0

Conversation

@evanlinjin

Copy link
Copy Markdown
Member
  • Ensure chunk_size is > 0 during wallet sync.

  • Slight refactoring for better readability.

  • Add test: test_electrum_blockchain_factory_sync_with_stop_gaps

Description

Wallet::sync hangs indefinitely when syncing with Electrum with stop_gap set as 0.

The culprit is having chunk_size set as stop_gap. A zero value results in syncing not being able to progress.

Fixes#651

Checklists

All Submissions:

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

Bugfixes:

* [ ] This pull request breaks the existing API

  • I've added tests to reproduce the issue which are now passing
  • I'm linking the issue being fixed by this PR

@evanlinjinevanlinjin changed the title Fix hang when ElectrumBlockchainConfig::stop_gap == 0Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjinevanlinjin changed the title Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjin

This comment was marked as resolved.

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

Interesting bug. I'm not sure about the semantics of stop_gap = 0? Maybe the correct thing is to do nothing. If I am going to stop after I find a gap of 0 then I should just stop right away no? (you start off with a gap of 0).

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

ACK. See #652 (comment)

chunk_size was set wrongly before. Thanks!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 629604f to 475b005CompareJuly 4, 2022 06:46

@afiliniafilini 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.

Concept ACK, a couple of things:

  • did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code
  • once you are done fixing the various comments, could you squash the commits into the first one?

Comment threadsrc/blockchain/electrum.rs Outdated
Comment threadsrc/blockchain/electrum.rs Outdated
// [1] actual_gap: Range size of address indexes without a balance
// [2] addrs_before: Range size of address indexes (before gap) which contains a balance
// [3] addrs_after: Range size of address indexes (after gap) which contains a balance
let test_vectors: Vec<[u64; 4]> = vec![

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.

Wouldn't it be better to use usize here? I see that you have to cast these values in a few places

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It seems that if we do this, other variables will need casting... Should we leave it as is?

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.

Yeah at a quick glance I thought using usize would be fine, but if you need to cast anyway there's no reason to change it

@evanlinjin

evanlinjin commented Jul 4, 2022

Copy link
Copy Markdown
MemberAuthor

did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code

@afilini I've made a trait that can be reused for testing both esplora and electrum. I've also made it expandable, so in the future we can implement more tests in it. Let me know whether these changes make sense!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch 3 times, most recently from 924b320 to 35a49fdCompareJuly 4, 2022 13:45
* Ensure chunk_size is > 0 during wallet sync.
* Slight refactoring for better readability.
* Add test: test_electrum_blockchain_factory_sync_with_stop_gaps
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 35a49fd to 3533afaCompareJuly 4, 2022 13:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

once you are done fixing the various comments, could you squash the commits into the first one?

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

What do you think?

@evanlinjin
evanlinjin requested review from LLFourn and afiliniJuly 4, 2022 13:56
@notmandatorynotmandatory added the bug Something isn't working label Jul 4, 2022
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 3533afa to a884a63CompareJuly 4, 2022 23:43
This is a continuation of the bitcoindevkit#651 fix. We should also check whether the
same bug affects esplora as noted by @afilini. To achieve this, I've
introduced a `ConfigurableBlockchainTester` trait that can test multiple
blockchain implementations.
* Introduce `ConfigurableBlockchainTester` trait.
* Use the aforementioned trait to also test esplora.
* Change the electrum test to also use the new trait.
* Fix some complaints by clippy in ureq.rs file (why is CI not seeing
this?).
* Refactor some code.
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from a884a63 to 612da16CompareJuly 4, 2022 23:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

Ensuring that the Blockchain implementations respect the stop_gap parameter can potentially be important for avoiding address reuse.

The test I have included checks for this.

assert!(
wallet_balance >= min_balance,
"wallet balance is smaller than expected: {}",
details
);

@afilini

afilini commented Jul 5, 2022

Copy link
Copy Markdown
Member

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

Yeah two commits works for me, as long as they are self-contained (they should both compile and run cargo test with no errors) and they have a good commit message

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

I don't think this is as critical as that other one, but if this is ready in time yes, this is also important

@afiliniafilini 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.

@afilini
afilini merged commit 0e92820 into bitcoindevkit:masterJul 5, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Setting electrum client's stop_gap as 0 results in hang

4 participants

@evanlinjin@LLFourn@afilini@notmandatory
, '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

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0 - #652

Merged
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0
Jul 5, 2022
Merged

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0#652
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0

Conversation

@evanlinjin

Copy link
Copy Markdown
Member
  • Ensure chunk_size is > 0 during wallet sync.

  • Slight refactoring for better readability.

  • Add test: test_electrum_blockchain_factory_sync_with_stop_gaps

Description

Wallet::sync hangs indefinitely when syncing with Electrum with stop_gap set as 0.

The culprit is having chunk_size set as stop_gap. A zero value results in syncing not being able to progress.

Fixes#651

Checklists

All Submissions:

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

Bugfixes:

* [ ] This pull request breaks the existing API

  • I've added tests to reproduce the issue which are now passing
  • I'm linking the issue being fixed by this PR

@evanlinjinevanlinjin changed the title Fix hang when ElectrumBlockchainConfig::stop_gap == 0Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjinevanlinjin changed the title Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjin

This comment was marked as resolved.

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

Interesting bug. I'm not sure about the semantics of stop_gap = 0? Maybe the correct thing is to do nothing. If I am going to stop after I find a gap of 0 then I should just stop right away no? (you start off with a gap of 0).

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

ACK. See #652 (comment)

chunk_size was set wrongly before. Thanks!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 629604f to 475b005CompareJuly 4, 2022 06:46

@afiliniafilini 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.

Concept ACK, a couple of things:

  • did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code
  • once you are done fixing the various comments, could you squash the commits into the first one?

Comment threadsrc/blockchain/electrum.rs Outdated
Comment threadsrc/blockchain/electrum.rs Outdated
// [1] actual_gap: Range size of address indexes without a balance
// [2] addrs_before: Range size of address indexes (before gap) which contains a balance
// [3] addrs_after: Range size of address indexes (after gap) which contains a balance
let test_vectors: Vec<[u64; 4]> = vec![

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.

Wouldn't it be better to use usize here? I see that you have to cast these values in a few places

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It seems that if we do this, other variables will need casting... Should we leave it as is?

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.

Yeah at a quick glance I thought using usize would be fine, but if you need to cast anyway there's no reason to change it

@evanlinjin

evanlinjin commented Jul 4, 2022

Copy link
Copy Markdown
MemberAuthor

did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code

@afilini I've made a trait that can be reused for testing both esplora and electrum. I've also made it expandable, so in the future we can implement more tests in it. Let me know whether these changes make sense!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch 3 times, most recently from 924b320 to 35a49fdCompareJuly 4, 2022 13:45
* Ensure chunk_size is > 0 during wallet sync.
* Slight refactoring for better readability.
* Add test: test_electrum_blockchain_factory_sync_with_stop_gaps
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 35a49fd to 3533afaCompareJuly 4, 2022 13:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

once you are done fixing the various comments, could you squash the commits into the first one?

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

What do you think?

@evanlinjin
evanlinjin requested review from LLFourn and afiliniJuly 4, 2022 13:56
@notmandatorynotmandatory added the bug Something isn't working label Jul 4, 2022
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 3533afa to a884a63CompareJuly 4, 2022 23:43
This is a continuation of the bitcoindevkit#651 fix. We should also check whether the
same bug affects esplora as noted by @afilini. To achieve this, I've
introduced a `ConfigurableBlockchainTester` trait that can test multiple
blockchain implementations.
* Introduce `ConfigurableBlockchainTester` trait.
* Use the aforementioned trait to also test esplora.
* Change the electrum test to also use the new trait.
* Fix some complaints by clippy in ureq.rs file (why is CI not seeing
this?).
* Refactor some code.
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from a884a63 to 612da16CompareJuly 4, 2022 23:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

Ensuring that the Blockchain implementations respect the stop_gap parameter can potentially be important for avoiding address reuse.

The test I have included checks for this.

assert!(
wallet_balance >= min_balance,
"wallet balance is smaller than expected: {}",
details
);

@afilini

afilini commented Jul 5, 2022

Copy link
Copy Markdown
Member

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

Yeah two commits works for me, as long as they are self-contained (they should both compile and run cargo test with no errors) and they have a good commit message

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

I don't think this is as critical as that other one, but if this is ready in time yes, this is also important

@afiliniafilini 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.

@afilini
afilini merged commit 0e92820 into bitcoindevkit:masterJul 5, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Setting electrum client's stop_gap as 0 results in hang

4 participants

@evanlinjin@LLFourn@afilini@notmandatory
, '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

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0 - #652

Merged
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0
Jul 5, 2022
Merged

Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0#652
afilini merged 2 commits into
bitcoindevkit:masterfrom
evanlinjin:fix-electrum-stop-gap-0

Conversation

@evanlinjin

Copy link
Copy Markdown
Member
  • Ensure chunk_size is > 0 during wallet sync.

  • Slight refactoring for better readability.

  • Add test: test_electrum_blockchain_factory_sync_with_stop_gaps

Description

Wallet::sync hangs indefinitely when syncing with Electrum with stop_gap set as 0.

The culprit is having chunk_size set as stop_gap. A zero value results in syncing not being able to progress.

Fixes#651

Checklists

All Submissions:

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

Bugfixes:

* [ ] This pull request breaks the existing API

  • I've added tests to reproduce the issue which are now passing
  • I'm linking the issue being fixed by this PR

@evanlinjinevanlinjin changed the title Fix hang when ElectrumBlockchainConfig::stop_gap == 0Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjinevanlinjin changed the title Fix: hang when ElectrumBlockchainConfig::stop_gap == 0Fix: Hang when ElectrumBlockchainConfig::stop_gap == 0Jul 3, 2022
@evanlinjin

This comment was marked as resolved.

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

Interesting bug. I'm not sure about the semantics of stop_gap = 0? Maybe the correct thing is to do nothing. If I am going to stop after I find a gap of 0 then I should just stop right away no? (you start off with a gap of 0).

Comment threadsrc/blockchain/electrum.rs Outdated
@LLFourn

Copy link
Copy Markdown
Collaborator

ACK. See #652 (comment)

chunk_size was set wrongly before. Thanks!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 629604f to 475b005CompareJuly 4, 2022 06:46

@afiliniafilini 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.

Concept ACK, a couple of things:

  • did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code
  • once you are done fixing the various comments, could you squash the commits into the first one?

Comment threadsrc/blockchain/electrum.rs Outdated
Comment threadsrc/blockchain/electrum.rs Outdated
// [1] actual_gap: Range size of address indexes without a balance
// [2] addrs_before: Range size of address indexes (before gap) which contains a balance
// [3] addrs_after: Range size of address indexes (after gap) which contains a balance
let test_vectors: Vec<[u64; 4]> = vec![

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.

Wouldn't it be better to use usize here? I see that you have to cast these values in a few places

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It seems that if we do this, other variables will need casting... Should we leave it as is?

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.

Yeah at a quick glance I thought using usize would be fine, but if you need to cast anyway there's no reason to change it

@evanlinjin

evanlinjin commented Jul 4, 2022

Copy link
Copy Markdown
MemberAuthor

did you check if this happens with esplora as well? The two blockchains are very similar in terms of architecture and code

@afilini I've made a trait that can be reused for testing both esplora and electrum. I've also made it expandable, so in the future we can implement more tests in it. Let me know whether these changes make sense!

@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch 3 times, most recently from 924b320 to 35a49fdCompareJuly 4, 2022 13:45
* Ensure chunk_size is > 0 during wallet sync.
* Slight refactoring for better readability.
* Add test: test_electrum_blockchain_factory_sync_with_stop_gaps
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 35a49fd to 3533afaCompareJuly 4, 2022 13:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

once you are done fixing the various comments, could you squash the commits into the first one?

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

What do you think?

@evanlinjin
evanlinjin requested review from LLFourn and afiliniJuly 4, 2022 13:56
@notmandatorynotmandatory added the bug Something isn't working label Jul 4, 2022
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from 3533afa to a884a63CompareJuly 4, 2022 23:43
This is a continuation of the bitcoindevkit#651 fix. We should also check whether the
same bug affects esplora as noted by @afilini. To achieve this, I've
introduced a `ConfigurableBlockchainTester` trait that can test multiple
blockchain implementations.
* Introduce `ConfigurableBlockchainTester` trait.
* Use the aforementioned trait to also test esplora.
* Change the electrum test to also use the new trait.
* Fix some complaints by clippy in ureq.rs file (why is CI not seeing
this?).
* Refactor some code.
@evanlinjin
evanlinjinforce-pushed the fix-electrum-stop-gap-0 branch from a884a63 to 612da16CompareJuly 4, 2022 23:53
@evanlinjin

Copy link
Copy Markdown
MemberAuthor

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

Ensuring that the Blockchain implementations respect the stop_gap parameter can potentially be important for avoiding address reuse.

The test I have included checks for this.

assert!(
wallet_balance >= min_balance,
"wallet balance is smaller than expected: {}",
details
);

@afilini

afilini commented Jul 5, 2022

Copy link
Copy Markdown
Member

@afilini I feel like it's better to keep it to two commits. One if for the actual fix, the other is introducing a new testing trait that can be shared between different blockchain implementations.

Yeah two commits works for me, as long as they are self-contained (they should both compile and run cargo test with no errors) and they have a good commit message

@afilini Should this fix also be part of Release 0.20.0 Feature Freeze?

I don't think this is as critical as that other one, but if this is ready in time yes, this is also important

@afiliniafilini 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.

@afilini
afilini merged commit 0e92820 into bitcoindevkit:masterJul 5, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Setting electrum client's stop_gap as 0 results in hang

4 participants

@evanlinjin@LLFourn@afilini@notmandatory