Skip to content

Repository files navigation

Substrate light client

Implementation of substrate light client in rust compilable to wasm. It is written to be integrated with CosmWasm readily, and is optimized to run in a constrained environment of a smart contract. Refer here to know how it works under the hood.

Compilation

Prerequisites

  1. Rust 1.42.0 or higher
  2. Two target need to be installed
    1. wasm32-unknown-unknown to compile it into wasm and integrate it with CosmWasm
    2. x86_64-apple-darwin to run tests

Compile in wasm

Run make wasm in project directory. This will produce a file /target/wasm32-unknown-unknown/release/substrate_client.wasm To produce a size optimized build, you need to run make wasm-optimized.

Testing

  1. Run all the tests: cargo test
  2. Run the test tool: Test tool is a bash script that run two tests with -- --nocapture flag, which makes them print out execution trace.
chmod +x test-tool.sh
./test-tool.sh

Run it inside Cosmos blockchain

Before we start, we need to build wasm optimized byte code for this light client via running make wasm-optimized.

To run it inside Cosmos blockchain, we need modified version of Gaia with CosmWasm enabled. For that, you can clone this repository, and switch to wasm-ibc branch. Then follow instruction from README file to upload it to gaia daemon and start gaia LCD.

How it works?

At a higher level, substrate light client follows the sequence of grandpa finalized headers and keeps track of the following things:

  1. Best header seen till now: Refers to the last header we successfully ingested.
  2. Last finalized header: Last header for which we received a valid grandpa justification
  3. Scheduled Grandpa Authority Set Change: It refers to the change of authority set after a delay of certain blocks. It is extracted from ScheduledChange consensus log from the incoming header and kept in the storage till the authority set change is applied to the current authority set.
  4. Current Grandpa Authority set: Grandpa authority set after last authority set change was applied. It is used to validate grandpa justification.

Light client is in form of CosmWasm contract, with three entry points:

  1. init: As the name suggests, init method initializes new light client instance. It requires a root header and grandpa authority set who signed that header along with some configuration parameters.
  2. update: update method ingests incoming header with optional justification. Header ingestion first validates incoming header (optionally with justification), and contains mainly two checks: a. Header is a child of the last header we successfully ingested b. If justification is provided, it is valid against current authority set and its target hash is equal to header's hash. Upon successful validation, if a scheduled authority set change is contained in the header, it is extracted and stored along with the header. Lastly, if valid justification is provided, the header and its ascendants are marked as finalized.
  3. query: Query method is a read-only method that reads light client storage and returns data like last ingested header, last finalized header, etc.

About

Implementation of substrate light client in rust, compilable to wasm.

Resources

Stars

18 stars

Watchers

21 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - ChorusOne/substrate-light-client: Implementation of substrate light client in rust, compilable to wasm. · GitHub
Skip to content

Repository files navigation

Substrate light client

Implementation of substrate light client in rust compilable to wasm. It is written to be integrated with CosmWasm readily, and is optimized to run in a constrained environment of a smart contract. Refer here to know how it works under the hood.

Compilation

Prerequisites

  1. Rust 1.42.0 or higher
  2. Two target need to be installed
    1. wasm32-unknown-unknown to compile it into wasm and integrate it with CosmWasm
    2. x86_64-apple-darwin to run tests

Compile in wasm

Run make wasm in project directory. This will produce a file /target/wasm32-unknown-unknown/release/substrate_client.wasm To produce a size optimized build, you need to run make wasm-optimized.

Testing

  1. Run all the tests: cargo test
  2. Run the test tool: Test tool is a bash script that run two tests with -- --nocapture flag, which makes them print out execution trace.
chmod +x test-tool.sh
./test-tool.sh

Run it inside Cosmos blockchain

Before we start, we need to build wasm optimized byte code for this light client via running make wasm-optimized.

To run it inside Cosmos blockchain, we need modified version of Gaia with CosmWasm enabled. For that, you can clone this repository, and switch to wasm-ibc branch. Then follow instruction from README file to upload it to gaia daemon and start gaia LCD.

How it works?

