From b7e9152cc27884437df5cf61a10ab7ae2a396373 Mon Sep 17 00:00:00 2001 From: Kirill Pimenov Date: Wed, 1 Nov 2017 11:06:03 +0100 Subject: [PATCH 1/8] Merge pull request #6921 from paritytech/windows-fixes Windows fixes --- nsis/installer.nsi | 4 ++-- nsis/logo.ico | Bin 67646 -> 116877 bytes parity/rpc.rs | 10 +++++++--- windows/ptray/ptray.cpp | 3 ++- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/nsis/installer.nsi b/nsis/installer.nsi index 39a5969c3..6a9c2a287 100644 --- a/nsis/installer.nsi +++ b/nsis/installer.nsi @@ -10,9 +10,9 @@ !define DESCRIPTION "Fast, light, robust Ethereum implementation" !define VERSIONMAJOR 1 !define VERSIONMINOR 8 -!define VERSIONBUILD 2 +!define VERSIONBUILD 3 !define ARGS "" -!define FIRST_START_ARGS "ui --mode=passive" +!define FIRST_START_ARGS "--mode=passive ui" !addplugindir .\ diff --git a/nsis/logo.ico b/nsis/logo.ico index 61e68b90b86ccb69f7c13a0595bba8ffd1943c4c..337475b70f72e51fd991f9b672a275eacd446b0d 100644 GIT binary patch literal 116877 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

