diff --git a/Cargo.lock b/Cargo.lock index 54b3bff97..2c5c31de3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1855,7 +1855,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1949,8 +1949,32 @@ dependencies = [ ] [[package]] -name = "parity" +name = "parity-bytes" +version = "0.1.0" +source = "git+https://github.com/paritytech/parity-common#a72c34f82ff7ccc0f49827bb7f8c5d1fbff794bb" + +[[package]] +name = "parity-clib" version = "1.12.0" +dependencies = [ + "parity-ethereum 2.0.0", +] + +[[package]] +name = "parity-crypto" +version = "0.1.0" +source = "git+https://github.com/paritytech/parity-common#a72c34f82ff7ccc0f49827bb7f8c5d1fbff794bb" +dependencies = [ + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.12.1 (git+https://github.com/paritytech/ring)", + "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parity-ethereum" +version = "2.0.0" dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2000,7 +2024,7 @@ dependencies = [ "parity-rpc 1.12.0", "parity-rpc-client 1.4.0", "parity-updater 1.12.0", - "parity-version 1.12.0", + "parity-version 2.0.0", "parity-whisper 0.1.0", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "path 0.1.1 (git+https://github.com/paritytech/parity-common)", @@ -2023,30 +2047,6 @@ dependencies = [ "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "parity-bytes" -version = "0.1.0" -source = "git+https://github.com/paritytech/parity-common#a72c34f82ff7ccc0f49827bb7f8c5d1fbff794bb" - -[[package]] -name = "parity-clib" -version = "1.12.0" -dependencies = [ - "parity 1.12.0", -] - -[[package]] -name = "parity-crypto" -version = "0.1.0" -source = "git+https://github.com/paritytech/parity-common#a72c34f82ff7ccc0f49827bb7f8c5d1fbff794bb" -dependencies = [ - "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.12.1 (git+https://github.com/paritytech/ring)", - "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "parity-hash-fetch" version = "1.12.0" @@ -2164,7 +2164,7 @@ dependencies = [ "parity-crypto 0.1.0 (git+https://github.com/paritytech/parity-common)", "parity-reactor 0.1.0", "parity-updater 1.12.0", - "parity-version 1.12.0", + "parity-version 2.0.0", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "patricia-trie 0.2.1 (git+https://github.com/paritytech/parity-common)", "pretty_assertions 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2234,7 +2234,7 @@ dependencies = [ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common)", "parity-hash-fetch 1.12.0", - "parity-version 1.12.0", + "parity-version 2.0.0", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "path 0.1.1 (git+https://github.com/paritytech/parity-common)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2245,7 +2245,7 @@ dependencies = [ [[package]] name = "parity-version" -version = "1.12.0" +version = "2.0.0" dependencies = [ "parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common)", "rlp 0.2.1 (git+https://github.com/paritytech/parity-common)", @@ -2579,7 +2579,7 @@ dependencies = [ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index f84b2080c..75c39ccc9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [package] description = "Parity Ethereum client" -name = "parity" +name = "parity-ethereum" # NOTE Make sure to update util/version/Cargo.toml as well -version = "1.12.0" +version = "2.0.0" license = "GPL-3.0" authors = ["Parity Technologies "] diff --git a/ethcore/sync/src/chain/propagator.rs b/ethcore/sync/src/chain/propagator.rs index 75cf550f2..ef5e700bf 100644 --- a/ethcore/sync/src/chain/propagator.rs +++ b/ethcore/sync/src/chain/propagator.rs @@ -48,15 +48,21 @@ fn accepts_service_transaction(client_id: &str) -> bool { // Parity versions starting from this will accept service-transactions const SERVICE_TRANSACTIONS_VERSION: (u32, u32) = (1u32, 6u32); // Parity client string prefix - const PARITY_CLIENT_ID_PREFIX: &'static str = "Parity/v"; + const LEGACY_CLIENT_ID_PREFIX: &'static str = "Parity/v"; + const PARITY_CLIENT_ID_PREFIX: &'static str = "Parity-Ethereum/v"; - if !client_id.starts_with(PARITY_CLIENT_ID_PREFIX) { + let splitted = if client_id.starts_with(LEGACY_CLIENT_ID_PREFIX) { + client_id[LEGACY_CLIENT_ID_PREFIX.len()..].split('.') + } else if client_id.starts_with(PARITY_CLIENT_ID_PREFIX) { + client_id[PARITY_CLIENT_ID_PREFIX.len()..].split('.') + } else { return false; - } - let ver: Vec = client_id[PARITY_CLIENT_ID_PREFIX.len()..].split('.') - .take(2) - .filter_map(|s| s.parse().ok()) - .collect(); + }; + + let ver: Vec = splitted + .take(2) + .filter_map(|s| s.parse().ok()) + .collect(); ver.len() == 2 && (ver[0] > SERVICE_TRANSACTIONS_VERSION.0 || (ver[0] == SERVICE_TRANSACTIONS_VERSION.0 && ver[1] >= SERVICE_TRANSACTIONS_VERSION.1)) } @@ -577,13 +583,13 @@ mod tests { io.peers_info.insert(1, "Geth".to_owned()); // and peer#2 is Parity, accepting service transactions insert_dummy_peer(&mut sync, 2, block_hash); - io.peers_info.insert(2, "Parity/v1.6".to_owned()); + io.peers_info.insert(2, "Parity-Ethereum/v2.6".to_owned()); // and peer#3 is Parity, discarding service transactions insert_dummy_peer(&mut sync, 3, block_hash); io.peers_info.insert(3, "Parity/v1.5".to_owned()); // and peer#4 is Parity, accepting service transactions insert_dummy_peer(&mut sync, 4, block_hash); - io.peers_info.insert(4, "Parity/v1.7.3-ABCDEFGH".to_owned()); + io.peers_info.insert(4, "Parity-Ethereum/v2.7.3-ABCDEFGH".to_owned()); // and new service transaction is propagated to peers SyncPropagator::propagate_new_transactions(&mut sync, &mut io); @@ -607,7 +613,7 @@ mod tests { // when peer#1 is Parity, accepting service transactions insert_dummy_peer(&mut sync, 1, block_hash); - io.peers_info.insert(1, "Parity/v1.6".to_owned()); + io.peers_info.insert(1, "Parity-Ethereum/v2.6".to_owned()); // and service + non-service transactions are propagated to peers SyncPropagator::propagate_new_transactions(&mut sync, &mut io); diff --git a/parity-clib/Cargo.toml b/parity-clib/Cargo.toml index 001f954c2..3a1e95b5f 100644 --- a/parity-clib/Cargo.toml +++ b/parity-clib/Cargo.toml @@ -10,8 +10,8 @@ name = "parity" crate-type = ["cdylib", "staticlib"] [dependencies] -parity = { path = "../", default-features = false } +parity-ethereum = { path = "../", default-features = false } [features] default = [] -final = ["parity/final"] +final = ["parity-ethereum/final"] diff --git a/parity-clib/src/lib.rs b/parity-clib/src/lib.rs index f7a98f811..563eafd73 100644 --- a/parity-clib/src/lib.rs +++ b/parity-clib/src/lib.rs @@ -17,7 +17,7 @@ //! Note that all the structs and functions here are documented in `parity.h`, to avoid //! duplicating documentation. -extern crate parity; +extern crate parity_ethereum; use std::os::raw::{c_char, c_void, c_int}; use std::panic; @@ -56,7 +56,7 @@ pub extern fn parity_config_from_cli(args: *const *const c_char, args_lens: *con args }; - match parity::Configuration::parse_cli(&args) { + match parity_ethereum::Configuration::parse_cli(&args) { Ok(mut cfg) => { // Always disable the auto-updater when used as a library. cfg.args.arg_auto_update = "none".to_owned(); @@ -77,7 +77,7 @@ pub extern fn parity_config_from_cli(args: *const *const c_char, args_lens: *con pub extern fn parity_config_destroy(cfg: *mut c_void) { unsafe { let _ = panic::catch_unwind(|| { - let _cfg = Box::from_raw(cfg as *mut parity::Configuration); + let _cfg = Box::from_raw(cfg as *mut parity_ethereum::Configuration); }); } } @@ -89,7 +89,7 @@ pub extern fn parity_start(cfg: *const ParityParams, output: *mut *mut c_void) - *output = ptr::null_mut(); let cfg: &ParityParams = &*cfg; - let config = Box::from_raw(cfg.configuration as *mut parity::Configuration); + let config = Box::from_raw(cfg.configuration as *mut parity_ethereum::Configuration); let on_client_restart_cb = { struct Cb(Option, *mut c_void); @@ -106,16 +106,16 @@ pub extern fn parity_start(cfg: *const ParityParams, output: *mut *mut c_void) - move |new_chain: String| { cb.call(new_chain); } }; - let action = match parity::start(*config, on_client_restart_cb, || {}) { + let action = match parity_ethereum::start(*config, on_client_restart_cb, || {}) { Ok(action) => action, Err(_) => return 1, }; match action { - parity::ExecutionAction::Instant(Some(s)) => { println!("{}", s); 0 }, - parity::ExecutionAction::Instant(None) => 0, - parity::ExecutionAction::Running(client) => { - *output = Box::into_raw(Box::::new(client)) as *mut c_void; + parity_ethereum::ExecutionAction::Instant(Some(s)) => { println!("{}", s); 0 }, + parity_ethereum::ExecutionAction::Instant(None) => 0, + parity_ethereum::ExecutionAction::Running(client) => { + *output = Box::into_raw(Box::::new(client)) as *mut c_void; 0 } } @@ -127,7 +127,7 @@ pub extern fn parity_start(cfg: *const ParityParams, output: *mut *mut c_void) - pub extern fn parity_destroy(client: *mut c_void) { unsafe { let _ = panic::catch_unwind(|| { - let client = Box::from_raw(client as *mut parity::RunningClient); + let client = Box::from_raw(client as *mut parity_ethereum::RunningClient); client.shutdown(); }); } @@ -137,7 +137,7 @@ pub extern fn parity_destroy(client: *mut c_void) { pub extern fn parity_rpc(client: *mut c_void, query: *const char, len: usize, out_str: *mut c_char, out_len: *mut usize) -> c_int { unsafe { panic::catch_unwind(|| { - let client: &mut parity::RunningClient = &mut *(client as *mut parity::RunningClient); + let client: &mut parity_ethereum::RunningClient = &mut *(client as *mut parity_ethereum::RunningClient); let query_str = { let string = slice::from_raw_parts(query as *const u8, len); diff --git a/parity/configuration.rs b/parity/configuration.rs index 6f6951e2f..a1ace822e 100644 --- a/parity/configuration.rs +++ b/parity/configuration.rs @@ -102,7 +102,7 @@ impl Configuration { /// # Example /// /// ``` - /// let _cfg = parity::Configuration::parse_cli(&["--light", "--chain", "kovan"]).unwrap(); + /// let _cfg = parity_ethereum::Configuration::parse_cli(&["--light", "--chain", "kovan"]).unwrap(); /// ``` pub fn parse_cli>(command: &[S]) -> Result { let config = Configuration { @@ -722,7 +722,7 @@ impl Configuration { ret.client_version = { let mut client_version = version(); if !self.args.arg_identity.is_empty() { - // Insert name after the "Parity/" at the beginning of version string. + // Insert name after the "Parity-Ethereum/" at the beginning of version string. let idx = client_version.find('/').unwrap_or(client_version.len()); client_version.insert_str(idx, &format!("/{}", self.args.arg_identity)); } @@ -1740,7 +1740,7 @@ mod tests { match conf.into_command().unwrap().cmd { Cmd::Run(c) => { assert_eq!(c.name, "Somebody"); - assert!(c.net_conf.client_version.starts_with("Parity/Somebody/")); + assert!(c.net_conf.client_version.starts_with("Parity-Ethereum/Somebody/")); } _ => panic!("Should be Cmd::Run"), } diff --git a/parity/main.rs b/parity/main.rs index 4a02f632f..9256373ca 100644 --- a/parity/main.rs +++ b/parity/main.rs @@ -24,7 +24,7 @@ extern crate fdlimit; #[macro_use] extern crate log; extern crate panic_hook; -extern crate parity; +extern crate parity_ethereum; extern crate parking_lot; #[cfg(windows)] extern crate winapi; @@ -40,7 +40,7 @@ use std::{process, env}; use ctrlc::CtrlC; use dir::default_hypervisor_path; use fdlimit::raise_fd_limit; -use parity::{start, ExecutionAction}; +use parity_ethereum::{start, ExecutionAction}; use parking_lot::{Condvar, Mutex}; const PLEASE_RESTART_EXIT_CODE: i32 = 69; @@ -61,9 +61,9 @@ fn update_path(name: &str) -> PathBuf { } fn latest_exe_path() -> Result { - File::open(update_path("latest")).and_then(|mut f| { - let mut exe_path = String::new(); - trace!(target: "updater", "latest binary path: {:?}", f); + File::open(update_path("latest")).and_then(|mut f| { + let mut exe_path = String::new(); + trace!(target: "updater", "latest binary path: {:?}", f); f.read_to_string(&mut exe_path).map(|_| update_path(&exe_path)) }) .or(Err(Error::BinaryNotFound)) @@ -98,9 +98,9 @@ fn take_spec_name_override() -> Option { let p = update_path("spec_name_override"); let r = File::open(p.clone()) .ok() - .and_then(|mut f| { - let mut spec_name = String::new(); - f.read_to_string(&mut spec_name).ok().map(|_| spec_name) + .and_then(|mut f| { + let mut spec_name = String::new(); + f.read_to_string(&mut spec_name).ok().map(|_| spec_name) }); let _ = remove_file(p); r @@ -137,7 +137,7 @@ fn run_parity() -> Result<(), Error> { global_init(); let prefix = vec![OsString::from("--can-restart"), OsString::from("--force-direct")]; - + let res: Result<(), Error> = latest_exe_path() .and_then(|exe| process::Command::new(exe) .args(&(env::args_os().skip(1).chain(prefix.into_iter()).collect::>())) @@ -155,7 +155,7 @@ fn run_parity() -> Result<(), Error> { _ => Err(Error::Unknown), } }) - ); + ); global_cleanup(); res @@ -181,7 +181,7 @@ fn main_direct(force_can_restart: bool) -> i32 { let mut conf = { let args = std::env::args().collect::>(); - parity::Configuration::parse_cli(&args).unwrap_or_else(|e| e.exit()) + parity_ethereum::Configuration::parse_cli(&args).unwrap_or_else(|e| e.exit()) }; if let Some(spec_override) = take_spec_name_override() { @@ -331,10 +331,10 @@ fn main() { // the user has specified to run its originally installed binary (not via `parity-updater`) let force_direct = std::env::args().any(|arg| arg == "--force-direct"); - + // absolute path to the current `binary` let exe_path = std::env::current_exe().ok(); - + // the binary is named `target/xx/yy` let development = exe_path .as_ref() @@ -345,31 +345,31 @@ fn main() { .map(|n| n == "target") }) .unwrap_or(false); - + // the binary is named `parity` let same_name = exe_path .as_ref() - .map_or(false, |p| { - p.file_stem().map_or(false, |n| n == PARITY_EXECUTABLE_NAME) + .map_or(false, |p| { + p.file_stem().map_or(false, |n| n == PARITY_EXECUTABLE_NAME) }); - trace_main!("Starting up {} (force-direct: {}, development: {}, same-name: {})", - std::env::current_exe().ok().map_or_else(|| "".into(), |x| format!("{}", x.display())), - force_direct, - development, + trace_main!("Starting up {} (force-direct: {}, development: {}, same-name: {})", + std::env::current_exe().ok().map_or_else(|| "".into(), |x| format!("{}", x.display())), + force_direct, + development, same_name); if !force_direct && !development && same_name { - // Try to run the latest installed version of `parity`, + // Try to run the latest installed version of `parity`, // Upon failure it falls back to the locally installed version of `parity` // Everything run inside a loop, so we'll be able to restart from the child into a new version seamlessly. loop { // `Path` to the latest downloaded binary let latest_exe = latest_exe_path().ok(); - + // `Latest´ binary exist let have_update = latest_exe.as_ref().map_or(false, |p| p.exists()); - + // Canonicalized path to the current binary is not the same as to latest binary let canonicalized_path_not_same = exe_path .as_ref() @@ -381,7 +381,7 @@ fn main() { trace_main!("Starting... (have-update: {}, non-updated-current: {}, update-is-newer: {})", have_update, canonicalized_path_not_same, update_is_newer); let exit_code = if have_update && canonicalized_path_not_same && update_is_newer { - trace_main!("Attempting to run latest update ({})...", + trace_main!("Attempting to run latest update ({})...", latest_exe.as_ref().expect("guarded by have_update; latest_exe must exist for have_update; qed").display()); match run_parity() { Ok(_) => 0, @@ -389,7 +389,7 @@ fn main() { Err(Error::Restart) => PLEASE_RESTART_EXIT_CODE, // Fall back to local version Err(e) => { - error!(target: "updater", "Updated binary could not be executed error: {:?}. Falling back to local version", e); + error!(target: "updater", "Updated binary could not be executed error: {:?}. Falling back to local version", e); main_direct(true) } } diff --git a/rpc/src/v1/tests/helpers/sync_provider.rs b/rpc/src/v1/tests/helpers/sync_provider.rs index 7cb0acffe..b65e543e5 100644 --- a/rpc/src/v1/tests/helpers/sync_provider.rs +++ b/rpc/src/v1/tests/helpers/sync_provider.rs @@ -75,7 +75,7 @@ impl SyncProvider for TestSyncProvider { vec![ PeerInfo { id: Some("node1".to_owned()), - client_version: "Parity/1".to_owned(), + client_version: "Parity-Ethereum/1".to_owned(), capabilities: vec!["eth/62".to_owned(), "eth/63".to_owned()], remote_address: "127.0.0.1:7777".to_owned(), local_address: "127.0.0.1:8888".to_owned(), @@ -88,7 +88,7 @@ impl SyncProvider for TestSyncProvider { }, PeerInfo { id: None, - client_version: "Parity/2".to_owned(), + client_version: "Parity-Ethereum/2".to_owned(), capabilities: vec!["eth/63".to_owned(), "eth/64".to_owned()], remote_address: "Handshake".to_owned(), local_address: "127.0.0.1:3333".to_owned(), diff --git a/rpc/src/v1/tests/mocked/parity.rs b/rpc/src/v1/tests/mocked/parity.rs index e4b136586..f8322f8fe 100644 --- a/rpc/src/v1/tests/mocked/parity.rs +++ b/rpc/src/v1/tests/mocked/parity.rs @@ -326,7 +326,7 @@ fn rpc_parity_net_peers() { let io = deps.default_client(); let request = r#"{"jsonrpc": "2.0", "method": "parity_netPeers", "params":[], "id": 1}"#; - let response = r#"{"jsonrpc":"2.0","result":{"active":0,"connected":120,"max":50,"peers":[{"caps":["eth/62","eth/63"],"id":"node1","name":"Parity/1","network":{"localAddress":"127.0.0.1:8888","remoteAddress":"127.0.0.1:7777"},"protocols":{"eth":{"difficulty":"0x28","head":"0000000000000000000000000000000000000000000000000000000000000032","version":62},"pip":null}},{"caps":["eth/63","eth/64"],"id":null,"name":"Parity/2","network":{"localAddress":"127.0.0.1:3333","remoteAddress":"Handshake"},"protocols":{"eth":{"difficulty":null,"head":"000000000000000000000000000000000000000000000000000000000000003c","version":64},"pip":null}}]},"id":1}"#; + let response = r#"{"jsonrpc":"2.0","result":{"active":0,"connected":120,"max":50,"peers":[{"caps":["eth/62","eth/63"],"id":"node1","name":"Parity-Ethereum/1","network":{"localAddress":"127.0.0.1:8888","remoteAddress":"127.0.0.1:7777"},"protocols":{"eth":{"difficulty":"0x28","head":"0000000000000000000000000000000000000000000000000000000000000032","version":62},"pip":null}},{"caps":["eth/63","eth/64"],"id":null,"name":"Parity-Ethereum/2","network":{"localAddress":"127.0.0.1:3333","remoteAddress":"Handshake"},"protocols":{"eth":{"difficulty":null,"head":"000000000000000000000000000000000000000000000000000000000000003c","version":64},"pip":null}}]},"id":1}"#; assert_eq!(io.handle_request_sync(request), Some(response.to_owned())); } diff --git a/util/version/Cargo.toml b/util/version/Cargo.toml index 44e5cde36..1c674fb37 100644 --- a/util/version/Cargo.toml +++ b/util/version/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "parity-version" # NOTE: this value is used for Parity version string (via env CARGO_PKG_VERSION) -version = "1.12.0" +version = "2.0.0" authors = ["Parity Technologies "] build = "build.rs" diff --git a/util/version/src/lib.rs b/util/version/src/lib.rs index 79f11415e..a7452e0ce 100644 --- a/util/version/src/lib.rs +++ b/util/version/src/lib.rs @@ -54,7 +54,7 @@ pub fn version() -> String { let sha3_dash = if sha3.is_empty() { "" } else { "-" }; let commit_date = vergen::commit_date().replace("-", ""); let date_dash = if commit_date.is_empty() { "" } else { "-" }; - format!("Parity/v{}-{}{}{}{}{}/{}/rustc{}", env!("CARGO_PKG_VERSION"), THIS_TRACK, sha3_dash, sha3, date_dash, commit_date, platform(), generated::rustc_version()) + format!("Parity-Ethereum/v{}-{}{}{}{}{}/{}/rustc{}", env!("CARGO_PKG_VERSION"), THIS_TRACK, sha3_dash, sha3, date_dash, commit_date, platform(), generated::rustc_version()) } /// Get the standard version data for this software. @@ -65,7 +65,7 @@ pub fn version_data() -> Bytes { (env!("CARGO_PKG_VERSION_MINOR").parse::().expect("Environment variables are known to be valid; qed") << 8) + env!("CARGO_PKG_VERSION_PATCH").parse::().expect("Environment variables are known to be valid; qed"); s.append(&v); - s.append(&"Parity"); + s.append(&"Parity-Ethereum"); s.append(&generated::rustc_version()); s.append(&&Target::os()[0..2]); s.out()