At a higher level, substrate light client follows the sequence of grandpa finalized headers and keeps track of the following things:

  1. Best header seen till now: Refers to the last header we successfully ingested.
  2. Last finalized header: Last header for which we received a valid grandpa justification
  3. Scheduled Grandpa Authority Set Change: It refers to the change of authority set after a delay of certain blocks. It is extracted from ScheduledChange consensus log from the incoming header and kept in the storage till the authority set change is applied to the current authority set.
  4. Current Grandpa Authority set: Grandpa authority set after last authority set change was applied. It is used to validate grandpa justification.

Light client is in form of CosmWasm contract, with three entry points:

  1. init: As the name suggests, init method initializes new light client instance. It requires a root header and grandpa authority set who signed that header along with some configuration parameters.
  2. update: update method ingests incoming header with optional justification. Header ingestion first validates incoming header (optionally with justification), and contains mainly two checks: a. Header is a child of the last header we successfully ingested b. If justification is provided, it is valid against current authority set and its target hash is equal to header's hash. Upon successful validation, if a scheduled authority set change is contained in the header, it is extracted and stored along with the header. Lastly, if valid justification is provided, the header and its ascendants are marked as finalized.
  3. query: Query method is a read-only method that reads light client storage and returns data like last ingested header, last finalized header, etc.

About

Implementation of substrate light client in rust, compilable to wasm.

Resources

Stars

18 stars

Watchers

21 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Substrate light client

Implementation of substrate light client in rust compilable to wasm. It is written to be integrated with CosmWasm readily, and is optimized to run in a constrained environment of a smart contract. Refer here to know how it works under the hood.

Compilation

Prerequisites

  1. Rust 1.42.0 or higher
  2. Two target need to be installed
    1. wasm32-unknown-unknown to compile it into wasm and integrate it with CosmWasm
    2. x86_64-apple-darwin to run tests

Compile in wasm

Run make wasm in project directory. This will produce a file /target/wasm32-unknown-unknown/release/substrate_client.wasm To produce a size optimized build, you need to run make wasm-optimized.

Testing

  1. Run all the tests: cargo test
  2. Run the test tool: Test tool is a bash script that run two tests with -- --nocapture flag, which makes them print out execution trace.
chmod +x test-tool.sh
./test-tool.sh

Run it inside Cosmos blockchain

Before we start, we need to build wasm optimized byte code for this light client via running make wasm-optimized.

To run it inside Cosmos blockchain, we need modified version of Gaia with CosmWasm enabled. For that, you can clone this repository, and switch to wasm-ibc branch. Then follow instruction from README file to upload it to gaia daemon and start gaia LCD.

How it works?

At a higher level, substrate light client follows the sequence of grandpa finalized headers and keeps track of the following things:

  1. Best header seen till now: Refers to the last header we successfully ingested.
  2. Last finalized header: Last header for which we received a valid grandpa justification
  3. Scheduled Grandpa Authority Set Change: It refers to the change of authority set after a delay of certain blocks. It is extracted from ScheduledChange consensus log from the incoming header and kept in the storage till the authority set change is applied to the current authority set.
  4. Current Grandpa Authority set: Grandpa authority set after last authority set change was applied. It is used to validate grandpa justification.

Light client is in form of CosmWasm contract, with three entry points:

  1. init: As the name suggests, init method initializes new light client instance. It requires a root header and grandpa authority set who signed that header along with some configuration parameters.
  2. update: update method ingests incoming header with optional justification. Header ingestion first validates incoming header (optionally with justification), and contains mainly two checks: a. Header is a child of the last header we successfully ingested b. If justification is provided, it is valid against current authority set and its target hash is equal to header's hash. Upon successful validation, if a scheduled authority set change is contained in the header, it is extracted and stored along with the header. Lastly, if valid justification is provided, the header and its ascendants are marked as finalized.
  3. query: Query method is a read-only method that reads light client storage and returns data like last ingested header, last finalized header, etc.

About

Implementation of substrate light client in rust, compilable to wasm.

Resources

Stars

18 stars

Watchers

21 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Substrate light client

Implementation of substrate light client in rust compilable to wasm. It is written to be integrated with CosmWasm readily, and is optimized to run in a constrained environment of a smart contract. Refer here to know how it works under the hood.

Compilation

Prerequisites

  1. Rust 1.42.0 or higher
  2. Two target need to be installed
    1. wasm32-unknown-unknown to compile it into wasm and integrate it with CosmWasm
    2. x86_64-apple-darwin to run tests

Compile in wasm

Run make wasm in project directory. This will produce a file /target/wasm32-unknown-unknown/release/substrate_client.wasm To produce a size optimized build, you need to run make wasm-optimized.

