diff --git a/ethcore/private-tx/src/lib.rs b/ethcore/private-tx/src/lib.rs index 7b8b24c7c..d59c52308 100644 --- a/ethcore/private-tx/src/lib.rs +++ b/ethcore/private-tx/src/lib.rs @@ -499,6 +499,7 @@ impl Provider where { None => bail!(ErrorKind::ContractDoesNotExist), Some(address) => { let (code, storage) = state.into_account(&address)?; + trace!(target: "privatetx", "Private contract executed. code: {:?}, state: {:?}, result: {:?}", code, storage, result.output); let enc_code = match code { Some(c) => Some(self.encrypt(&address, &Self::iv_from_address(&address), &c)?), None => None, @@ -506,7 +507,6 @@ impl Provider where { (enc_code, self.encrypt(&address, &Self::iv_from_transaction(transaction), &Self::snapshot_from_storage(&storage))?) }, }; - trace!(target: "privatetx", "Private contract executed. code: {:?}, state: {:?}, result: {:?}", encrypted_code, encrypted_storage, result.output); Ok(PrivateExecutionResult { code: encrypted_code, state: encrypted_storage, diff --git a/ethcore/private-tx/tests/private_contract.rs b/ethcore/private-tx/tests/private_contract.rs index b2c08ace2..4ec1e18c1 100644 --- a/ethcore/private-tx/tests/private_contract.rs +++ b/ethcore/private-tx/tests/private_contract.rs @@ -91,6 +91,17 @@ fn private_contract() { trace!("Transaction created. Pushing block"); push_block_with_transactions(&client, &[public_tx]); + trace!("Querying default private state"); + let mut query_tx = Transaction::default(); + query_tx.action = Action::Call(address.clone()); + query_tx.data = "0c55699c".from_hex().unwrap(); // getX + query_tx.gas = 50000.into(); + query_tx.nonce = 1.into(); + let query_tx = query_tx.sign(&key1.secret(), chain_id); + let result = pm.private_call(BlockId::Latest, &query_tx).unwrap(); + assert_eq!(&result.output[..], &("0000000000000000000000000000000000000000000000000000000000000000".from_hex().unwrap()[..])); + assert_eq!(pm.get_validators(BlockId::Latest, &address).unwrap(), validators); + trace!("Modifying private state"); let mut private_tx = Transaction::default(); private_tx.action = Action::Call(address.clone()); diff --git a/ethcore/src/state/account.rs b/ethcore/src/state/account.rs index 160152fc7..274366b6d 100644 --- a/ethcore/src/state/account.rs +++ b/ethcore/src/state/account.rs @@ -204,6 +204,10 @@ impl Account { self.code_filth = Filth::Dirty; self.storage_cache = Self::empty_storage_cache(); self.storage_changes = storage; + if self.storage_root != KECCAK_NULL_RLP { + self.original_storage_cache = Some((self.storage_root, Self::empty_storage_cache())); + } + self.storage_root = KECCAK_NULL_RLP; } /// Set (and cache) the contents of the trie's storage at `key` to `value`.