Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Update and fix wasm code again, add cli check to .gitlab-ci.yml #917

Merged
merged 4 commits into from
Mar 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ check-web-wasm: &test
- time cargo build --locked --target=wasm32-unknown-unknown --manifest-path primitives/Cargo.toml
- time cargo build --locked --target=wasm32-unknown-unknown --manifest-path rpc/Cargo.toml
- time cargo build --locked --target=wasm32-unknown-unknown --manifest-path statement-table/Cargo.toml
- time cargo build --locked --target=wasm32-unknown-unknown --manifest-path cli/Cargo.toml --no-default-features --features browser
- sccache -s


Expand Down
6 changes: 4 additions & 2 deletions cli/browser-demo/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
<link rel="shortcut icon" href="/favicon.png" />
<script type="module">
import { start_client, default as init } from './pkg/polkadot_cli.js';
import ws from './ws.js';

function log(msg) {
document.getElementsByTagName('body')[0].innerHTML += msg + '\n';
Expand All @@ -16,10 +15,13 @@
log('Loading WASM');
await init('./pkg/polkadot_cli_bg.wasm');
log('Successfully loaded WASM');
log('Fetching chain spec');
const chain_spec_response = await fetch("https://raw.githubusercontent.com/paritytech/polkadot/master/service/res/westend.json");
Copy link
Contributor

Choose a reason for hiding this comment

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

As mentioned in the browser-light-client chat: I don't think that can work, as the format of the database and the network message are directly derived from the runtime's code.

Copy link
Contributor

@tomaka tomaka Mar 20, 2020

Choose a reason for hiding this comment

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

It's also ideologically questionable to download the chainspecs from something that Parity owns, as the entire point of the blockchain client is to not rely on a central authority.
Also, if GitHub goes down, the node doesn't work.

Copy link
Contributor

Choose a reason for hiding this comment

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

The node devs have to be trusted in any case, but I agree that we shouldn't be downloading from GitHub if avoidable. Still, I view in-browser light client as a prototype at the moment, where we can make some allowances as nobody uses it yet :)

const chain_spec_text = await chain_spec_response.text();

// Build our client.
log('Starting client');
let client = await start_client('westend', ws());
let client = await start_client(chain_spec_text, 'info');
log('Client started');

client.rpcSubscribe('{"method":"chain_subscribeNewHead","params":[],"id":1,"jsonrpc":"2.0"}',
Expand Down
148 changes: 0 additions & 148 deletions cli/browser-demo/ws.js

This file was deleted.

42 changes: 16 additions & 26 deletions cli/src/browser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,50 +14,40 @@
// You should have received a copy of the GNU General Public License
// along with Substrate. If not, see <http://www.gnu.org/licenses/>.

use crate::ChainSpec;
use log::info;
use wasm_bindgen::prelude::*;
use service::IsKusama;
use browser_utils::{
Client,
browser_configuration, set_console_error_panic_hook, init_console_log,
};
use std::str::FromStr;

/// Starts the client.
///
/// You must pass a libp2p transport that supports .
#[wasm_bindgen]
pub async fn start_client(chain_spec: String, wasm_ext: browser_utils::Transport) -> Result<browser_utils::Client, JsValue> {
start_inner(chain_spec, wasm_ext)
pub async fn start_client(chain_spec: String, log_level: String) -> Result<Client, JsValue> {
start_inner(chain_spec, log_level)
.await
.map_err(|err| JsValue::from_str(&err.to_string()))
}

async fn start_inner(chain_spec: String, wasm_ext: browser_utils::Transport) -> Result<browser_utils::Client, Box<dyn std::error::Error>> {
browser_utils::set_console_error_panic_hook();
browser_utils::init_console_log(log::Level::Info)?;
async fn start_inner(chain_spec: String, log_level: String) -> Result<Client, Box<dyn std::error::Error>> {
set_console_error_panic_hook();
init_console_log(log_level.parse()?)?;

let chain_spec = ChainSpec::from(&chain_spec)
.ok_or_else(|| format!("Chain spec: {:?} doesn't exist.", chain_spec))?
.load()
let chain_spec = service::PolkadotChainSpec::from_json_bytes(chain_spec.as_bytes().to_vec())
.map_err(|e| format!("{:?}", e))?;
let config = browser_utils::browser_configuration(wasm_ext, chain_spec)
.await?;
let config = browser_configuration(chain_spec).await?;

info!("Polkadot browser node");
info!(" version {}", config.full_version());
info!(" by Parity Technologies, 2017-2019");
if let Some(chain_spec) = &config.chain_spec {
info!("Chain specification: {}", chain_spec.name());
if chain_spec.is_kusama() {
info!("----------------------------");
info!("This chain is not in any way");
info!(" endorsed by the ");
info!(" KUSAMA FOUNDATION ");
info!("----------------------------");
}
}
info!(" by Parity Technologies, 2017-2020");
info!("Chain specification: {}", config.expect_chain_spec().name());
info!("Node name: {}", config.name);
info!("Roles: {:?}", config.roles);

// Create the service. This is the most heavy initialization step.
let service = service::kusama_new_light(config).map_err(|e| format!("{:?}", e))?;
let service = service::kusama_new_light(config)
.map_err(|e| format!("{:?}", e))?;

Ok(browser_utils::start_client(service))
}