Testing

  1. Run all the tests: cargo test
  2. Run the test tool: Test tool is a bash script that run two tests with -- --nocapture flag, which makes them print out execution trace.
chmod +x test-tool.sh
./test-tool.sh

Run it inside Cosmos blockchain

Before we start, we need to build wasm optimized byte code for this light client via running make wasm-optimized.

To run it inside Cosmos blockchain, we need modified version of Gaia with CosmWasm enabled. For that, you can clone this repository, and switch to wasm-ibc branch. Then follow instruction from README file to upload it to gaia daemon and start gaia LCD.

How it works?

At a higher level, substrate light client follows the sequence of grandpa finalized headers and keeps track of the following things:

  1. Best header seen till now: Refers to the last header we successfully ingested.
  2. Last finalized header: Last header for which we received a valid grandpa justification
  3. Scheduled Grandpa Authority Set Change: It refers to the change of authority set after a delay of certain blocks. It is extracted from ScheduledChange consensus log from the incoming header and kept in the storage till the authority set change is applied to the current authority set.
  4. Current Grandpa Authority set: Grandpa authority set after last authority set change was applied. It is used to validate grandpa justification.

Light client is in form of CosmWasm contract, with three entry points:

  1. init: As the name suggests, init method initializes new light client instance. It requires a root header and grandpa authority set who signed that header along with some configuration parameters.
  2. update: update method ingests incoming header with optional justification. Header ingestion first validates incoming header (optionally with justification), and contains mainly two checks: a. Header is a child of the last header we successfully ingested b. If justification is provided, it is valid against current authority set and its target hash is equal to header's hash. Upon successful validation, if a scheduled authority set change is contained in the header, it is extracted and stored along with the header. Lastly, if valid justification is provided, the header and its ascendants are marked as finalized.
  3. query: Query method is a read-only method that reads light client storage and returns data like last ingested header, last finalized header, etc.

About

Implementation of substrate light client in rust, compilable to wasm.

Resources

Stars

18 stars

Watchers

21 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Substrate light client

Implementation of substrate light client in rust compilable to wasm. It is written to be integrated with CosmWasm readily, and is optimized to run in a constrained environment of a smart contract. Refer here to know how it works under the hood.

Compilation

Prerequisites

  1. Rust 1.42.0 or higher
  2. Two target need to be installed
    1. wasm32-unknown-unknown to compile it into wasm and integrate it with CosmWasm
    2. x86_64-apple-darwin to run tests

Compile in wasm

Run make wasm in project directory. This will produce a file /target/wasm32-unknown-unknown/release/substrate_client.wasm To produce a size optimized build, you need to run make wasm-optimized.

Testing

  1. Run all the tests: cargo test
  2. Run the test tool: Test tool is a bash script that run two tests with -- --nocapture flag, which makes them print out execution trace.
chmod +x test-tool.sh
./test-tool.sh

Run it inside Cosmos blockchain

Before we start, we need to build wasm optimized byte code for this light client via running make wasm-optimized.

To run it inside Cosmos blockchain, we need modified version of Gaia with CosmWasm enabled. For that, you can clone this repository, and switch to wasm-ibc branch. Then follow instruction from README file to upload it to gaia daemon and start gaia LCD.

How it works?

At a higher level, substrate light client follows the sequence of grandpa finalized headers and keeps track of the following things:

  1. Best header seen till now: Refers to the last header we successfully ingested.
  2. Last finalized header: Last header for which we received a valid grandpa justification
  3. Scheduled Grandpa Authority Set Change: It refers to the change of authority set after a delay of certain blocks. It is extracted from ScheduledChange consensus log from the incoming header and kept in the storage till the authority set change is applied to the current authority set.
  4. Current Grandpa Authority set: Grandpa authority set after last authority set change was applied. It is used to validate grandpa justification.

Light client is in form of CosmWasm contract, with three entry points:

  1. init: As the name suggests, init method initializes new light client instance. It requires a root header and grandpa authority set who signed that header along with some configuration parameters.
  2. update: update method ingests incoming header with optional justification. Header ingestion first validates incoming header (optionally with justification), and contains mainly two checks: a. Header is a child of the last header we successfully ingested b. If justification is provided, it is valid against current authority set and its target hash is equal to header's hash. Upon successful validation, if a scheduled authority set change is contained in the header, it is extracted and stored along with the header. Lastly, if valid justification is provided, the header and its ascendants are marked as finalized.
  3. query: Query method is a read-only method that reads light client storage and returns data like last ingested header, last finalized header, etc.

