implement contract events (#2161)

* implement contract events

* update runtime

* renaming

* update test code hash

* improve complexity details

* add deposit event base cost

* add test

* Revert "add deposit event base cost"

This reverts commit 58ec010c0f4f4f0e16935ad41da32aedd17a8c57.

* update test

* Revert "update test"

This reverts commit 6fe61a593ccf0d41f09a0b97472b28ed8751a999.

* Revert "Revert "add deposit event base cost""

This reverts commit 145e8a9bac15313a4c380aa66b94fd4d36fa3f6d.

* Fix format a bit
This commit is contained in:
thiolliere
2019-04-03 08:20:01 +02:00
committed by Gav Wood
parent e6cc49cf63
commit c98db99d80
8 changed files with 117 additions and 10 deletions
+27 -1
View File
@@ -24,7 +24,7 @@ use system;
use rstd::prelude::*;
use rstd::mem;
use parity_codec::{Decode, Encode};
use runtime_primitives::traits::{As, CheckedMul, Bounded};
use runtime_primitives::traits::{As, CheckedMul, CheckedAdd, Bounded};
/// Enumerates all possible *special* trap conditions.
///
@@ -108,6 +108,9 @@ pub enum RuntimeToken<Gas> {
ReturnData(u32),
/// Dispatch fee calculated by `T::ComputeDispatchFee`.
ComputedDispatchFee(Gas),
/// The given number of bytes is read from the sandbox memory and
/// deposit in as an event.
DepositEvent(u32),
}
impl<T: Trait> Token<T> for RuntimeToken<T::Gas> {
@@ -126,6 +129,10 @@ impl<T: Trait> Token<T> for RuntimeToken<T::Gas> {
ReturnData(byte_count) => metadata
.return_data_per_byte_cost
.checked_mul(&<T::Gas as As<u32>>::sa(byte_count)),
DepositEvent(byte_count) => metadata
.event_data_per_byte_cost
.checked_mul(&<T::Gas as As<u32>>::sa(byte_count))
.and_then(|e| e.checked_add(&metadata.event_data_base_cost)),
ComputedDispatchFee(gas) => Some(gas),
};
@@ -582,4 +589,23 @@ define_env!(Env, <E: Ext>,
Ok(())
},
// Deposit a contract event with the data buffer.
ext_deposit_event(ctx, data_ptr: u32, data_len: u32) => {
match ctx
.gas_meter
.charge(
ctx.schedule,
RuntimeToken::DepositEvent(data_len)
)
{
GasMeterResult::Proceed => (),
GasMeterResult::OutOfGas => return Err(sandbox::HostError),
}
let event_data = read_sandbox_memory(ctx, data_ptr, data_len)?;
ctx.ext.deposit_event(event_data);
Ok(())
},
);