2016-02-05 13:40:41 +01:00
|
|
|
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
|
|
|
// This file is part of Parity.
|
|
|
|
|
|
|
|
// Parity is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// Parity is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2016-02-04 23:58:58 +01:00
|
|
|
//! Receipt
|
|
|
|
|
2016-01-09 12:30:41 +01:00
|
|
|
use util::*;
|
2016-01-09 22:13:13 +01:00
|
|
|
use basic_types::LogBloom;
|
2016-01-11 13:29:15 +01:00
|
|
|
use log_entry::LogEntry;
|
2016-01-09 23:47:15 +01:00
|
|
|
|
2015-12-20 21:45:43 +01:00
|
|
|
/// Information describing execution of a transaction.
|
2016-01-26 19:18:22 +01:00
|
|
|
#[derive(Default, Debug, Clone)]
|
2015-12-20 13:16:12 +01:00
|
|
|
pub struct Receipt {
|
2016-02-03 13:20:32 +01:00
|
|
|
/// The state root after executing the transaction.
|
2015-12-20 13:16:12 +01:00
|
|
|
pub state_root: H256,
|
2016-02-03 13:20:32 +01:00
|
|
|
/// The total gas used in the block following execution of the transaction.
|
2016-01-08 22:04:21 +01:00
|
|
|
pub gas_used: U256,
|
2016-02-03 13:20:32 +01:00
|
|
|
/// The OR-wide combination of all logs' blooms for this transaction.
|
2016-01-09 22:13:13 +01:00
|
|
|
pub log_bloom: LogBloom,
|
2016-02-03 13:20:32 +01:00
|
|
|
/// The logs stemming from this transaction.
|
2016-01-09 23:47:15 +01:00
|
|
|
pub logs: Vec<LogEntry>,
|
|
|
|
}
|
|
|
|
|
2016-01-11 17:37:22 +01:00
|
|
|
impl Receipt {
|
2016-02-03 13:20:32 +01:00
|
|
|
/// Create a new receipt.
|
2016-01-11 17:37:22 +01:00
|
|
|
pub fn new(state_root: H256, gas_used: U256, logs: Vec<LogEntry>) -> Receipt {
|
|
|
|
Receipt {
|
|
|
|
state_root: state_root,
|
|
|
|
gas_used: gas_used,
|
2016-02-19 00:23:05 +01:00
|
|
|
log_bloom: logs.iter().fold(LogBloom::new(), |mut b, l| { b = &b | &l.bloom(); b }), //TODO: use |= operator
|
2016-01-11 17:37:22 +01:00
|
|
|
logs: logs,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-27 17:22:01 +01:00
|
|
|
impl Encodable for Receipt {
|
2016-01-09 23:47:15 +01:00
|
|
|
fn rlp_append(&self, s: &mut RlpStream) {
|
2016-01-27 17:22:01 +01:00
|
|
|
s.begin_list(4);
|
2016-01-09 23:47:15 +01:00
|
|
|
s.append(&self.state_root);
|
|
|
|
s.append(&self.gas_used);
|
|
|
|
s.append(&self.log_bloom);
|
2016-01-28 20:13:05 +01:00
|
|
|
s.append(&self.logs);
|
2016-01-09 23:47:15 +01:00
|
|
|
}
|
2015-12-20 13:16:12 +01:00
|
|
|
}
|
2016-01-30 14:00:36 +01:00
|
|
|
|
2016-02-17 12:35:37 +01:00
|
|
|
impl Decodable for Receipt {
|
|
|
|
fn decode<D>(decoder: &D) -> Result<Self, DecoderError> where D: Decoder {
|
|
|
|
let d = decoder.as_rlp();
|
|
|
|
let receipt = Receipt {
|
|
|
|
state_root: try!(d.val_at(0)),
|
|
|
|
gas_used: try!(d.val_at(1)),
|
|
|
|
log_bloom: try!(d.val_at(2)),
|
|
|
|
logs: try!(d.val_at(3)),
|
|
|
|
};
|
|
|
|
Ok(receipt)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl HeapSizeOf for Receipt {
|
|
|
|
fn heap_size_of_children(&self) -> usize {
|
|
|
|
self.logs.heap_size_of_children()
|
|
|
|
}
|
|
|
|
}
|
2016-01-30 14:00:36 +01:00
|
|
|
|
2016-02-01 01:03:57 +01:00
|
|
|
#[test]
|
|
|
|
fn test_basic() {
|
2016-02-01 11:00:18 +01:00
|
|
|
let expected = FromHex::from_hex("f90162a02f697d671e9ae4ee24a43c4b0d7e15f1cb4ba6de1561120d43b9a4e8c4a8a6ee83040caeb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000f838f794dcf421d093428b096ca501a7cd1a740855a7976fc0a00000000000000000000000000000000000000000000000000000000000000000").unwrap();
|
2016-02-01 01:03:57 +01:00
|
|
|
let r = Receipt::new(
|
|
|
|
x!("2f697d671e9ae4ee24a43c4b0d7e15f1cb4ba6de1561120d43b9a4e8c4a8a6ee"),
|
|
|
|
x!(0x40cae),
|
2016-02-16 18:21:45 +01:00
|
|
|
vec![LogEntry {
|
|
|
|
address: x!("dcf421d093428b096ca501a7cd1a740855a7976f"),
|
|
|
|
topics: vec![],
|
|
|
|
data: vec![0u8; 32]
|
|
|
|
}]
|
2016-02-01 01:03:57 +01:00
|
|
|
);
|
|
|
|
assert_eq!(&encode(&r)[..], &expected[..]);
|
2016-01-30 14:00:36 +01:00
|
|
|
}
|