About

Implementation of substrate light client in rust, compilable to wasm.

Resources

Stars

18 stars

Watchers

21 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ChorusOne/substrate-light-client: Implementation of substrate light client in rust, compilable to wasm. · GitHub
Skip to content

Repository files navigation

Substrate light client

Implementation of substrate light client in rust compilable to wasm. It is written to be integrated with CosmWasm readily, and is optimized to run in a constrained environment of a smart contract. Refer here to know how it works under the hood.

Compilation

Prerequisites

  1. Rust 1.42.0 or higher
  2. Two target need to be installed
    1. wasm32-unknown-unknown to compile it into wasm and integrate it with CosmWasm
    2. x86_64-apple-darwin to run tests

Compile in wasm

Run make wasm in project directory. This will produce a file /target/wasm32-unknown-unknown/release/substrate_client.wasm To produce a size optimized build, you need to run make wasm-optimized.

Testing

  1. Run all the tests: cargo test
  2. Run the test tool: Test tool is a bash script that run two tests with -- --nocapture flag, which makes them print out execution trace.
chmod +x test-tool.sh
./test-tool.sh

Run it inside Cosmos blockchain

Before we start, we need to build wasm optimized byte code for this light client via running make wasm-optimized.

To run it inside Cosmos blockchain, we need modified version of Gaia with CosmWasm enabled. For that, you can clone this repository, and switch to wasm-ibc branch. Then follow instruction from README file to upload it to gaia daemon and start gaia LCD.

How it works?

At a higher level, substrate light client follows the sequence of grandpa finalized headers and keeps track of the following things:

  1. Best header seen till now: Refers to the last header we successfully ingested.
  2. Last finalized header: Last header for which we received a valid grandpa justification
  3. Scheduled Grandpa Authority Set Change: It refers to the change of authority set after a delay of certain blocks. It is extracted from ScheduledChange consensus log from the incoming header and kept in the storage till the authority set change is applied to the current authority set.
  4. Current Grandpa Authority set: Grandpa authority set after last authority set change was applied. It is used to validate grandpa justification.

Light client is in form of CosmWasm contract, with three entry points:

  1. init: As the name suggests, init method initializes new light client instance. It requires a root header and grandpa authority set who signed that header along with some configuration parameters.
  2. update: update method ingests incoming header with optional justification. Header ingestion first validates incoming header (optionally with justification), and contains mainly two checks: a. Header is a child of the last header we successfully ingested b. If justification is provided, it is valid against current authority set and its target hash is equal to header's hash. Upon successful validation, if a scheduled authority set change is contained in the header, it is extracted and stored along with the header. Lastly, if valid justification is provided, the header and its ascendants are marked as finalized.
  3. query: Query method is a read-only method that reads light client storage and returns data like last ingested header, last finalized header, etc.

About

Implementation of substrate light client in rust, compilable to wasm.

Resources

Stars

18 stars

Watchers

21 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ChorusOne/substrate-light-client: Implementation of substrate light client in rust, compilable to wasm. · GitHub
Skip to content

Repository files navigation

Substrate light client

Implementation of substrate light client in rust compilable to wasm. It is written to be integrated with CosmWasm readily, and is optimized to run in a constrained environment of a smart contract. Refer here to know how it works under the hood.

Compilation

Prerequisites

  1. Rust 1.42.0 or higher
  2. Two target need to be installed
    1. wasm32-unknown-unknown to compile it into wasm and integrate it with CosmWasm
    2. x86_64-apple-darwin to run tests

Compile in wasm

Run make wasm in project directory. This will produce a file /target/wasm32-unknown-unknown/release/substrate_client.wasm To produce a size optimized build, you need to run make wasm-optimized.

Testing

  1. Run all the tests: cargo test
  2. Run the test tool: Test tool is a bash script that run two tests with -- --nocapture flag, which makes them print out execution trace.
chmod +x test-tool.sh
./test-tool.sh

Run it inside Cosmos blockchain

Before we start, we need to build wasm optimized byte code for this light client via running make wasm-optimized.