j&l-4*pK#P|ohNsRb0h;wn#%t%?oX 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 literal 67646 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 let handler = setup_apis(conf.apis, dependencies); let remote = dependencies.remote.clone(); let path = PathBuf::from(&conf.socket_addr); - if let Some(dir) = path.parent() { - ::std::fs::create_dir_all(&dir) - .map_err(|err| format!("Unable to create IPC directory at {}: {}", dir.display(), err))?; + // Make sure socket file can be created on unix-like OS. + // Windows pipe paths are not on the FS. + if !cfg!(windows) { + if let Some(dir) = path.parent() { + ::std::fs::create_dir_all(&dir) + .map_err(|err| format!("Unable to create IPC directory at {}: {}", dir.display(), err))?; + } } match rpc::start_ipc(&conf.socket_addr, handler, remote, rpc::RpcExtractor) { diff --git a/windows/ptray/ptray.cpp b/windows/ptray/ptray.cpp index 30f41b35a..8fc29880e 100644 --- a/windows/ptray/ptray.cpp +++ b/windows/ptray/ptray.cpp @@ -315,8 +315,9 @@ void OpenUI() STARTUPINFO startupInfo = { sizeof(STARTUPINFO) }; LPWSTR args = new WCHAR[lstrlen(commandLineFiltered) + MAX_PATH + 2]; - lstrcpy(args, L"parity.exe ui "); + lstrcpy(args, L"parity.exe "); lstrcat(args, commandLineFiltered); + lstrcat(args, L" ui"); CreateProcess(path, args, nullptr, nullptr, false, CREATE_NO_WINDOW, nullptr, nullptr, &startupInfo, &procInfo); } From 303036cab07dda6684d1ecfceedd79c7ce535bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Wed, 1 Nov 2017 11:25:10 +0100 Subject: [PATCH 2/8] Fix serialization of status in transaction receipts. (#6926) --- rpc/src/v1/types/receipt.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rpc/src/v1/types/receipt.rs b/rpc/src/v1/types/receipt.rs index bb8af2cd0..e20856b82 100644 --- a/rpc/src/v1/types/receipt.rs +++ b/rpc/src/v1/types/receipt.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -use v1::types::{Log, H160, H256, H2048, U256}; +use v1::types::{Log, H160, H256, H2048, U256, U64}; use ethcore::receipt::{Receipt as EthReceipt, RichReceipt, LocalizedReceipt, TransactionOutcome}; /// Receipt @@ -51,7 +51,7 @@ pub struct Receipt { pub logs_bloom: H2048, /// Status code #[serde(rename="status")] - pub status_code: Option, + pub status_code: Option, } impl Receipt { @@ -62,10 +62,10 @@ impl Receipt { } } - fn outcome_to_status_code(outcome: &TransactionOutcome) -> Option { + fn outcome_to_status_code(outcome: &TransactionOutcome) -> Option { match *outcome { TransactionOutcome::Unknown | TransactionOutcome::StateRoot(_) => None, - TransactionOutcome::StatusCode(ref code) => Some(*code), + TransactionOutcome::StatusCode(ref code) => Some((*code as u64).into()), } } } @@ -131,7 +131,7 @@ mod tests { #[test] fn receipt_serialization() { - let s = r#"{"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","cumulativeGasUsed":"0x20","gasUsed":"0x10","contractAddress":null,"logs":[{"address":"0x33990122638b9132ca29c723bdf037f1a891a70c","topics":["0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc","0x4861736852656700000000000000000000000000000000000000000000000000"],"data":"0x","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","logIndex":"0x1","transactionLogIndex":null,"type":"mined"}],"root":"0x000000000000000000000000000000000000000000000000000000000000000a","logsBloom":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f","status":null}"#; + let s = r#"{"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","cumulativeGasUsed":"0x20","gasUsed":"0x10","contractAddress":null,"logs":[{"address":"0x33990122638b9132ca29c723bdf037f1a891a70c","topics":["0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc","0x4861736852656700000000000000000000000000000000000000000000000000"],"data":"0x","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","logIndex":"0x1","transactionLogIndex":null,"type":"mined"}],"root":"0x000000000000000000000000000000000000000000000000000000000000000a","logsBloom":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f","status":"0x1"}"#; let receipt = Receipt { transaction_hash: Some(0.into()), @@ -158,7 +158,7 @@ mod tests { }], logs_bloom: 15.into(), state_root: Some(10.into()), - status_code: None, + status_code: Some(1u64.into()), }; let serialized = serde_json::to_string(&receipt).unwrap(); From 454b4518f2a633899c3e841546f13d97775095da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Wed, 1 Nov 2017 11:29:03 +0100 Subject: [PATCH 3/8] Return decoded seal fields. (#6932) --- ethcore/src/header.rs | 15 ++++++++++++++- ethcore/src/views/header.rs | 10 +++++++++- rpc/src/v1/types/block.rs | 4 +++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/ethcore/src/header.rs b/ethcore/src/header.rs index 3f0c0109f..71c6e6bd3 100644 --- a/ethcore/src/header.rs +++ b/ethcore/src/header.rs @@ -162,6 +162,12 @@ impl Header { pub fn difficulty(&self) -> &U256 { &self.difficulty } /// Get the seal field of the header. pub fn seal(&self) -> &[Bytes] { &self.seal } + /// Get the seal field with RLP-decoded values as bytes. + pub fn decode_seal<'a, T: ::std::iter::FromIterator<&'a [u8]>>(&'a self) -> Result { + self.seal.iter().map(|rlp| { + UntrustedRlp::new(rlp).data() + }).collect() + } // TODO: seal_at, set_seal_at &c. @@ -340,13 +346,20 @@ mod tests { // that's rlp of block header created with ethash engine. let header_rlp = "f901f9a0d405da4e66f1445d455195229624e133f5baafe72b5cf7b3c36c12c8146e98b7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a05fb2b4bfdef7b314451cb138a534d225c922fc0e5fbe25e451142732c3e25c25a088d2ec6b9860aae1a2c3b299f72b6a5d70d7f7ba4722c78f2c49ba96273c2158a007c6fdfa8eea7e86b81f5b0fc0f78f90cc19f4aa60d323151e0cac660199e9a1b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefba82524d84568e932a80a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd88ab4e252a7e8c2a23".from_hex().unwrap(); let mix_hash = "a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd".from_hex().unwrap(); + let mix_hash_decoded = "a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd".from_hex().unwrap(); let nonce = "88ab4e252a7e8c2a23".from_hex().unwrap(); + let nonce_decoded = "ab4e252a7e8c2a23".from_hex().unwrap(); let header: Header = rlp::decode(&header_rlp); - let seal_fields = header.seal; + let seal_fields = header.seal.clone(); assert_eq!(seal_fields.len(), 2); assert_eq!(seal_fields[0], mix_hash); assert_eq!(seal_fields[1], nonce); + + let decoded_seal = header.decode_seal::>().unwrap(); + assert_eq!(decoded_seal.len(), 2); + assert_eq!(decoded_seal[0], &*mix_hash_decoded); + assert_eq!(decoded_seal[1], &*nonce_decoded); } #[test] diff --git a/ethcore/src/views/header.rs b/ethcore/src/views/header.rs index d308a042d..181a73a5d 100644 --- a/ethcore/src/views/header.rs +++ b/ethcore/src/views/header.rs @@ -21,7 +21,7 @@ use bigint::prelude::U256; use bigint::hash::{H256, H2048}; use util::Address; use bytes::Bytes; -use rlp::Rlp; +use rlp::{self, Rlp}; use header::BlockNumber; /// View onto block header rlp. @@ -99,6 +99,14 @@ impl<'a> HeaderView<'a> { } seal } + + /// Returns a vector of seal fields (RLP-decoded). + pub fn decode_seal(&self) -> Result, rlp::DecoderError> { + let seal = self.seal(); + seal.into_iter() + .map(|s| rlp::UntrustedRlp::new(&s).data().map(|x| x.to_vec())) + .collect() + } } #[cfg(test)] diff --git a/rpc/src/v1/types/block.rs b/rpc/src/v1/types/block.rs index 10f7a2476..cd2d83e0e 100644 --- a/rpc/src/v1/types/block.rs +++ b/rpc/src/v1/types/block.rs @@ -173,8 +173,10 @@ impl<'a> From<&'a EthHeader> for Header { logs_bloom: h.log_bloom().into(), timestamp: h.timestamp().into(), difficulty: h.difficulty().into(), - seal_fields: h.seal().into_iter().map(Into::into).collect(), extra_data: h.extra_data().into(), + seal_fields: h.view().decode_seal() + .expect("Client/Miner returns only valid headers. We only serialize headers from Client/Miner; qed") + .into_iter().map(Into::into).collect(), } } } From a2d5edb8f55c08366e69b0f2836afc4631dcad3b Mon Sep 17 00:00:00 2001 From: Alexey Date: Fri, 10 Nov 2017 18:03:32 +0300 Subject: [PATCH 4/8] Merge pull request #6967 from paritytech/wasm-elog Events in WASM runtime --- ethcore/res/wasm-tests | 2 +- ethcore/wasm/src/env.rs | 5 ++++ ethcore/wasm/src/runtime.rs | 59 +++++++++++++++++++++++++++++++++++++ ethcore/wasm/src/tests.rs | 36 +++++++++++++++++++++- 4 files changed, 100 insertions(+), 2 deletions(-) diff --git a/ethcore/res/wasm-tests b/ethcore/res/wasm-tests index c8129ce2f..94b7877b5 160000 --- a/ethcore/res/wasm-tests +++ b/ethcore/res/wasm-tests @@ -1 +1 @@ -Subproject commit c8129ce2f36c26ed634eda786960978a28e28d0e +Subproject commit 94b7877b5826a53627b8732ea0feb45869dd04ab diff --git a/ethcore/wasm/src/env.rs b/ethcore/wasm/src/env.rs index a09ceea86..4a518beec 100644 --- a/ethcore/wasm/src/env.rs +++ b/ethcore/wasm/src/env.rs @@ -147,6 +147,11 @@ pub const SIGNATURES: &'static [UserFunctionDescriptor] = &[ &[I32], None, ), + Static( + "_elog", + &[I32; 4], + None, + ), // TODO: Get rid of it also somehow? Static( diff --git a/ethcore/wasm/src/runtime.rs b/ethcore/wasm/src/runtime.rs index d26346a3e..39b239fe8 100644 --- a/ethcore/wasm/src/runtime.rs +++ b/ethcore/wasm/src/runtime.rs @@ -55,6 +55,8 @@ pub enum UserTrap { Unknown, /// Passed string had invalid utf-8 encoding BadUtf8, + /// Log event error + Log, /// Other error in native code Other, /// Panic with message @@ -75,6 +77,7 @@ impl ::std::fmt::Display for UserTrap { UserTrap::AllocationFailed => write!(f, "Memory allocation failed (OOM)"), UserTrap::BadUtf8 => write!(f, "String encoding is bad utf-8 sequence"), UserTrap::GasLimit => write!(f, "Invocation resulted in gas limit violated"), + UserTrap::Log => write!(f, "Error occured while logging an event"), UserTrap::Other => write!(f, "Other unspecified error"), UserTrap::Panic(ref msg) => write!(f, "Panic: {}", msg), } @@ -232,6 +235,21 @@ impl<'a, 'b> Runtime<'a, 'b> { } } + pub fn overflow_charge(&mut self, f: F) -> Result<(), InterpreterError> + where F: FnOnce(&vm::Schedule) -> Option + { + let amount = match f(self.ext.schedule()) { + Some(amount) => amount, + None => { return Err(UserTrap::GasLimit.into()); } + }; + + if !self.charge_gas(amount as u64) { + Err(UserTrap::GasLimit.into()) + } else { + Ok(()) + } + } + /// Invoke create in the state runtime pub fn create(&mut self, context: InterpreterCallerContext) -> Result, InterpreterError> @@ -749,6 +767,44 @@ impl<'a, 'b> Runtime<'a, 'b> { pub fn ext(&mut self) -> &mut vm::Ext { self.ext } + + pub fn log(&mut self, context: InterpreterCallerContext) + -> Result, InterpreterError> + { + // signature is: + // pub fn elog(topic_ptr: *const u8, topic_count: u32, data_ptr: *const u8, data_len: u32); + let data_len = context.value_stack.pop_as::()? as u32; + let data_ptr = context.value_stack.pop_as::()? as u32; + let topic_count = context.value_stack.pop_as::()? as u32; + let topic_ptr = context.value_stack.pop_as::()? as u32; + + if topic_count > 4 { + return Err(UserTrap::Log.into()); + } + + self.overflow_charge(|schedule| + { + let topics_gas = schedule.log_gas as u64 + schedule.log_topic_gas as u64 * topic_count as u64; + (schedule.log_data_gas as u64) + .checked_mul(schedule.log_data_gas as u64) + .and_then(|data_gas| data_gas.checked_add(topics_gas)) + } + )?; + + let mut topics: Vec = Vec::with_capacity(topic_count as usize); + topics.resize(topic_count as usize, H256::zero()); + for i in 0..topic_count { + let offset = i.checked_mul(32).ok_or(UserTrap::MemoryAccessViolation)? + .checked_add(topic_ptr).ok_or(UserTrap::MemoryAccessViolation)?; + + *topics.get_mut(i as usize) + .expect("topics is resized to `topic_count`, i is in 0..topic count iterator, get_mut uses i as an indexer, get_mut cannot fail; qed") + = H256::from(&self.memory.get(offset, 32)?[..]); + } + self.ext.log(topics, &self.memory.get(data_ptr, data_len as usize)?).map_err(|_| UserTrap::Log)?; + + Ok(None) + } } impl<'a, 'b> interpreter::UserFunctionExecutor for Runtime<'a, 'b> { @@ -833,6 +889,9 @@ impl<'a, 'b> interpreter::UserFunctionExecutor for Runtime<'a, 'b> { "_value" => { self.value(context) }, + "_elog" => { + self.log(context) + }, _ => { trace!(target: "wasm", "Trapped due to unhandled function: '{}'", name); Ok(self.unknown_trap(context)?) diff --git a/ethcore/wasm/src/tests.rs b/ethcore/wasm/src/tests.rs index c9174f288..245f27536 100644 --- a/ethcore/wasm/src/tests.rs +++ b/ethcore/wasm/src/tests.rs @@ -680,7 +680,6 @@ fn externs() { #[test] fn embedded_keccak() { - ::ethcore_logger::init_log(); let mut code = load_sample!("keccak.wasm"); code.extend_from_slice(b"something"); @@ -703,4 +702,39 @@ fn embedded_keccak() { assert_eq!(H256::from_slice(&result), H256::from("68371d7e884c168ae2022c82bd837d51837718a7f7dfb7aa3f753074a35e1d87")); assert_eq!(gas_left, U256::from(80_452)); +} + +/// This test checks the correctness of log extern +/// Target test puts one event with two topic [keccak(input), reverse(keccak(input))] +/// and reversed input as a data +#[test] +fn events() { + ::ethcore_logger::init_log(); + let code = load_sample!("events.wasm"); + + let mut params = ActionParams::default(); + params.gas = U256::from(100_000); + params.code = Some(Arc::new(code)); + params.data = Some(b"something".to_vec()); + + let mut ext = FakeExt::new(); + + let (gas_left, result) = { + let mut interpreter = wasm_interpreter(); + let result = interpreter.exec(params, &mut ext).expect("Interpreter to execute without any errors"); + match result { + GasLeft::Known(_) => { panic!("events should return payload"); }, + GasLeft::NeedsReturn { gas_left: gas, data: result, apply_state: _apply } => (gas, result.to_vec()), + } + }; + + assert_eq!(ext.logs.len(), 1); + let log_entry = &ext.logs[0]; + assert_eq!(log_entry.topics.len(), 2); + assert_eq!(&log_entry.topics[0], &H256::from("68371d7e884c168ae2022c82bd837d51837718a7f7dfb7aa3f753074a35e1d87")); + assert_eq!(&log_entry.topics[1], &H256::from("871d5ea37430753faab7dff7a7187783517d83bd822c02e28a164c887e1d3768")); + assert_eq!(&log_entry.data, b"gnihtemos"); + + assert_eq!(&result, b"gnihtemos"); + assert_eq!(gas_left, U256::from(78039)); } \ No newline at end of file From baa12237369e40e065c5b97773b24f64873dfecf Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Tue, 7 Nov 2017 09:21:30 +0100 Subject: [PATCH 5/8] Skip nonce check for gas estimation (#6997) --- ethcore/src/client/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethcore/src/client/client.rs b/ethcore/src/client/client.rs index 1b954b347..785d9782f 100644 --- a/ethcore/src/client/client.rs +++ b/ethcore/src/client/client.rs @@ -1241,7 +1241,7 @@ impl BlockChainClient for Client { // that's just a copy of the state. let original_state = self.state_at(block).ok_or(CallError::StatePruned)?; let sender = t.sender(); - let options = || TransactOptions::with_tracing(); + let options = || TransactOptions::with_tracing().dont_check_nonce(); let cond = |gas| { let mut tx = t.as_unsigned().clone(); From 91db3535f802770082d44f6238acbf4bdfdd770a Mon Sep 17 00:00:00 2001 From: Kirill Pimenov Date: Thu, 9 Nov 2017 14:42:17 +0100 Subject: [PATCH 6/8] Merge pull request #7004 from paritytech/cli-arguments-backwards-compatible Make CLI arguments parsing more backwards compatible --- Cargo.lock | 28 +++++++++--------- parity/cli/mod.rs | 47 ++++++++++++++++++----------- parity/cli/usage.rs | 65 ++++++++++++++++++++++++----------------- parity/configuration.rs | 6 ++-- parity/deprecated.rs | 6 ++++ 5 files changed, 92 insertions(+), 60 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1b5b86280..b72d6bb4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,17 +1,3 @@ -[root] -name = "wasm" -version = "0.1.0" -dependencies = [ - "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.1.3", - "ethcore-logger 1.8.0", - "ethcore-util 1.8.2", - "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", - "vm 0.1.0", - "wasm-utils 0.1.0 (git+https://github.com/paritytech/wasm-utils)", -] - [[package]] name = "adler32" version = "1.0.2" @@ -3580,6 +3566,20 @@ name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "wasm" +version = "0.1.0" +dependencies = [ + "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethcore-bigint 0.1.3", + "ethcore-logger 1.8.0", + "ethcore-util 1.8.2", + "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", + "vm 0.1.0", + "wasm-utils 0.1.0 (git+https://github.com/paritytech/wasm-utils)", +] + [[package]] name = "wasm-utils" version = "0.1.0" diff --git a/parity/cli/mod.rs b/parity/cli/mod.rs index 774256d02..3f5099b61 100644 --- a/parity/cli/mod.rs +++ b/parity/cli/mod.rs @@ -24,6 +24,7 @@ usage! { // Subcommands must start with cmd_ and have '_' in place of '-' // Sub-subcommands must start with the name of the subcommand // Arguments must start with arg_ + // Flags must start with flag_ CMD cmd_ui { "Manage ui", @@ -53,10 +54,6 @@ usage! { CMD cmd_account_new { "Create a new acount", - - ARG arg_account_new_password: (Option) = None, - "--password=[FILE]", - "Path to the password file", } CMD cmd_account_list { @@ -81,10 +78,6 @@ usage! { { "Import wallet", - ARG arg_wallet_import_password: (Option) = None, - "--password=[FILE]", - "Path to the password file", - ARG arg_wallet_import_path: (Option) = None, "", "Path to the wallet", @@ -179,10 +172,6 @@ usage! { { "Sign", - ARG arg_signer_sign_password: (Option) = None, - "--password=[FILE]", - "Path to the password file", - ARG arg_signer_sign_id: (Option) = None, "[ID]", "ID", @@ -244,7 +233,7 @@ usage! { } } { - // Flags and arguments + // Global flags and arguments ["Operating Options"] FLAG flag_public_node: (bool) = false, or |c: &Config| otry!(c.parity).public_node.clone(), "--public-node", @@ -353,7 +342,6 @@ usage! { ARG arg_password: (Vec) = Vec::new(), or |c: &Config| otry!(c.account).password.clone(), "--password=[FILE]...", "Provide a file containing a password for unlocking an account. Leading and trailing whitespace is trimmed.", - ["UI options"] FLAG flag_force_ui: (bool) = false, or |c: &Config| otry!(c.ui).force.clone(), "--force-ui", @@ -836,6 +824,10 @@ usage! { "Target size of the whisper message pool in megabytes.", ["Legacy options"] + FLAG flag_warp: (bool) = false, or |_| None, + "--warp", + "Does nothing; warp sync is enabled by default.", + FLAG flag_dapps_apis_all: (bool) = false, or |_| None, "--dapps-apis-all", "Dapps server is merged with RPC server. Use --jsonrpc-apis.", @@ -1203,6 +1195,29 @@ mod tests { use toml; use clap::{ErrorKind as ClapErrorKind}; + #[test] + fn should_accept_any_argument_order() { + let args = Args::parse(&["parity", "--no-warp", "account", "list"]).unwrap(); + assert_eq!(args.flag_no_warp, true); + + let args = Args::parse(&["parity", "account", "list", "--no-warp"]).unwrap(); + assert_eq!(args.flag_no_warp, true); + + let args = Args::parse(&["parity", "--chain=dev", "account", "list"]).unwrap(); + assert_eq!(args.arg_chain, "dev"); + + let args = Args::parse(&["parity", "account", "list", "--chain=dev"]).unwrap(); + assert_eq!(args.arg_chain, "dev"); + } + + #[test] + fn should_not_crash_on_warp() { + let args = Args::parse(&["parity", "--warp"]); + assert!(args.is_ok()); + + let args = Args::parse(&["parity", "account", "list", "--warp"]); + assert!(args.is_ok()); + } #[test] fn should_reject_invalid_values() { @@ -1375,9 +1390,6 @@ mod tests { arg_restore_file: None, arg_tools_hash_file: None, - arg_account_new_password: None, - arg_signer_sign_password: None, - arg_wallet_import_password: None, arg_signer_sign_id: None, arg_signer_reject_id: None, arg_dapp_path: None, @@ -1559,6 +1571,7 @@ mod tests { arg_whisper_pool_size: 20, // -- Legacy Options + flag_warp: false, flag_geth: false, flag_testnet: false, flag_import_geth_keys: false, diff --git a/parity/cli/usage.rs b/parity/cli/usage.rs index 83b878ee1..71ac01295 100644 --- a/parity/cli/usage.rs +++ b/parity/cli/usage.rs @@ -153,7 +153,7 @@ macro_rules! usage { use std::{fs, io, process}; use std::io::{Read, Write}; use util::version; - use clap::{Arg, App, SubCommand, AppSettings, Error as ClapError, ErrorKind as ClapErrorKind}; + use clap::{Arg, App, SubCommand, AppSettings, ArgMatches as ClapArgMatches, Error as ClapError, ErrorKind as ClapErrorKind}; use helpers::replace_home; use std::ffi::OsStr; use std::collections::HashMap; @@ -503,6 +503,36 @@ macro_rules! usage { args } + pub fn hydrate_with_globals(self: &mut Self, matches: &ClapArgMatches) -> Result<(), ClapError> { + $( + $( + self.$flag = self.$flag || matches.is_present(stringify!($flag)); + )* + $( + if let some @ Some(_) = return_if_parse_error!(if_option!( + $($arg_type_tt)+, + THEN { + if_option_vec!( + $($arg_type_tt)+, + THEN { values_t!(matches, stringify!($arg), inner_option_vec_type!($($arg_type_tt)+)) } + ELSE { value_t!(matches, stringify!($arg), inner_option_type!($($arg_type_tt)+)) } + ) + } + ELSE { + if_vec!( + $($arg_type_tt)+, + THEN { values_t!(matches, stringify!($arg), inner_vec_type!($($arg_type_tt)+)) } + ELSE { value_t!(matches, stringify!($arg), $($arg_type_tt)+) } + ) + } + )) { + self.$arg = some; + } + )* + )* + Ok(()) + } + #[allow(unused_variables)] // the submatches of arg-less subcommands aren't used pub fn parse>(command: &[S]) -> Result { @@ -559,12 +589,14 @@ macro_rules! usage { SubCommand::with_name(&underscore_to_hyphen!(&stringify!($subc)[4..])) .about($subc_help) .args(&subc_usages.get(stringify!($subc)).unwrap().iter().map(|u| Arg::from_usage(u).use_delimiter(false).allow_hyphen_values(true)).collect::>()) + .args(&usages.iter().map(|u| Arg::from_usage(u).use_delimiter(false).allow_hyphen_values(true)).collect::>()) // accept global arguments at this position $( .setting(AppSettings::SubcommandRequired) // prevent from running `parity account` .subcommand( SubCommand::with_name(&underscore_to_hyphen!(&stringify!($subc_subc)[stringify!($subc).len()+1..])) .about($subc_subc_help) .args(&subc_usages.get(stringify!($subc_subc)).unwrap().iter().map(|u| Arg::from_usage(u).use_delimiter(false).allow_hyphen_values(true)).collect::>()) + .args(&usages.iter().map(|u| Arg::from_usage(u).use_delimiter(false).allow_hyphen_values(true)).collect::>()) // accept global arguments at this position ) )* ) @@ -572,36 +604,16 @@ macro_rules! usage { .get_matches_from_safe(command.iter().map(|x| OsStr::new(x.as_ref())))?; let mut raw_args : RawArgs = Default::default(); - $( - $( - raw_args.$flag = matches.is_present(stringify!($flag)); - )* - $( - raw_args.$arg = return_if_parse_error!(if_option!( - $($arg_type_tt)+, - THEN { - if_option_vec!( - $($arg_type_tt)+, - THEN { values_t!(matches, stringify!($arg), inner_option_vec_type!($($arg_type_tt)+)) } - ELSE { value_t!(matches, stringify!($arg), inner_option_type!($($arg_type_tt)+)) } - ) - } - ELSE { - if_vec!( - $($arg_type_tt)+, - THEN { values_t!(matches, stringify!($arg), inner_vec_type!($($arg_type_tt)+)) } - ELSE { value_t!(matches, stringify!($arg), $($arg_type_tt)+) } - ) - } - )); - )* - )* + + raw_args.hydrate_with_globals(&matches)?; // Subcommands $( if let Some(submatches) = matches.subcommand_matches(&underscore_to_hyphen!(&stringify!($subc)[4..])) { raw_args.$subc = true; + // Globals + raw_args.hydrate_with_globals(&submatches)?; // Subcommand flags $( raw_args.$subc_flag = submatches.is_present(&stringify!($subc_flag)); @@ -626,12 +638,13 @@ macro_rules! usage { } )); )* - // Sub-subcommands $( if let Some(subsubmatches) = submatches.subcommand_matches(&underscore_to_hyphen!(&stringify!($subc_subc)[stringify!($subc).len()+1..])) { raw_args.$subc_subc = true; + // Globals + raw_args.hydrate_with_globals(&subsubmatches)?; // Sub-subcommand flags $( raw_args.$subc_subc_flag = subsubmatches.is_present(&stringify!($subc_subc_flag)); diff --git a/parity/configuration.rs b/parity/configuration.rs index 83b71f05d..dc390d5e7 100644 --- a/parity/configuration.rs +++ b/parity/configuration.rs @@ -143,7 +143,7 @@ impl Configuration { if self.args.cmd_signer_new_token { Cmd::SignerToken(ws_conf, ui_conf, logger_config.clone()) } else if self.args.cmd_signer_sign { - let pwfile = self.args.arg_signer_sign_password.map(|pwfile| { + let pwfile = self.args.arg_password.first().map(|pwfile| { PathBuf::from(pwfile) }); Cmd::SignerSign { @@ -180,7 +180,7 @@ impl Configuration { iterations: self.args.arg_keys_iterations, path: dirs.keys, spec: spec, - password_file: self.args.arg_account_new_password.clone(), + password_file: self.args.arg_password.first().map(|x| x.to_owned()), }; AccountCmd::New(new_acc) } else if self.args.cmd_account_list { @@ -215,7 +215,7 @@ impl Configuration { path: dirs.keys, spec: spec, wallet_path: self.args.arg_wallet_import_path.unwrap().clone(), - password_file: self.args.arg_wallet_import_password, + password_file: self.args.arg_password.first().map(|x| x.to_owned()), }; Cmd::ImportPresaleWallet(presale_cmd) } else if self.args.cmd_import { diff --git a/parity/deprecated.rs b/parity/deprecated.rs index d80ea3357..b41475d9d 100644 --- a/parity/deprecated.rs +++ b/parity/deprecated.rs @@ -37,6 +37,10 @@ impl fmt::Display for Deprecated { pub fn find_deprecated(args: &Args) -> Vec { let mut result = vec![]; + if args.flag_warp { + result.push(Deprecated::DoesNothing("--warp")); + } + if args.flag_jsonrpc { result.push(Deprecated::DoesNothing("--jsonrpc")); } @@ -117,6 +121,7 @@ mod tests { assert_eq!(find_deprecated(&Args::default()), vec![]); assert_eq!(find_deprecated(&{ let mut args = Args::default(); + args.flag_warp = true; args.flag_jsonrpc = true; args.flag_rpc = true; args.flag_jsonrpc_off = true; @@ -135,6 +140,7 @@ mod tests { args.flag_dapps_apis_all = true; args }), vec![ + Deprecated::DoesNothing("--warp"), Deprecated::DoesNothing("--jsonrpc"), Deprecated::DoesNothing("--rpc"), Deprecated::Replaced("--jsonrpc-off", "--no-jsonrpc"), From 6ad5d559ca0c21cf1b85b7aadcf36b4ec1e76529 Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 13 Nov 2017 15:31:35 +0100 Subject: [PATCH 7/8] version 1.8.3 --- Cargo.lock | 52 +++++++++++++++++++++++----------------------- Cargo.toml | 2 +- mac/Parity.pkgproj | 2 +- util/Cargo.toml | 2 +- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b72d6bb4f..0c21081be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -360,7 +360,7 @@ dependencies = [ "bloomable 0.1.0", "ethcore-bigint 0.1.3", "ethcore-bytes 0.1.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "ethjson 0.1.0", "hash 0.1.0", "heapsize 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -574,7 +574,7 @@ dependencies = [ "ethcore-ipc-nano 1.8.0", "ethcore-logger 1.8.0", "ethcore-stratum 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "ethjson 0.1.0", "ethkey 0.2.0", "ethstore 0.1.0", @@ -668,7 +668,7 @@ version = "1.8.0" dependencies = [ "ethcore-bigint 0.1.3", "ethcore-devtools 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "nanomsg 0.5.1 (git+https://github.com/paritytech/nanomsg.rs.git?branch=parity-1.7)", "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -718,7 +718,7 @@ dependencies = [ "ethcore-ipc 1.8.0", "ethcore-ipc-codegen 1.8.0", "ethcore-ipc-nano 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "nanomsg 0.5.1 (git+https://github.com/paritytech/nanomsg.rs.git?branch=parity-1.7)", "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -737,7 +737,7 @@ dependencies = [ "ethcore-ipc 1.8.0", "ethcore-ipc-codegen 1.8.0", "ethcore-network 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "evm 0.1.0", "futures 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "hash 0.1.0", @@ -787,7 +787,7 @@ dependencies = [ "ethcore-devtools 1.8.0", "ethcore-io 1.8.0", "ethcore-logger 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "ethcrypto 0.1.0", "ethkey 0.2.0", "hash 0.1.0", @@ -822,7 +822,7 @@ dependencies = [ "ethcore-ipc-codegen 1.8.0", "ethcore-ipc-nano 1.8.0", "ethcore-logger 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "ethcrypto 0.1.0", "ethkey 0.2.0", "futures 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", @@ -857,7 +857,7 @@ dependencies = [ "ethcore-ipc-codegen 1.8.0", "ethcore-ipc-nano 1.8.0", "ethcore-logger 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "hash 0.1.0", "jsonrpc-core 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.8)", "jsonrpc-macros 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.8)", @@ -870,7 +870,7 @@ dependencies = [ [[package]] name = "ethcore-util" -version = "1.8.2" +version = "1.8.3" dependencies = [ "clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1004,7 +1004,7 @@ dependencies = [ "ethcore-ipc-nano 1.8.0", "ethcore-light 1.8.0", "ethcore-network 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "ethkey 0.2.0", "hash 0.1.0", "heapsize 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1030,7 +1030,7 @@ dependencies = [ "common-types 0.1.0", "ethcore-bigint 0.1.3", "ethcore-logger 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "ethjson 0.1.0", "evmjit 1.8.0", "hash 0.1.0", @@ -1052,7 +1052,7 @@ dependencies = [ "ethcore 1.8.0", "ethcore-bigint 0.1.3", "ethcore-bytes 0.1.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "ethjson 0.1.0", "evm 0.1.0", "panic_hook 0.1.0", @@ -1350,7 +1350,7 @@ dependencies = [ "ethcore-bigint 0.1.3", "ethcore-ipc 1.8.0", "ethcore-ipc-codegen 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1843,7 +1843,7 @@ dependencies = [ "ethcore-bytes 0.1.0", "ethcore-io 1.8.0", "ethcore-network 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "futures 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2042,7 +2042,7 @@ dependencies = [ [[package]] name = "parity" -version = "1.8.2" +version = "1.8.3" dependencies = [ "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "app_dirs 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2066,7 +2066,7 @@ dependencies = [ "ethcore-network 1.8.0", "ethcore-secretstore 1.0.0", "ethcore-stratum 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "ethkey 0.2.0", "ethsync 1.8.0", "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2122,7 +2122,7 @@ dependencies = [ "ethcore-bigint 0.1.3", "ethcore-bytes 0.1.0", "ethcore-devtools 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "fetch 0.1.0", "futures 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2184,7 +2184,7 @@ dependencies = [ "ethabi 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-bigint 0.1.3", "ethcore-bytes 0.1.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "fetch 0.1.0", "futures 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "hash 0.1.0", @@ -2206,7 +2206,7 @@ dependencies = [ "ethcore 1.8.0", "ethcore-bigint 0.1.3", "ethcore-bytes 0.1.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "jsonrpc-core 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.8)", "jsonrpc-http-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.8)", "multihash 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2220,7 +2220,7 @@ version = "0.1.0" dependencies = [ "ethcore 1.8.0", "ethcore-io 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "ethkey 0.2.0", "kvdb 0.1.0", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2235,7 +2235,7 @@ name = "parity-machine" version = "0.1.0" dependencies = [ "ethcore-bigint 0.1.3", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", ] [[package]] @@ -2263,7 +2263,7 @@ dependencies = [ "ethcore-light 1.8.0", "ethcore-logger 1.8.0", "ethcore-network 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "ethcrypto 0.1.0", "ethjson 0.1.0", "ethkey 0.2.0", @@ -2373,7 +2373,7 @@ dependencies = [ "ethcore-bytes 0.1.0", "ethcore-ipc 1.8.0", "ethcore-ipc-codegen 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "ethsync 1.8.0", "futures 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-common-types 1.8.0", @@ -2835,7 +2835,7 @@ name = "rpc-cli" version = "1.4.0" dependencies = [ "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "futures 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "parity-rpc 1.8.0", "parity-rpc-client 1.4.0", @@ -3551,7 +3551,7 @@ dependencies = [ "common-types 0.1.0", "ethcore-bigint 0.1.3", "ethcore-bytes 0.1.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "ethjson 0.1.0", "evmjit 1.8.0", "hash 0.1.0", @@ -3573,7 +3573,7 @@ dependencies = [ "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-bigint 0.1.3", "ethcore-logger 1.8.0", - "ethcore-util 1.8.2", + "ethcore-util 1.8.3", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", "vm 0.1.0", diff --git a/Cargo.toml b/Cargo.toml index 68cb241c9..161a24e1b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Parity Ethereum client" name = "parity" -version = "1.8.2" +version = "1.8.3" license = "GPL-3.0" authors = ["Parity Technologies "] build = "build.rs" diff --git a/mac/Parity.pkgproj b/mac/Parity.pkgproj index 40700589b..a04116dda 100755 --- a/mac/Parity.pkgproj +++ b/mac/Parity.pkgproj @@ -462,7 +462,7 @@ OVERWRITE_PERMISSIONS VERSION - 1.8.2 + 1.8.3 UUID 2DCD5B81-7BAF-4DA1-9251-6274B089FD36 diff --git a/util/Cargo.toml b/util/Cargo.toml index 349c48980..197d3ce83 100644 --- a/util/Cargo.toml +++ b/util/Cargo.toml @@ -3,7 +3,7 @@ description = "Ethcore utility library" homepage = "http://parity.io" license = "GPL-3.0" name = "ethcore-util" -version = "1.8.2" +version = "1.8.3" authors = ["Parity Technologies "] build = "build.rs" From 561e8432074e3bc7a1b41471420977922f3d38d2 Mon Sep 17 00:00:00 2001 From: Sergey Pepyakin Date: Mon, 13 Nov 2017 00:21:15 +0300 Subject: [PATCH 8/8] pwasm-std update (#7018) --- Cargo.lock | 8 +- ethcore/res/wasm-tests | 2 +- ethcore/vm/src/schedule.rs | 14 ++-- ethcore/wasm/src/env.rs | 29 ++++++-- ethcore/wasm/src/runtime.rs | 102 ++++++++++++++++---------- ethcore/wasm/src/tests.rs | 142 +++++++++++++++++++++++++++++------- 6 files changed, 212 insertions(+), 85 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0c21081be..d9368a859 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2387,7 +2387,7 @@ dependencies = [ [[package]] name = "parity-wasm" -version = "0.15.1" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3575,7 +3575,7 @@ dependencies = [ "ethcore-logger 1.8.0", "ethcore-util 1.8.3", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)", "vm 0.1.0", "wasm-utils 0.1.0 (git+https://github.com/paritytech/wasm-utils)", ] @@ -3591,7 +3591,7 @@ dependencies = [ "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3815,7 +3815,7 @@ dependencies = [ "checksum parity-dapps-glue 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddaeb8543c6823e93dae65a25eb8083ebfeee8f0000031119d7a0055b2e8fc63" "checksum parity-tokio-ipc 0.1.5 (git+https://github.com/nikvolf/parity-tokio-ipc)" = "" "checksum parity-ui-precompiled 1.4.0 (git+https://github.com/paritytech/js-precompiled.git?branch=beta)" = "" -"checksum parity-wasm 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "95f6243c2d6fadf903b5edfd0011817efc20522ce5f360abf4648c24ea87581a" +"checksum parity-wasm 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8431a184ad88cfbcd71a792aaca319cc7203a94300c26b8dce2d0df0681ea87d" "checksum parity-wordlist 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "81451bfab101d186f8fc4a0aa13cb5539b31b02c4ed96425a0842e2a413daba6" "checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" "checksum parking_lot_core 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4f610cb9664da38e417ea3225f23051f589851999535290e077939838ab7a595" diff --git a/ethcore/res/wasm-tests b/ethcore/res/wasm-tests index 94b7877b5..9a1fcbf0d 160000 --- a/ethcore/res/wasm-tests +++ b/ethcore/res/wasm-tests @@ -1 +1 @@ -Subproject commit 94b7877b5826a53627b8732ea0feb45869dd04ab +Subproject commit 9a1fcbf0d4e73bea437577e807bc38c7ba243d80 diff --git a/ethcore/vm/src/schedule.rs b/ethcore/vm/src/schedule.rs index 21924afea..e250bfa1c 100644 --- a/ethcore/vm/src/schedule.rs +++ b/ethcore/vm/src/schedule.rs @@ -127,12 +127,14 @@ pub struct WasmCosts { pub mul: u32, /// Memory (load/store) operations multiplier. pub mem: u32, - /// Memory copy operation. + /// Memory copy operation, per byte. pub mem_copy: u32, + /// Memory move operation, per byte. + pub mem_move: u32, + /// Memory set operation, per byte. + pub mem_set: u32, /// Static region charge, per byte. pub static_region: u32, - /// General static query of u64 value from env-info - pub static_u64: u32, /// General static query of U256 value from env-info pub static_u256: u32, /// General static query of Address value from env-info @@ -147,11 +149,9 @@ impl Default for WasmCosts { mul: 4, mem: 2, mem_copy: 1, + mem_move: 1, + mem_set: 1, static_region: 1, - - // due to runtime issues, this can be slow - static_u64: 32, - static_u256: 64, static_address: 40, } diff --git a/ethcore/wasm/src/env.rs b/ethcore/wasm/src/env.rs index 4a518beec..1a2f5fd3b 100644 --- a/ethcore/wasm/src/env.rs +++ b/ethcore/wasm/src/env.rs @@ -38,12 +38,12 @@ pub const SIGNATURES: &'static [UserFunctionDescriptor] = &[ None, ), Static( - "_malloc", + "_ext_malloc", &[I32], Some(I32), ), Static( - "_free", + "_ext_free", &[I32], None, ), @@ -92,6 +92,21 @@ pub const SIGNATURES: &'static [UserFunctionDescriptor] = &[ &[I32; 3], Some(I32), ), + Static( + "_ext_memcpy", + &[I32; 3], + Some(I32), + ), + Static( + "_ext_memset", + &[I32; 3], + Some(I32), + ), + Static( + "_ext_memmove", + &[I32; 3], + Some(I32), + ), Static( "_panic", &[I32; 2], @@ -99,7 +114,7 @@ pub const SIGNATURES: &'static [UserFunctionDescriptor] = &[ ), Static( "_blockhash", - &[I32; 3], + &[I64, I32], Some(I32), ), Static( @@ -130,12 +145,12 @@ pub const SIGNATURES: &'static [UserFunctionDescriptor] = &[ Static( "_timestamp", &[], - Some(I32), + Some(I64), ), Static( "_blocknumber", &[], - Some(I32), + Some(I64), ), Static( "_difficulty", @@ -162,8 +177,8 @@ pub const SIGNATURES: &'static [UserFunctionDescriptor] = &[ Static( "_llvm_bswap_i64", - &[I32; 2], - Some(I32) + &[I64], + Some(I64) ), ]; diff --git a/ethcore/wasm/src/runtime.rs b/ethcore/wasm/src/runtime.rs index 39b239fe8..e5a6dc910 100644 --- a/ethcore/wasm/src/runtime.rs +++ b/ethcore/wasm/src/runtime.rs @@ -560,32 +560,67 @@ impl<'a, 'b> Runtime<'a, 'b> { fn mem_copy(&mut self, context: InterpreterCallerContext) -> Result, InterpreterError> { + // + // method signature: + // fn memcpy(dest: *const u8, src: *const u8, len: u32) -> *mut u8; + // + let len = context.value_stack.pop_as::()? as u32; - let dst = context.value_stack.pop_as::()? as u32; let src = context.value_stack.pop_as::()? as u32; + let dst = context.value_stack.pop_as::()? as u32; self.charge(|schedule| schedule.wasm.mem_copy as u64 * len as u64)?; - let mem = self.memory().get(src, len as usize)?; - self.memory().set(dst, &mem)?; + self.memory().copy_nonoverlapping(src as usize, dst as usize, len as usize)?; - Ok(Some(0i32.into())) + Ok(Some(Into::into(dst as i32))) } - fn bswap_32(x: u32) -> u32 { - x >> 24 | x >> 8 & 0xff00 | x << 8 & 0xff0000 | x << 24 + fn mem_move(&mut self, context: InterpreterCallerContext) + -> Result, InterpreterError> + { + // + // method signature: + // fn memmove(dest: *const u8, src: *const u8, len: u32) -> *mut u8; + // + + let len = context.value_stack.pop_as::()? as u32; + let src = context.value_stack.pop_as::()? as u32; + let dst = context.value_stack.pop_as::()? as u32; + + self.charge(|schedule| schedule.wasm.mem_move as u64 * len as u64)?; + + self.memory().copy(src as usize, dst as usize, len as usize)?; + + Ok(Some(Into::into(dst as i32))) + } + + fn mem_set(&mut self, context: InterpreterCallerContext) + -> Result, InterpreterError> + { + // + // method signature: + // fn memset(dest: *const u8, c: u32, len: u32) -> *mut u8; + // + + let len = context.value_stack.pop_as::()? as u32; + let c = context.value_stack.pop_as::()? as u32; + let dst = context.value_stack.pop_as::()? as u32; + + self.charge(|schedule| schedule.wasm.mem_set as u64 * len as u64)?; + + self.memory().clear(dst as usize, c as u8, len as usize)?; + + Ok(Some(Into::into(dst as i32))) } fn bitswap_i64(&mut self, context: InterpreterCallerContext) -> Result, InterpreterError> { - let x1 = context.value_stack.pop_as::()?; - let x2 = context.value_stack.pop_as::()?; + let x = context.value_stack.pop_as::()?; + let result = x.swap_bytes(); - let result = ((Runtime::bswap_32(x2 as u32) as u64) << 32 - | Runtime::bswap_32(x1 as u32) as u64) as i64; - - self.return_i64(result) + Ok(Some(result.into())) } fn user_panic(&mut self, context: InterpreterCallerContext) @@ -606,13 +641,10 @@ impl<'a, 'b> Runtime<'a, 'b> { -> Result, InterpreterError> { let return_ptr = context.value_stack.pop_as::()? as u32; - let block_hi = context.value_stack.pop_as::()? as u32; - let block_lo = context.value_stack.pop_as::()? as u32; + let block_num = context.value_stack.pop_as::()? as u64; self.charge(|schedule| schedule.blockhash_gas as u64)?; - let block_num = (block_hi as u64) << 32 | block_lo as u64; - trace!("Requesting block hash for block #{}", block_num); let hash = self.ext.blockhash(&U256::from(block_num)); @@ -694,14 +726,14 @@ impl<'a, 'b> Runtime<'a, 'b> { -> Result, InterpreterError> { let timestamp = self.ext.env_info().timestamp as i64; - self.return_i64(timestamp) + Ok(Some(timestamp.into())) } fn block_number(&mut self, _context: InterpreterCallerContext) -> Result, InterpreterError> { - let block_number: u64 = self.ext.env_info().number.into(); - self.return_i64(block_number as i64) + let block_number = self.ext.env_info().number as i64; + Ok(Some(block_number.into())) } fn difficulty(&mut self, context: InterpreterCallerContext) @@ -726,25 +758,6 @@ impl<'a, 'b> Runtime<'a, 'b> { Ok(None) } - fn return_i64(&mut self, val: i64) -> Result, InterpreterError> { - self.charge(|schedule| schedule.wasm.static_u64 as u64)?; - - let uval = val as u64; - let hi = (uval >> 32) as i32; - let lo = (uval << 32 >> 32) as i32; - - let target = self.instance.module("contract").ok_or(UserTrap::Other)?; - target.execute_export( - "setTempRet0", - self.execution_params().add_argument( - interpreter::RuntimeValue::I32(hi).into() - ), - )?; - Ok(Some( - (lo).into() - )) - } - pub fn execution_params(&mut self) -> interpreter::ExecutionParams { use super::env; @@ -812,10 +825,10 @@ impl<'a, 'b> interpreter::UserFunctionExecutor for Runtime<'a, 'b> { -> Result, InterpreterError> { match name { - "_malloc" => { + "_ext_malloc" => { self.malloc(context) }, - "_free" => { + "_ext_free" => { // Since it is arena allocator, free does nothing // todo: update if changed self.user_noop(context) @@ -853,6 +866,15 @@ impl<'a, 'b> interpreter::UserFunctionExecutor for Runtime<'a, 'b> { "_emscripten_memcpy_big" => { self.mem_copy(context) }, + "_ext_memcpy" => { + self.mem_copy(context) + }, + "_ext_memmove" => { + self.mem_move(context) + }, + "_ext_memset" => { + self.mem_set(context) + }, "_llvm_bswap_i64" => { self.bitswap_i64(context) }, diff --git a/ethcore/wasm/src/tests.rs b/ethcore/wasm/src/tests.rs index 245f27536..0a93be11c 100644 --- a/ethcore/wasm/src/tests.rs +++ b/ethcore/wasm/src/tests.rs @@ -60,7 +60,7 @@ fn empty() { test_finalize(interpreter.exec(params, &mut ext)).unwrap() }; - assert_eq!(gas_left, U256::from(99_976)); + assert_eq!(gas_left, U256::from(99_982)); } // This test checks if the contract deserializes payload header properly. @@ -89,7 +89,6 @@ fn logger() { test_finalize(interpreter.exec(params, &mut ext)).unwrap() }; - assert_eq!(gas_left, U256::from(15_177)); let address_val: H256 = address.into(); assert_eq!( ext.store.get(&"0100000000000000000000000000000000000000000000000000000000000000".parse().unwrap()).expect("storage key to exist"), @@ -113,6 +112,7 @@ fn logger() { U256::from(1_000_000_000), "Logger sets 0x04 key to the trasferred value" ); + assert_eq!(gas_left, U256::from(19_143)); } // This test checks if the contract can allocate memory and pass pointer to the result stream properly. @@ -142,13 +142,12 @@ fn identity() { } }; - assert_eq!(gas_left, U256::from(99_695)); - assert_eq!( Address::from_slice(&result), sender, "Idenity test contract does not return the sender passed" ); + assert_eq!(gas_left, U256::from(99_844)); } // Dispersion test sends byte array and expect the contract to 'disperse' the original elements with @@ -176,12 +175,12 @@ fn dispersion() { } }; - assert_eq!(gas_left, U256::from(96_543)); assert_eq!( result, vec![0u8, 0, 125, 11, 197, 7, 255, 8, 19, 0] ); + assert_eq!(gas_left, U256::from(99_469)); } #[test] @@ -205,12 +204,11 @@ fn suicide_not() { } }; - assert_eq!(gas_left, U256::from(96_822)); - assert_eq!( result, vec![0u8] ); + assert_eq!(gas_left, U256::from(99_724)); } #[test] @@ -241,8 +239,8 @@ fn suicide() { } }; - assert_eq!(gas_left, U256::from(96_580)); assert!(ext.suicides.contains(&refund)); + assert_eq!(gas_left, U256::from(99_663)); } #[test] @@ -272,7 +270,7 @@ fn create() { assert!(ext.calls.contains( &FakeCall { call_type: FakeCallType::Create, - gas: U256::from(62_324), + gas: U256::from(65_903), sender_address: None, receive_address: None, value: Some(1_000_000_000.into()), @@ -280,7 +278,7 @@ fn create() { code_address: None, } )); - assert_eq!(gas_left, U256::from(62_289)); + assert_eq!(gas_left, U256::from(65_896)); } @@ -314,7 +312,7 @@ fn call_code() { assert!(ext.calls.contains( &FakeCall { call_type: FakeCallType::Call, - gas: U256::from(95_585), + gas: U256::from(98_709), sender_address: Some(sender), receive_address: Some(receiver), value: None, @@ -322,11 +320,11 @@ fn call_code() { code_address: Some("0d13710000000000000000000000000000000000".parse().unwrap()), } )); - assert_eq!(gas_left, U256::from(90_665)); // siphash result let res = LittleEndian::read_u32(&result[..]); assert_eq!(res, 4198595614); + assert_eq!(gas_left, U256::from(93_851)); } #[test] @@ -359,7 +357,7 @@ fn call_static() { assert!(ext.calls.contains( &FakeCall { call_type: FakeCallType::Call, - gas: U256::from(95_585), + gas: U256::from(98_709), sender_address: Some(sender), receive_address: Some(receiver), value: None, @@ -367,11 +365,12 @@ fn call_static() { code_address: Some("13077bfb00000000000000000000000000000000".parse().unwrap()), } )); - assert_eq!(gas_left, U256::from(90_665)); // siphash result let res = LittleEndian::read_u32(&result[..]); assert_eq!(res, 317632590); + + assert_eq!(gas_left, U256::from(93_851)); } // Realloc test @@ -393,8 +392,8 @@ fn realloc() { GasLeft::NeedsReturn { gas_left: gas, data: result, apply_state: _apply } => (gas, result.to_vec()), } }; - assert_eq!(gas_left, U256::from(96_811)); assert_eq!(result, vec![0u8; 2]); + assert_eq!(gas_left, U256::from(99_787)); } // Tests that contract's ability to read from a storage @@ -419,8 +418,8 @@ fn storage_read() { } }; - assert_eq!(gas_left, U256::from(96_645)); assert_eq!(Address::from(&result[12..32]), address); + assert_eq!(gas_left, U256::from(99_702)); } // Tests keccak calculation @@ -446,9 +445,97 @@ fn keccak() { }; assert_eq!(H256::from_slice(&result), H256::from("68371d7e884c168ae2022c82bd837d51837718a7f7dfb7aa3f753074a35e1d87")); - assert_eq!(gas_left, U256::from(80_452)); + assert_eq!(gas_left, U256::from(84_520)); } +// memcpy test. +#[test] +fn memcpy() { + ::ethcore_logger::init_log(); + let code = load_sample!("mem.wasm"); + + let mut test_payload = Vec::with_capacity(8192); + for i in 0..8192 { + test_payload.push((i % 255) as u8); + } + let mut data = vec![0u8]; + data.extend(&test_payload); + + let mut params = ActionParams::default(); + params.gas = U256::from(100_000); + params.code = Some(Arc::new(code)); + params.data = Some(data); + let mut ext = FakeExt::new(); + + let (gas_left, result) = { + let mut interpreter = wasm_interpreter(); + let result = interpreter.exec(params, &mut ext).expect("Interpreter to execute without any errors"); + match result { + GasLeft::Known(_) => { panic!("mem should return payload"); }, + GasLeft::NeedsReturn { gas_left: gas, data: result, apply_state: _apply } => (gas, result.to_vec()), + } + }; + + assert_eq!(result, test_payload); + assert_eq!(gas_left, U256::from(75_324)); +} + +// memmove test. +#[test] +fn memmove() { + ::ethcore_logger::init_log(); + let code = load_sample!("mem.wasm"); + + let mut test_payload = Vec::with_capacity(8192); + for i in 0..8192 { + test_payload.push((i % 255) as u8); + } + let mut data = vec![1u8]; + data.extend(&test_payload); + + let mut params = ActionParams::default(); + params.gas = U256::from(100_000); + params.code = Some(Arc::new(code)); + params.data = Some(data); + let mut ext = FakeExt::new(); + + let (gas_left, result) = { + let mut interpreter = wasm_interpreter(); + let result = interpreter.exec(params, &mut ext).expect("Interpreter to execute without any errors"); + match result { + GasLeft::Known(_) => { panic!("mem should return payload"); }, + GasLeft::NeedsReturn { gas_left: gas, data: result, apply_state: _apply } => (gas, result.to_vec()), + } + }; + + assert_eq!(result, test_payload); + assert_eq!(gas_left, U256::from(75_324)); +} + +// memset test +#[test] +fn memset() { + ::ethcore_logger::init_log(); + let code = load_sample!("mem.wasm"); + + let mut params = ActionParams::default(); + params.gas = U256::from(100_000); + params.code = Some(Arc::new(code)); + params.data = Some(vec![2u8, 228u8]); + let mut ext = FakeExt::new(); + + let (gas_left, result) = { + let mut interpreter = wasm_interpreter(); + let result = interpreter.exec(params, &mut ext).expect("Interpreter to execute without any errors"); + match result { + GasLeft::Known(_) => { panic!("mem should return payload"); }, + GasLeft::NeedsReturn { gas_left: gas, data: result, apply_state: _apply } => (gas, result.to_vec()), + } + }; + + assert_eq!(result, vec![228u8; 8192]); + assert_eq!(gas_left, U256::from(75_324)); +} macro_rules! reqrep_test { ($name: expr, $input: expr) => { @@ -500,11 +587,11 @@ fn math_add() { } ).expect("Interpreter to execute without any errors"); - assert_eq!(gas_left, U256::from(94_666)); assert_eq!( U256::from_dec_str("1888888888888888888888888888887").unwrap(), (&result[..]).into() ); + assert_eq!(gas_left, U256::from(98_576)); } // multiplication @@ -522,11 +609,11 @@ fn math_mul() { } ).expect("Interpreter to execute without any errors"); - assert_eq!(gas_left, U256::from(93_719)); assert_eq!( U256::from_dec_str("888888888888888888888888888887111111111111111111111111111112").unwrap(), (&result[..]).into() ); + assert_eq!(gas_left, U256::from(97_726)); } // subtraction @@ -544,11 +631,11 @@ fn math_sub() { } ).expect("Interpreter to execute without any errors"); - assert_eq!(gas_left, U256::from(94_718)); assert_eq!( U256::from_dec_str("111111111111111111111111111111").unwrap(), (&result[..]).into() ); + assert_eq!(gas_left, U256::from(98_568)); } // subtraction with overflow @@ -566,7 +653,10 @@ fn math_sub_with_overflow() { } ); - assert_eq!(result, Err(vm::Error::Wasm("Wasm runtime error: User(Panic(\"arithmetic operation overflow\"))".into()))); + match result { + Err(vm::Error::Wasm(_)) => {}, + _ => panic!("Unexpected result {:?}", result), + } } #[test] @@ -583,11 +673,11 @@ fn math_div() { } ).expect("Interpreter to execute without any errors"); - assert_eq!(gas_left, U256::from(86_996)); assert_eq!( U256::from_dec_str("1125000").unwrap(), (&result[..]).into() ); + assert_eq!(gas_left, U256::from(91_564)); } // This test checks the ability of wasm contract to invoke @@ -675,7 +765,7 @@ fn externs() { "Gas limit requested and returned does not match" ); - assert_eq!(gas_left, U256::from(91_857)); + assert_eq!(gas_left, U256::from(97_740)); } #[test] @@ -701,7 +791,7 @@ fn embedded_keccak() { }; assert_eq!(H256::from_slice(&result), H256::from("68371d7e884c168ae2022c82bd837d51837718a7f7dfb7aa3f753074a35e1d87")); - assert_eq!(gas_left, U256::from(80_452)); + assert_eq!(gas_left, U256::from(84_520)); } /// This test checks the correctness of log extern @@ -736,5 +826,5 @@ fn events() { assert_eq!(&log_entry.data, b"gnihtemos"); assert_eq!(&result, b"gnihtemos"); - assert_eq!(gas_left, U256::from(78039)); -} \ No newline at end of file + assert_eq!(gas_left, U256::from(82_721)); +}