slave node design - #148

Open
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave
Open

slave node design#148
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave

Conversation

@syntrust

Copy link
Copy Markdown
Collaborator

Comment threadL1/slave-node-bootstrap.md Outdated
Comment threadL1/slave-node-bootstrap.md
Comment threadL1/slave-node-bootstrap.md
facts geth's block format cannot hold yet:

```
GenesisMeta {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since the GenesisMeta record (prev-root-block hash, xshard cursor, full shard id) is a temporary scaffold that exists only because geth's stock header has no home for these fields yet, the implementation should mark it as such explicitly — not just note it in this design doc.

Concretely, when implementing:

  • Tag the GenesisMeta struct, its rawdb accessors, and the Reconcile() path with a grep-able marker, e.g. // TODO: temporary — remove once QKC block format lands; these fields move into the genesis block's header/meta and Reconcile() should compare the genesis block itself.
  • Make the marker say plainly that once the block issue merges, this code is re-implemented, not patched: the fields are read from the genesis block's header/meta, and Reconcile() switches to the geth-native genesis-hash check (SetupGenesisBlock-style). The GenesisMeta record is then deleted, not migrated — at that stage the db only holds the genesis block, so --clean re-bootstrap suffices and no migration code is needed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 9081a96

@syntrust
syntrust requested a review from qzhodlJune 23, 2026 06:51
Comment threadL1/slave-node-bootstrap.md Outdated

1. **Validation at load time.** `LoadClusterConfig` runs `Validate()` before any database
is opened: every full shard id in the resolved slave must resolve to a configured
chain/shard; no shard may be owned twice; `ShardGenesis.ROOT_HEIGHT` must equal

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Validate(): "no shard may be owned twice" needs clarification — as written it may be a bug.

pyquarkchain supports the same shard being run by multiple slaves as replicas: branch_to_slaves is typed Dict[int, List[SlaveConnection]] (master.py:775), built by appending (branch_to_slaves.setdefault(full_shard_id, []).append(slave), master.py:907), with the explicit comment "Slaves may run multiple copies of the same branch" (master.py:1124). Routing is replica-aware: writes (add_transaction) fan out to all replicas (master.py:1240-1241), reads / PoSW take the first (master.py:1050). So the same full shard id appearing in more than one slave's FULL_SHARD_ID_LIST is a valid multi-replica deployment.

If this check means cross-slave unique ownership (a shard may belong to only one slave), it would reject those legitimate configs and must be dropped. It also contradicts this issue's narrowed SlaveContext, which only holds the resolved slave and can't see the others — so a cross-slave check isn't even possible here.

This issue is single-slave bootstrap, so the only thing that's both meaningful and doable is: the resolved slave's own FULL_SHARD_ID_LIST must contain no duplicate entries. Suggest rewording to exactly that, and avoiding "owned" since it implies cross-slave ownership. Any global shard-coverage / replica-sanity validation belongs at the master layer and must allow replicas.

Worth confirming whether any current mainnet/testnet config actually uses multiple slaves per shard: if so, implementing this as "unique ownership" is a P0 (rejects a live config); even if not, hardcoding "one slave per shard" would block adding replicas later.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 2e7e79f

Comment threadL1/slave-node-bootstrap.md Outdated

Two reference implementations inform the design:

- **pyquarkchain** (`/Users/dl/code/pyquarkchain`) is the *compatibility source of

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This should be a GitHub URL, not a local path.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

Comment threadL1/slave-node-bootstrap.md Outdated
truth*. The slave must consume the exact `cluster_config.json` that the unmodified
Python master (`quarkchain/cluster/cluster.py`) writes when it launches slaves, and the
root genesis hash it derives must be byte-identical to pyquarkchain's.
- **goquarkchain** (`/Users/dl/code/goquarkchain`) is the *shape reference* for the Go

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Same as above.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

@syntrust
syntrust requested a review from iteyelmpJune 23, 2026 08:51
@syntrustsyntrust mentioned this pull request Jun 26, 2026
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.

4 participants

@syntrust@qzhodl@iteyelmp@blockchaindevsh
, '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

slave node design - #148

Open
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave
Open

slave node design#148
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave

Conversation

@syntrust

Copy link
Copy Markdown
Collaborator

Comment threadL1/slave-node-bootstrap.md Outdated
Comment threadL1/slave-node-bootstrap.md
Comment threadL1/slave-node-bootstrap.md
facts geth's block format cannot hold yet:

```
GenesisMeta {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since the GenesisMeta record (prev-root-block hash, xshard cursor, full shard id) is a temporary scaffold that exists only because geth's stock header has no home for these fields yet, the implementation should mark it as such explicitly — not just note it in this design doc.

Concretely, when implementing:

  • Tag the GenesisMeta struct, its rawdb accessors, and the Reconcile() path with a grep-able marker, e.g. // TODO: temporary — remove once QKC block format lands; these fields move into the genesis block's header/meta and Reconcile() should compare the genesis block itself.
  • Make the marker say plainly that once the block issue merges, this code is re-implemented, not patched: the fields are read from the genesis block's header/meta, and Reconcile() switches to the geth-native genesis-hash check (SetupGenesisBlock-style). The GenesisMeta record is then deleted, not migrated — at that stage the db only holds the genesis block, so --clean re-bootstrap suffices and no migration code is needed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 9081a96

@syntrust
syntrust requested a review from qzhodlJune 23, 2026 06:51
Comment threadL1/slave-node-bootstrap.md Outdated

1. **Validation at load time.** `LoadClusterConfig` runs `Validate()` before any database
is opened: every full shard id in the resolved slave must resolve to a configured
chain/shard; no shard may be owned twice; `ShardGenesis.ROOT_HEIGHT` must equal

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Validate(): "no shard may be owned twice" needs clarification — as written it may be a bug.

pyquarkchain supports the same shard being run by multiple slaves as replicas: branch_to_slaves is typed Dict[int, List[SlaveConnection]] (master.py:775), built by appending (branch_to_slaves.setdefault(full_shard_id, []).append(slave), master.py:907), with the explicit comment "Slaves may run multiple copies of the same branch" (master.py:1124). Routing is replica-aware: writes (add_transaction) fan out to all replicas (master.py:1240-1241), reads / PoSW take the first (master.py:1050). So the same full shard id appearing in more than one slave's FULL_SHARD_ID_LIST is a valid multi-replica deployment.

If this check means cross-slave unique ownership (a shard may belong to only one slave), it would reject those legitimate configs and must be dropped. It also contradicts this issue's narrowed SlaveContext, which only holds the resolved slave and can't see the others — so a cross-slave check isn't even possible here.

This issue is single-slave bootstrap, so the only thing that's both meaningful and doable is: the resolved slave's own FULL_SHARD_ID_LIST must contain no duplicate entries. Suggest rewording to exactly that, and avoiding "owned" since it implies cross-slave ownership. Any global shard-coverage / replica-sanity validation belongs at the master layer and must allow replicas.

Worth confirming whether any current mainnet/testnet config actually uses multiple slaves per shard: if so, implementing this as "unique ownership" is a P0 (rejects a live config); even if not, hardcoding "one slave per shard" would block adding replicas later.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 2e7e79f

Comment threadL1/slave-node-bootstrap.md Outdated

Two reference implementations inform the design:

- **pyquarkchain** (`/Users/dl/code/pyquarkchain`) is the *compatibility source of

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This should be a GitHub URL, not a local path.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

Comment threadL1/slave-node-bootstrap.md Outdated
truth*. The slave must consume the exact `cluster_config.json` that the unmodified
Python master (`quarkchain/cluster/cluster.py`) writes when it launches slaves, and the
root genesis hash it derives must be byte-identical to pyquarkchain's.
- **goquarkchain** (`/Users/dl/code/goquarkchain`) is the *shape reference* for the Go

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Same as above.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

@syntrust
syntrust requested a review from iteyelmpJune 23, 2026 08:51
@syntrustsyntrust mentioned this pull request Jun 26, 2026
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.

4 participants

@syntrust@qzhodl@iteyelmp@blockchaindevsh
, '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

slave node design - #148

Open
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave
Open

slave node design#148
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave

Conversation

@syntrust

Copy link
Copy Markdown
Collaborator

Comment threadL1/slave-node-bootstrap.md Outdated
Comment threadL1/slave-node-bootstrap.md
Comment threadL1/slave-node-bootstrap.md
facts geth's block format cannot hold yet:

```
GenesisMeta {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since the GenesisMeta record (prev-root-block hash, xshard cursor, full shard id) is a temporary scaffold that exists only because geth's stock header has no home for these fields yet, the implementation should mark it as such explicitly — not just note it in this design doc.

Concretely, when implementing:

  • Tag the GenesisMeta struct, its rawdb accessors, and the Reconcile() path with a grep-able marker, e.g. // TODO: temporary — remove once QKC block format lands; these fields move into the genesis block's header/meta and Reconcile() should compare the genesis block itself.
  • Make the marker say plainly that once the block issue merges, this code is re-implemented, not patched: the fields are read from the genesis block's header/meta, and Reconcile() switches to the geth-native genesis-hash check (SetupGenesisBlock-style). The GenesisMeta record is then deleted, not migrated — at that stage the db only holds the genesis block, so --clean re-bootstrap suffices and no migration code is needed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 9081a96

@syntrust
syntrust requested a review from qzhodlJune 23, 2026 06:51
Comment threadL1/slave-node-bootstrap.md Outdated

1. **Validation at load time.** `LoadClusterConfig` runs `Validate()` before any database
is opened: every full shard id in the resolved slave must resolve to a configured
chain/shard; no shard may be owned twice; `ShardGenesis.ROOT_HEIGHT` must equal

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Validate(): "no shard may be owned twice" needs clarification — as written it may be a bug.

pyquarkchain supports the same shard being run by multiple slaves as replicas: branch_to_slaves is typed Dict[int, List[SlaveConnection]] (master.py:775), built by appending (branch_to_slaves.setdefault(full_shard_id, []).append(slave), master.py:907), with the explicit comment "Slaves may run multiple copies of the same branch" (master.py:1124). Routing is replica-aware: writes (add_transaction) fan out to all replicas (master.py:1240-1241), reads / PoSW take the first (master.py:1050). So the same full shard id appearing in more than one slave's FULL_SHARD_ID_LIST is a valid multi-replica deployment.

If this check means cross-slave unique ownership (a shard may belong to only one slave), it would reject those legitimate configs and must be dropped. It also contradicts this issue's narrowed SlaveContext, which only holds the resolved slave and can't see the others — so a cross-slave check isn't even possible here.

This issue is single-slave bootstrap, so the only thing that's both meaningful and doable is: the resolved slave's own FULL_SHARD_ID_LIST must contain no duplicate entries. Suggest rewording to exactly that, and avoiding "owned" since it implies cross-slave ownership. Any global shard-coverage / replica-sanity validation belongs at the master layer and must allow replicas.

Worth confirming whether any current mainnet/testnet config actually uses multiple slaves per shard: if so, implementing this as "unique ownership" is a P0 (rejects a live config); even if not, hardcoding "one slave per shard" would block adding replicas later.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 2e7e79f

Comment threadL1/slave-node-bootstrap.md Outdated

Two reference implementations inform the design:

- **pyquarkchain** (`/Users/dl/code/pyquarkchain`) is the *compatibility source of

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This should be a GitHub URL, not a local path.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

Comment threadL1/slave-node-bootstrap.md Outdated
truth*. The slave must consume the exact `cluster_config.json` that the unmodified
Python master (`quarkchain/cluster/cluster.py`) writes when it launches slaves, and the
root genesis hash it derives must be byte-identical to pyquarkchain's.
- **goquarkchain** (`/Users/dl/code/goquarkchain`) is the *shape reference* for the Go

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Same as above.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

@syntrust
syntrust requested a review from iteyelmpJune 23, 2026 08:51
@syntrustsyntrust mentioned this pull request Jun 26, 2026
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.

4 participants

@syntrust@qzhodl@iteyelmp@blockchaindevsh
, '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

slave node design - #148

Open
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave
Open

slave node design#148
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave

Conversation

@syntrust

Copy link
Copy Markdown
Collaborator

Comment threadL1/slave-node-bootstrap.md Outdated
Comment threadL1/slave-node-bootstrap.md
Comment threadL1/slave-node-bootstrap.md
facts geth's block format cannot hold yet:

```
GenesisMeta {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since the GenesisMeta record (prev-root-block hash, xshard cursor, full shard id) is a temporary scaffold that exists only because geth's stock header has no home for these fields yet, the implementation should mark it as such explicitly — not just note it in this design doc.

Concretely, when implementing:

  • Tag the GenesisMeta struct, its rawdb accessors, and the Reconcile() path with a grep-able marker, e.g. // TODO: temporary — remove once QKC block format lands; these fields move into the genesis block's header/meta and Reconcile() should compare the genesis block itself.
  • Make the marker say plainly that once the block issue merges, this code is re-implemented, not patched: the fields are read from the genesis block's header/meta, and Reconcile() switches to the geth-native genesis-hash check (SetupGenesisBlock-style). The GenesisMeta record is then deleted, not migrated — at that stage the db only holds the genesis block, so --clean re-bootstrap suffices and no migration code is needed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 9081a96

@syntrust
syntrust requested a review from qzhodlJune 23, 2026 06:51
Comment threadL1/slave-node-bootstrap.md Outdated

1. **Validation at load time.** `LoadClusterConfig` runs `Validate()` before any database
is opened: every full shard id in the resolved slave must resolve to a configured
chain/shard; no shard may be owned twice; `ShardGenesis.ROOT_HEIGHT` must equal

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Validate(): "no shard may be owned twice" needs clarification — as written it may be a bug.

pyquarkchain supports the same shard being run by multiple slaves as replicas: branch_to_slaves is typed Dict[int, List[SlaveConnection]] (master.py:775), built by appending (branch_to_slaves.setdefault(full_shard_id, []).append(slave), master.py:907), with the explicit comment "Slaves may run multiple copies of the same branch" (master.py:1124). Routing is replica-aware: writes (add_transaction) fan out to all replicas (master.py:1240-1241), reads / PoSW take the first (master.py:1050). So the same full shard id appearing in more than one slave's FULL_SHARD_ID_LIST is a valid multi-replica deployment.

If this check means cross-slave unique ownership (a shard may belong to only one slave), it would reject those legitimate configs and must be dropped. It also contradicts this issue's narrowed SlaveContext, which only holds the resolved slave and can't see the others — so a cross-slave check isn't even possible here.

This issue is single-slave bootstrap, so the only thing that's both meaningful and doable is: the resolved slave's own FULL_SHARD_ID_LIST must contain no duplicate entries. Suggest rewording to exactly that, and avoiding "owned" since it implies cross-slave ownership. Any global shard-coverage / replica-sanity validation belongs at the master layer and must allow replicas.

Worth confirming whether any current mainnet/testnet config actually uses multiple slaves per shard: if so, implementing this as "unique ownership" is a P0 (rejects a live config); even if not, hardcoding "one slave per shard" would block adding replicas later.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 2e7e79f

Comment threadL1/slave-node-bootstrap.md Outdated

Two reference implementations inform the design:

- **pyquarkchain** (`/Users/dl/code/pyquarkchain`) is the *compatibility source of

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This should be a GitHub URL, not a local path.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

Comment threadL1/slave-node-bootstrap.md Outdated
truth*. The slave must consume the exact `cluster_config.json` that the unmodified
Python master (`quarkchain/cluster/cluster.py`) writes when it launches slaves, and the
root genesis hash it derives must be byte-identical to pyquarkchain's.
- **goquarkchain** (`/Users/dl/code/goquarkchain`) is the *shape reference* for the Go

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Same as above.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

@syntrust
syntrust requested a review from iteyelmpJune 23, 2026 08:51
@syntrustsyntrust mentioned this pull request Jun 26, 2026
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.

4 participants

@syntrust@qzhodl@iteyelmp@blockchaindevsh
, '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

slave node design - #148

Open
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave
Open

slave node design#148
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave

Conversation

@syntrust

Copy link
Copy Markdown
Collaborator

Comment threadL1/slave-node-bootstrap.md Outdated
Comment threadL1/slave-node-bootstrap.md
Comment threadL1/slave-node-bootstrap.md
facts geth's block format cannot hold yet:

```
GenesisMeta {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since the GenesisMeta record (prev-root-block hash, xshard cursor, full shard id) is a temporary scaffold that exists only because geth's stock header has no home for these fields yet, the implementation should mark it as such explicitly — not just note it in this design doc.

Concretely, when implementing:

  • Tag the GenesisMeta struct, its rawdb accessors, and the Reconcile() path with a grep-able marker, e.g. // TODO: temporary — remove once QKC block format lands; these fields move into the genesis block's header/meta and Reconcile() should compare the genesis block itself.
  • Make the marker say plainly that once the block issue merges, this code is re-implemented, not patched: the fields are read from the genesis block's header/meta, and Reconcile() switches to the geth-native genesis-hash check (SetupGenesisBlock-style). The GenesisMeta record is then deleted, not migrated — at that stage the db only holds the genesis block, so --clean re-bootstrap suffices and no migration code is needed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 9081a96

@syntrust
syntrust requested a review from qzhodlJune 23, 2026 06:51
Comment threadL1/slave-node-bootstrap.md Outdated

1. **Validation at load time.** `LoadClusterConfig` runs `Validate()` before any database
is opened: every full shard id in the resolved slave must resolve to a configured
chain/shard; no shard may be owned twice; `ShardGenesis.ROOT_HEIGHT` must equal

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Validate(): "no shard may be owned twice" needs clarification — as written it may be a bug.

pyquarkchain supports the same shard being run by multiple slaves as replicas: branch_to_slaves is typed Dict[int, List[SlaveConnection]] (master.py:775), built by appending (branch_to_slaves.setdefault(full_shard_id, []).append(slave), master.py:907), with the explicit comment "Slaves may run multiple copies of the same branch" (master.py:1124). Routing is replica-aware: writes (add_transaction) fan out to all replicas (master.py:1240-1241), reads / PoSW take the first (master.py:1050). So the same full shard id appearing in more than one slave's FULL_SHARD_ID_LIST is a valid multi-replica deployment.

If this check means cross-slave unique ownership (a shard may belong to only one slave), it would reject those legitimate configs and must be dropped. It also contradicts this issue's narrowed SlaveContext, which only holds the resolved slave and can't see the others — so a cross-slave check isn't even possible here.

This issue is single-slave bootstrap, so the only thing that's both meaningful and doable is: the resolved slave's own FULL_SHARD_ID_LIST must contain no duplicate entries. Suggest rewording to exactly that, and avoiding "owned" since it implies cross-slave ownership. Any global shard-coverage / replica-sanity validation belongs at the master layer and must allow replicas.

Worth confirming whether any current mainnet/testnet config actually uses multiple slaves per shard: if so, implementing this as "unique ownership" is a P0 (rejects a live config); even if not, hardcoding "one slave per shard" would block adding replicas later.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 2e7e79f

Comment threadL1/slave-node-bootstrap.md Outdated

Two reference implementations inform the design:

- **pyquarkchain** (`/Users/dl/code/pyquarkchain`) is the *compatibility source of

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This should be a GitHub URL, not a local path.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

Comment threadL1/slave-node-bootstrap.md Outdated
truth*. The slave must consume the exact `cluster_config.json` that the unmodified
Python master (`quarkchain/cluster/cluster.py`) writes when it launches slaves, and the
root genesis hash it derives must be byte-identical to pyquarkchain's.
- **goquarkchain** (`/Users/dl/code/goquarkchain`) is the *shape reference* for the Go

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Same as above.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

@syntrust
syntrust requested a review from iteyelmpJune 23, 2026 08:51
@syntrustsyntrust mentioned this pull request Jun 26, 2026
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.

4 participants

@syntrust@qzhodl@iteyelmp@blockchaindevsh
, '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

slave node design - #148

Open
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave
Open

slave node design#148
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave

Conversation

@syntrust

Copy link
Copy Markdown
Collaborator

Comment threadL1/slave-node-bootstrap.md Outdated
Comment threadL1/slave-node-bootstrap.md
Comment threadL1/slave-node-bootstrap.md
facts geth's block format cannot hold yet:

```
GenesisMeta {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since the GenesisMeta record (prev-root-block hash, xshard cursor, full shard id) is a temporary scaffold that exists only because geth's stock header has no home for these fields yet, the implementation should mark it as such explicitly — not just note it in this design doc.

Concretely, when implementing:

  • Tag the GenesisMeta struct, its rawdb accessors, and the Reconcile() path with a grep-able marker, e.g. // TODO: temporary — remove once QKC block format lands; these fields move into the genesis block's header/meta and Reconcile() should compare the genesis block itself.
  • Make the marker say plainly that once the block issue merges, this code is re-implemented, not patched: the fields are read from the genesis block's header/meta, and Reconcile() switches to the geth-native genesis-hash check (SetupGenesisBlock-style). The GenesisMeta record is then deleted, not migrated — at that stage the db only holds the genesis block, so --clean re-bootstrap suffices and no migration code is needed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 9081a96

@syntrust
syntrust requested a review from qzhodlJune 23, 2026 06:51
Comment threadL1/slave-node-bootstrap.md Outdated

1. **Validation at load time.** `LoadClusterConfig` runs `Validate()` before any database
is opened: every full shard id in the resolved slave must resolve to a configured
chain/shard; no shard may be owned twice; `ShardGenesis.ROOT_HEIGHT` must equal

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Validate(): "no shard may be owned twice" needs clarification — as written it may be a bug.

pyquarkchain supports the same shard being run by multiple slaves as replicas: branch_to_slaves is typed Dict[int, List[SlaveConnection]] (master.py:775), built by appending (branch_to_slaves.setdefault(full_shard_id, []).append(slave), master.py:907), with the explicit comment "Slaves may run multiple copies of the same branch" (master.py:1124). Routing is replica-aware: writes (add_transaction) fan out to all replicas (master.py:1240-1241), reads / PoSW take the first (master.py:1050). So the same full shard id appearing in more than one slave's FULL_SHARD_ID_LIST is a valid multi-replica deployment.

If this check means cross-slave unique ownership (a shard may belong to only one slave), it would reject those legitimate configs and must be dropped. It also contradicts this issue's narrowed SlaveContext, which only holds the resolved slave and can't see the others — so a cross-slave check isn't even possible here.

This issue is single-slave bootstrap, so the only thing that's both meaningful and doable is: the resolved slave's own FULL_SHARD_ID_LIST must contain no duplicate entries. Suggest rewording to exactly that, and avoiding "owned" since it implies cross-slave ownership. Any global shard-coverage / replica-sanity validation belongs at the master layer and must allow replicas.

Worth confirming whether any current mainnet/testnet config actually uses multiple slaves per shard: if so, implementing this as "unique ownership" is a P0 (rejects a live config); even if not, hardcoding "one slave per shard" would block adding replicas later.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 2e7e79f

Comment threadL1/slave-node-bootstrap.md Outdated

Two reference implementations inform the design:

- **pyquarkchain** (`/Users/dl/code/pyquarkchain`) is the *compatibility source of

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This should be a GitHub URL, not a local path.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

Comment threadL1/slave-node-bootstrap.md Outdated
truth*. The slave must consume the exact `cluster_config.json` that the unmodified
Python master (`quarkchain/cluster/cluster.py`) writes when it launches slaves, and the
root genesis hash it derives must be byte-identical to pyquarkchain's.
- **goquarkchain** (`/Users/dl/code/goquarkchain`) is the *shape reference* for the Go

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Same as above.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

@syntrust
syntrust requested a review from iteyelmpJune 23, 2026 08:51
@syntrustsyntrust mentioned this pull request Jun 26, 2026
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.

4 participants

@syntrust@qzhodl@iteyelmp@blockchaindevsh
, '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

slave node design - #148

Open
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave
Open

slave node design#148
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave

Conversation

@syntrust

Copy link
Copy Markdown
Collaborator

Comment threadL1/slave-node-bootstrap.md Outdated
Comment threadL1/slave-node-bootstrap.md
Comment threadL1/slave-node-bootstrap.md
facts geth's block format cannot hold yet:

```
GenesisMeta {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since the GenesisMeta record (prev-root-block hash, xshard cursor, full shard id) is a temporary scaffold that exists only because geth's stock header has no home for these fields yet, the implementation should mark it as such explicitly — not just note it in this design doc.

Concretely, when implementing:

  • Tag the GenesisMeta struct, its rawdb accessors, and the Reconcile() path with a grep-able marker, e.g. // TODO: temporary — remove once QKC block format lands; these fields move into the genesis block's header/meta and Reconcile() should compare the genesis block itself.
  • Make the marker say plainly that once the block issue merges, this code is re-implemented, not patched: the fields are read from the genesis block's header/meta, and Reconcile() switches to the geth-native genesis-hash check (SetupGenesisBlock-style). The GenesisMeta record is then deleted, not migrated — at that stage the db only holds the genesis block, so --clean re-bootstrap suffices and no migration code is needed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 9081a96

@syntrust
syntrust requested a review from qzhodlJune 23, 2026 06:51
Comment threadL1/slave-node-bootstrap.md Outdated

1. **Validation at load time.** `LoadClusterConfig` runs `Validate()` before any database
is opened: every full shard id in the resolved slave must resolve to a configured
chain/shard; no shard may be owned twice; `ShardGenesis.ROOT_HEIGHT` must equal

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Validate(): "no shard may be owned twice" needs clarification — as written it may be a bug.

pyquarkchain supports the same shard being run by multiple slaves as replicas: branch_to_slaves is typed Dict[int, List[SlaveConnection]] (master.py:775), built by appending (branch_to_slaves.setdefault(full_shard_id, []).append(slave), master.py:907), with the explicit comment "Slaves may run multiple copies of the same branch" (master.py:1124). Routing is replica-aware: writes (add_transaction) fan out to all replicas (master.py:1240-1241), reads / PoSW take the first (master.py:1050). So the same full shard id appearing in more than one slave's FULL_SHARD_ID_LIST is a valid multi-replica deployment.

If this check means cross-slave unique ownership (a shard may belong to only one slave), it would reject those legitimate configs and must be dropped. It also contradicts this issue's narrowed SlaveContext, which only holds the resolved slave and can't see the others — so a cross-slave check isn't even possible here.

This issue is single-slave bootstrap, so the only thing that's both meaningful and doable is: the resolved slave's own FULL_SHARD_ID_LIST must contain no duplicate entries. Suggest rewording to exactly that, and avoiding "owned" since it implies cross-slave ownership. Any global shard-coverage / replica-sanity validation belongs at the master layer and must allow replicas.

Worth confirming whether any current mainnet/testnet config actually uses multiple slaves per shard: if so, implementing this as "unique ownership" is a P0 (rejects a live config); even if not, hardcoding "one slave per shard" would block adding replicas later.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 2e7e79f

Comment threadL1/slave-node-bootstrap.md Outdated

Two reference implementations inform the design:

- **pyquarkchain** (`/Users/dl/code/pyquarkchain`) is the *compatibility source of

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This should be a GitHub URL, not a local path.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

Comment threadL1/slave-node-bootstrap.md Outdated
truth*. The slave must consume the exact `cluster_config.json` that the unmodified
Python master (`quarkchain/cluster/cluster.py`) writes when it launches slaves, and the
root genesis hash it derives must be byte-identical to pyquarkchain's.
- **goquarkchain** (`/Users/dl/code/goquarkchain`) is the *shape reference* for the Go

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Same as above.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

@syntrust
syntrust requested a review from iteyelmpJune 23, 2026 08:51
@syntrustsyntrust mentioned this pull request Jun 26, 2026
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.

4 participants

@syntrust@qzhodl@iteyelmp@blockchaindevsh
, '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

slave node design - #148

Open
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave
Open

slave node design#148
syntrust wants to merge 6 commits into
mainfrom
dl-goshard-slave

Conversation

@syntrust

Copy link
Copy Markdown
Collaborator

Comment threadL1/slave-node-bootstrap.md Outdated
Comment threadL1/slave-node-bootstrap.md
Comment threadL1/slave-node-bootstrap.md
facts geth's block format cannot hold yet:

```
GenesisMeta {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since the GenesisMeta record (prev-root-block hash, xshard cursor, full shard id) is a temporary scaffold that exists only because geth's stock header has no home for these fields yet, the implementation should mark it as such explicitly — not just note it in this design doc.

Concretely, when implementing:

  • Tag the GenesisMeta struct, its rawdb accessors, and the Reconcile() path with a grep-able marker, e.g. // TODO: temporary — remove once QKC block format lands; these fields move into the genesis block's header/meta and Reconcile() should compare the genesis block itself.
  • Make the marker say plainly that once the block issue merges, this code is re-implemented, not patched: the fields are read from the genesis block's header/meta, and Reconcile() switches to the geth-native genesis-hash check (SetupGenesisBlock-style). The GenesisMeta record is then deleted, not migrated — at that stage the db only holds the genesis block, so --clean re-bootstrap suffices and no migration code is needed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 9081a96

@syntrust
syntrust requested a review from qzhodlJune 23, 2026 06:51
Comment threadL1/slave-node-bootstrap.md Outdated

1. **Validation at load time.** `LoadClusterConfig` runs `Validate()` before any database
is opened: every full shard id in the resolved slave must resolve to a configured
chain/shard; no shard may be owned twice; `ShardGenesis.ROOT_HEIGHT` must equal

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Validate(): "no shard may be owned twice" needs clarification — as written it may be a bug.

pyquarkchain supports the same shard being run by multiple slaves as replicas: branch_to_slaves is typed Dict[int, List[SlaveConnection]] (master.py:775), built by appending (branch_to_slaves.setdefault(full_shard_id, []).append(slave), master.py:907), with the explicit comment "Slaves may run multiple copies of the same branch" (master.py:1124). Routing is replica-aware: writes (add_transaction) fan out to all replicas (master.py:1240-1241), reads / PoSW take the first (master.py:1050). So the same full shard id appearing in more than one slave's FULL_SHARD_ID_LIST is a valid multi-replica deployment.

If this check means cross-slave unique ownership (a shard may belong to only one slave), it would reject those legitimate configs and must be dropped. It also contradicts this issue's narrowed SlaveContext, which only holds the resolved slave and can't see the others — so a cross-slave check isn't even possible here.

This issue is single-slave bootstrap, so the only thing that's both meaningful and doable is: the resolved slave's own FULL_SHARD_ID_LIST must contain no duplicate entries. Suggest rewording to exactly that, and avoiding "owned" since it implies cross-slave ownership. Any global shard-coverage / replica-sanity validation belongs at the master layer and must allow replicas.

Worth confirming whether any current mainnet/testnet config actually uses multiple slaves per shard: if so, implementing this as "unique ownership" is a P0 (rejects a live config); even if not, hardcoding "one slave per shard" would block adding replicas later.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 2e7e79f

Comment threadL1/slave-node-bootstrap.md Outdated

Two reference implementations inform the design:

- **pyquarkchain** (`/Users/dl/code/pyquarkchain`) is the *compatibility source of

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This should be a GitHub URL, not a local path.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

Comment threadL1/slave-node-bootstrap.md Outdated
truth*. The slave must consume the exact `cluster_config.json` that the unmodified
Python master (`quarkchain/cluster/cluster.py`) writes when it launches slaves, and the
root genesis hash it derives must be byte-identical to pyquarkchain's.
- **goquarkchain** (`/Users/dl/code/goquarkchain`) is the *shape reference* for the Go

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Same as above.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Fixed in 398c3e5

@syntrust
syntrust requested a review from iteyelmpJune 23, 2026 08:51
@syntrustsyntrust mentioned this pull request Jun 26, 2026
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.

4 participants

@syntrust@qzhodl@iteyelmp@blockchaindevsh