To run it inside Cosmos blockchain, we need modified version of Gaia with CosmWasm enabled. For that, you can clone this repository, and switch to wasm-ibc branch. Then follow instruction from README file to upload it to gaia daemon and start gaia LCD.

How it works?

At a higher level, substrate light client follows the sequence of grandpa finalized headers and keeps track of the following things:

  1. Best header seen till now: Refers to the last header we successfully ingested.
  2. Last finalized header: Last header for which we received a valid grandpa justification
  3. Scheduled Grandpa Authority Set Change: It refers to the change of authority set after a delay of certain blocks. It is extracted from ScheduledChange consensus log from the incoming header and kept in the storage till the authority set change is applied to the current authority set.
  4. Current Grandpa Authority set: Grandpa authority set after last authority set change was applied. It is used to validate grandpa justification.

Light client is in form of CosmWasm contract, with three entry points:

  1. init: As the name suggests, init method initializes new light client instance. It requires a root header and grandpa authority set who signed that header along with some configuration parameters.
  2. update: update method ingests incoming header with optional justification. Header ingestion first validates incoming header (optionally with justification), and contains mainly two checks: a. Header is a child of the last header we successfully ingested b. If justification is provided, it is valid against current authority set and its target hash is equal to header's hash. Upon successful validation, if a scheduled authority set change is contained in the header, it is extracted and stored along with the header. Lastly, if valid justification is provided, the header and its ascendants are marked as finalized.
  3. query: Query method is a read-only method that reads light client storage and returns data like last ingested header, last finalized header, etc.

About

Implementation of substrate light client in rust, compilable to wasm.

Resources

Stars

18 stars

Watchers

21 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Substrate light client

Implementation of substrate light client in rust compilable to wasm. It is written to be integrated with CosmWasm readily, and is optimized to run in a constrained environment of a smart contract. Refer here to know how it works under the hood.

Compilation

Prerequisites

  1. Rust 1.42.0 or higher
  2. Two target need to be installed
    1. wasm32-unknown-unknown to compile it into wasm and integrate it with CosmWasm
    2. x86_64-apple-darwin to run tests

Compile in wasm

Run make wasm in project directory. This will produce a file /target/wasm32-unknown-unknown/release/substrate_client.wasm To produce a size optimized build, you need to run make wasm-optimized.

Testing

  1. Run all the tests: cargo test
  2. Run the test tool: Test tool is a bash script that run two tests with -- --nocapture flag, which makes them print out execution trace.
chmod +x test-tool.sh
./test-tool.sh

Run it inside Cosmos blockchain

Before we start, we need to build wasm optimized byte code for this light client via running make wasm-optimized.

To run it inside Cosmos blockchain, we need modified version of Gaia with CosmWasm enabled. For that, you can clone this repository, and switch to wasm-ibc branch. Then follow instruction from README file to upload it to gaia daemon and start gaia LCD.

How it works?

At a higher level, substrate light client follows the sequence of grandpa finalized headers and keeps track of the following things:

  1. Best header seen till now: Refers to the last header we successfully ingested.
  2. Last finalized header: Last header for which we received a valid grandpa justification
  3. Scheduled Grandpa Authority Set Change: It refers to the change of authority set after a delay of certain blocks. It is extracted from ScheduledChange consensus log from the incoming header and kept in the storage till the authority set change is applied to the current authority set.
  4. Current Grandpa Authority set: Grandpa authority set after last authority set change was applied. It is used to validate grandpa justification.

Light client is in form of CosmWasm contract, with three entry points:

  1. init: As the name suggests, init method initializes new light client instance. It requires a root header and grandpa authority set who signed that header along with some configuration parameters.
  2. update: update method ingests incoming header with optional justification. Header ingestion first validates incoming header (optionally with justification), and contains mainly two checks: a. Header is a child of the last header we successfully ingested b. If justification is provided, it is valid against current authority set and its target hash is equal to header's hash. Upon successful validation, if a scheduled authority set change is contained in the header, it is extracted and stored along with the header. Lastly, if valid justification is provided, the header and its ascendants are marked as finalized.
  3. query: Query method is a read-only method that reads light client storage and returns data like last ingested header, last finalized header, etc.

About

Implementation of substrate light client in rust, compilable to wasm.

Resources

Stars

18 stars

Watchers

21 watching

Forks

Releases

Packages

Used by

Contributors

Languages