From b50a5ae3bfc3d57f4657a76a1ee31a73152b1b45 Mon Sep 17 00:00:00 2001 From: officeyutong Date: Fri, 4 Jul 2025 17:09:48 +0800 Subject: [PATCH] update --- Cargo.lock | 68 +++++++++++++++++-- wasm/light-client-js/src/index.ts | 11 ++- .../light-client-js/src/lightclient.worker.ts | 11 ++- wasm/light-client-js/src/types.ts | 7 +- wasm/light-client-wasm/Cargo.toml | 1 + wasm/light-client-wasm/src/lib.rs | 34 +++++++--- 6 files changed, 114 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c7aa6c38..db076be8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -444,7 +444,7 @@ dependencies = [ "serde_json", "tentacle-multiaddr", "tentacle-secio", - "toml", + "toml 0.5.11", "ubyte", "url", ] @@ -521,7 +521,7 @@ dependencies = [ "ckb-traits", "ckb-types", "serde", - "toml", + "toml 0.5.11", ] [[package]] @@ -816,7 +816,7 @@ dependencies = [ "tempfile", "thiserror 1.0.69", "tokio", - "toml", + "toml 0.5.11", "wasm-bindgen", "wasm-bindgen-test", "web-sys", @@ -2798,6 +2798,7 @@ dependencies = [ "serde-wasm-bindgen", "serde_json", "tokio", + "toml 0.8.23", "wasm-bindgen", "wasm-bindgen-futures", "wasm-logger", @@ -3354,7 +3355,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -3842,6 +3843,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "sha-1" version = "0.10.1" @@ -4294,6 +4304,47 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "tower-service" version = "0.3.3" @@ -4881,6 +4932,15 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +[[package]] +name = "winnow" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" diff --git a/wasm/light-client-js/src/index.ts b/wasm/light-client-js/src/index.ts index e8dadfdc..23708e24 100644 --- a/wasm/light-client-js/src/index.ts +++ b/wasm/light-client-js/src/index.ts @@ -52,8 +52,14 @@ class LightClient { * @param networkSecretKey A secret key used to derive keys during data transport between nodes. This key should be persistent for a unique client. * @param logLevel Log Level for light-client-db-worker and light-client-wasm * @param transportType Specify transport type. `ws` stands for non-secure WebSocket, while `wss` stands for WebSocket over SSL. + * @param networkConfigIsJSObject Sets to true if `NetworkSetting.config` is provided as a JS object, otherwise it should be a TOML string. */ - async start(networkSetting: NetworkSetting, networkSecretKey: Hex, logLevel: "trace" | "debug" | "info" | "error" = "info", transportType: "ws" | "wss" = "ws") { + async start( + networkSetting: NetworkSetting, + networkSecretKey: Hex, + logLevel: "trace" | "debug" | "info" | "error" = "info", transportType: "ws" | "wss" = "ws", + networkConfigIsJSObject: boolean = false, + ) { this.dbWorker.postMessage({ inputBuffer: this.inputBuffer, outputBuffer: this.outputBuffer, @@ -66,7 +72,8 @@ class LightClient { logLevel: logLevel, traceLogBuffer: this.traceLogBuffer, networkSecretKey: bytesFrom(networkSecretKey), - transportType + transportType, + networkConfigIsJSObject } as LightClientWorkerInitializeOptions); await new Promise((res, rej) => { this.dbWorker.onmessage = () => res(); diff --git a/wasm/light-client-js/src/lightclient.worker.ts b/wasm/light-client-js/src/lightclient.worker.ts index 7c112f5c..bc7a503c 100644 --- a/wasm/light-client-js/src/lightclient.worker.ts +++ b/wasm/light-client-js/src/lightclient.worker.ts @@ -8,7 +8,16 @@ onmessage = async (evt) => { if (!loaded) { const data = evt.data as LightClientWorkerInitializeOptions; wasmModule.set_shared_array(data.inputBuffer, data.outputBuffer); - await wasmModule.light_client(data.networkFlag, data.logLevel, data.networkSecretKey, data.transportType); + if (data.networkConfigIsJSObject) { + data.networkFlag.config = JSON.stringify(data.networkFlag.config); + } + await wasmModule.light_client( + data.networkFlag, + data.logLevel, + data.networkSecretKey, + data.transportType, + data.networkConfigIsJSObject, + ); self.postMessage({}); loaded = true; return; diff --git a/wasm/light-client-js/src/types.ts b/wasm/light-client-js/src/types.ts index a13afd6b..21f91e91 100644 --- a/wasm/light-client-js/src/types.ts +++ b/wasm/light-client-js/src/types.ts @@ -21,7 +21,8 @@ interface DbWorkerInitializeOptions extends WorkerInitializeOptions { interface LightClientWorkerInitializeOptions extends WorkerInitializeOptions { networkFlag: NetworkSetting; - networkSecretKey: Uint8Array + networkSecretKey: Uint8Array; + networkConfigIsJSObject: boolean; }; interface LightClientFunctionCall { @@ -178,7 +179,9 @@ export function localNodeTo(input: LightClientLocalNode): LocalNode { version: input.version }) } -type NetworkSetting = { type: "MainNet"; config?: string; } | { type: "TestNet"; config?: string; } | { type: "DevNet"; spec: string; config: string; }; +type NetworkSetting = { type: "MainNet"; config?: string | any; } | +{ type: "TestNet"; config?: string | any; } | +{ type: "DevNet"; spec: string; config: string | any; }; export enum LightClientSetScriptsCommand { All = 0, Partial = 1, diff --git a/wasm/light-client-wasm/Cargo.toml b/wasm/light-client-wasm/Cargo.toml index 0ab7f799..eb99a9b9 100644 --- a/wasm/light-client-wasm/Cargo.toml +++ b/wasm/light-client-wasm/Cargo.toml @@ -35,6 +35,7 @@ ckb-app-config = "0.202.0" getrandom = { version = "0.2", features = ["js"] } tokio = { version = "1.20" } +toml = "0.8.23" [features] default = ["console_error_panic_hook"] diff --git a/wasm/light-client-wasm/src/lib.rs b/wasm/light-client-wasm/src/lib.rs index acfde496..1f68ecbe 100644 --- a/wasm/light-client-wasm/src/lib.rs +++ b/wasm/light-client-wasm/src/lib.rs @@ -93,6 +93,7 @@ pub async fn light_client( log_level: String, network_secret_key: JsValue, wasm_transport_type: JsValue, + network_config_is_json: bool, ) -> Result<(), JsValue> { if !status(0b0) { return Err(JsValue::from_str("Can't start twice")); @@ -109,20 +110,35 @@ pub async fn light_client( "Starting with wasm transport type = {:?}", wasm_transport_type ); - let mut config = match &network_flag { + enum NetworkConfigType<'a> { + Default(&'a str), + UserDefined(&'a str), + } + let config_string = match &network_flag { NetworkSetting::TestNet { config } => config .as_ref() - .map_or(TESTNET_CONFIG, |v| v) - .parse::() - .unwrap(), + .map_or(NetworkConfigType::Default(TESTNET_CONFIG), |v| { + NetworkConfigType::UserDefined(v.as_str()) + }), NetworkSetting::MainNet { config } => config .as_ref() - .map_or(MAINNET_CONFIG, |v| v) - .parse::() - .unwrap(), - NetworkSetting::DevNet { config, .. } => config.parse::().unwrap(), + .map_or(NetworkConfigType::Default(MAINNET_CONFIG), |v| { + NetworkConfigType::UserDefined(v.as_str()) + }), + NetworkSetting::DevNet { config, .. } => NetworkConfigType::UserDefined(config.as_str()), + }; + let mut config = match config_string { + NetworkConfigType::Default(s) => s.parse::().unwrap(), + NetworkConfigType::UserDefined(s) => { + if network_config_is_json { + serde_json::from_str(s) + .map_err(|e| format!("Unable to parse network setting from json: {}", e))? + } else { + s.parse::() + .map_err(|e| format!("Unable to parse network setting from toml: {}", e))? + } + } }; - let storage = Storage::new(&config.store.path); let chain_spec = ChainSpec::load_from(&match network_flag { NetworkSetting::MainNet { .. } => Resource::bundled("specs/mainnet.toml".to_string()),