Skip to content

Commit a906371

Browse files
Seulgi Kimsgkim126
authored andcommitted
Remove chain_getParcelInvoices and add chain_getParcelInvoice
Currently, chain_getParcelInvoices returns the transaction invoices that the parcel contains. It is because a parcel itself doesn't have an invoice. But the next patch will make some parcels contain an invoice instead of a transaction invoice. This patch changes the RPC to prepare the next patch.
1 parent 17bd24d commit a906371

File tree

11 files changed

+150
-62
lines changed

11 files changed

+150
-62
lines changed

core/src/block.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use rlp::{Decodable, DecoderError, Encodable, RlpStream, UntrustedRlp};
2323
use trie::TrieFactory;
2424
use unexpected::Mismatch;
2525

26-
use super::blockchain::ParcelInvoices;
26+
use super::blockchain::ParcelInvoice;
2727
use super::consensus::CodeChainEngine;
2828
use super::error::{BlockError, Error};
2929
use super::header::{Header, Seal};
@@ -73,7 +73,7 @@ pub struct ExecutedBlock {
7373
header: Header,
7474
state: State<StateDB>,
7575
parcels: Vec<SignedParcel>,
76-
invoices: Vec<ParcelInvoices>,
76+
invoices: Vec<ParcelInvoice>,
7777
parcels_set: HashSet<H256>,
7878
}
7979

@@ -356,7 +356,7 @@ pub trait IsBlock {
356356
}
357357

358358
/// Get all information on receipts in this block.
359-
fn invoices(&self) -> &[ParcelInvoices] {
359+
fn invoices(&self) -> &[ParcelInvoice] {
360360
&self.block().invoices
361361
}
362362

core/src/blockchain/blockchain.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use super::super::views::{BlockView, HeaderView};
3232
use super::block_info::BlockLocation;
3333
use super::body_db::{BodyDB, BodyProvider};
3434
use super::extras::{
35-
BlockDetails, BlockInvoices, EpochTransitions, ParcelAddress, ParcelInvoices, TransactionAddress, EPOCH_KEY_PREFIX,
35+
BlockDetails, BlockInvoices, EpochTransitions, ParcelAddress, ParcelInvoice, TransactionAddress, EPOCH_KEY_PREFIX,
3636
};
3737
use super::headerchain::{HeaderChain, HeaderProvider};
3838
use super::invoice_db::{InvoiceDB, InvoiceProvider};
@@ -96,7 +96,7 @@ impl BlockChain {
9696
/// Inserts the block into backing cache database.
9797
/// Expects the block to be valid and already verified.
9898
/// If the block is already known, does nothing.
99-
pub fn insert_block(&self, batch: &mut DBTransaction, bytes: &[u8], invoices: Vec<ParcelInvoices>) -> ImportRoute {
99+
pub fn insert_block(&self, batch: &mut DBTransaction, bytes: &[u8], invoices: Vec<ParcelInvoice>) -> ImportRoute {
100100
// create views onto rlp
101101
let block = BlockView::new(bytes);
102102
let header = block.header_view();
@@ -427,8 +427,8 @@ impl InvoiceProvider for BlockChain {
427427
}
428428

429429
/// Get parcel invoice.
430-
fn parcel_invoices(&self, address: &ParcelAddress) -> Option<ParcelInvoices> {
431-
self.invoice_db.parcel_invoices(address)
430+
fn parcel_invoice(&self, address: &ParcelAddress) -> Option<ParcelInvoice> {
431+
self.invoice_db.parcel_invoice(address)
432432
}
433433
}
434434

core/src/blockchain/extras.rs

Lines changed: 120 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -194,50 +194,68 @@ pub struct TransactionAddress {
194194
}
195195

196196

197-
#[derive(Clone, Debug, PartialEq, RlpEncodableWrapper, RlpDecodableWrapper)]
198-
pub struct ParcelInvoices {
199-
pub invoices: Vec<Invoice>,
197+
#[derive(Clone, Debug, PartialEq, Serialize)]
198+
#[serde(untagged)]
199+
pub enum ParcelInvoice {
200+
Single(Invoice),
201+
Multiple(Vec<Invoice>),
200202
}
201203

202-
impl ParcelInvoices {
204+
impl ParcelInvoice {
203205
pub fn new(invoices: Vec<Invoice>) -> Self {
204-
Self {
205-
invoices,
206+
ParcelInvoice::Multiple(invoices)
207+
}
208+
209+
pub fn iter<'a>(&'a self) -> Box<::std::iter::Iterator<Item = &'a Invoice> + 'a> {
210+
match self {
211+
ParcelInvoice::Single(invoice) => Box::new(::std::iter::once(invoice)),
212+
ParcelInvoice::Multiple(invoices) => Box::new(invoices.iter()),
206213
}
207214
}
215+
}
208216

209-
pub fn iter(&self) -> ::std::slice::Iter<Invoice> {
210-
self.invoices.iter()
217+
impl Encodable for ParcelInvoice {
218+
fn rlp_append(&self, s: &mut RlpStream) {
219+
match self {
220+
ParcelInvoice::Single(invoice) => {
221+
s.append(invoice);
222+
}
223+
ParcelInvoice::Multiple(invoices) => {
224+
s.append_list(invoices);
225+
}
226+
}
211227
}
212228
}
213229

214-
impl Into<Vec<Invoice>> for ParcelInvoices {
215-
fn into(self) -> Vec<Invoice> {
216-
self.invoices
230+
impl Decodable for ParcelInvoice {
231+
fn decode(rlp: &UntrustedRlp) -> Result<ParcelInvoice, DecoderError> {
232+
Ok(if rlp.is_list() {
233+
ParcelInvoice::Multiple(rlp.as_list()?)
234+
} else {
235+
ParcelInvoice::Single(rlp.as_val()?)
236+
})
217237
}
218238
}
219239

220-
impl<'a> Into<&'a Vec<Invoice>> for &'a ParcelInvoices {
221-
fn into(self) -> &'a Vec<Invoice> {
222-
&self.invoices
240+
impl Into<Vec<Invoice>> for ParcelInvoice {
241+
fn into(self) -> Vec<Invoice> {
242+
self.iter().cloned().collect()
223243
}
224244
}
225245

226-
impl From<Vec<Invoice>> for ParcelInvoices {
246+
impl From<Vec<Invoice>> for ParcelInvoice {
227247
fn from(invoices: Vec<Invoice>) -> Self {
228-
Self {
229-
invoices,
230-
}
248+
ParcelInvoice::Multiple(invoices)
231249
}
232250
}
233251

234252
#[derive(Clone, Debug, PartialEq)]
235253
pub struct BlockInvoices {
236-
pub invoices: Vec<ParcelInvoices>,
254+
pub invoices: Vec<ParcelInvoice>,
237255
}
238256

239257
impl BlockInvoices {
240-
pub fn new(invoices: Vec<ParcelInvoices>) -> Self {
258+
pub fn new(invoices: Vec<ParcelInvoice>) -> Self {
241259
Self {
242260
invoices,
243261
}
@@ -248,7 +266,7 @@ impl Decodable for BlockInvoices {
248266
fn decode(rlp: &UntrustedRlp) -> Result<Self, DecoderError> {
249267
let invoices = rlp.as_list::<Vec<u8>>()?
250268
.iter()
251-
.map(|parcel_invoices| UntrustedRlp::new(&parcel_invoices).as_val::<ParcelInvoices>())
269+
.map(|parcel_invoice| UntrustedRlp::new(&parcel_invoice).as_val::<ParcelInvoice>())
252270
.collect::<Result<Vec<_>, _>>()?;
253271
Ok(Self {
254272
invoices,
@@ -279,7 +297,7 @@ mod tests {
279297
use rlp::{Encodable, UntrustedRlp};
280298

281299
#[test]
282-
fn rlp_encode_and_decode_parcel_invoices() {
300+
fn rlp_encode_and_decode_parcel_invoice() {
283301
let invoices = vec![
284302
Invoice::Success,
285303
Invoice::Success,
@@ -288,33 +306,100 @@ mod tests {
288306
Invoice::Success,
289307
Invoice::Success,
290308
];
291-
let parcel_invoices = ParcelInvoices {
292-
invoices,
293-
};
294-
let rlp_encoded = parcel_invoices.rlp_bytes();
309+
let parcel_invoice = ParcelInvoice::new(invoices);
310+
let rlp_encoded = parcel_invoice.rlp_bytes();
295311
let stream = UntrustedRlp::new(&rlp_encoded);
296312
let rlp_decoded = stream.as_val();
297-
assert_eq!(Ok(parcel_invoices), rlp_decoded);
313+
assert_eq!(Ok(parcel_invoice), rlp_decoded);
298314
}
299315

300316
#[test]
301317
fn rlp_encode_and_decode_block_invoices() {
302318
let invoices = vec![Invoice::Success, Invoice::Failed];
303-
let parcel_invoices = ParcelInvoices {
304-
invoices,
305-
};
319+
let parcel_invoice = ParcelInvoice::new(invoices);
306320
let block_invoices = BlockInvoices {
307321
invoices: vec![
308-
parcel_invoices.clone(),
309-
parcel_invoices.clone(),
310-
parcel_invoices.clone(),
311-
parcel_invoices.clone(),
322+
parcel_invoice.clone(),
323+
parcel_invoice.clone(),
324+
parcel_invoice.clone(),
325+
parcel_invoice.clone(),
312326
],
313327
};
314328
let rlp_encoded = block_invoices.rlp_bytes();
315-
println!("..:{:?}:", rlp_encoded);
316329
let rlp = UntrustedRlp::new(&rlp_encoded);
317330
let rlp_decoded = rlp.as_val();
318331
assert_eq!(Ok(block_invoices), rlp_decoded);
319332
}
333+
334+
#[test]
335+
fn encode_and_decode_single_success_parcel_invoice() {
336+
let parcel_invoice = ParcelInvoice::Single(Invoice::Success);
337+
338+
let encoded = parcel_invoice.rlp_bytes();
339+
let rlp = UntrustedRlp::new(&encoded);
340+
let decoded = rlp.as_val();
341+
342+
assert_eq!(Ok(parcel_invoice), decoded);
343+
}
344+
345+
#[test]
346+
fn encode_and_decode_single_failed_parcel_invoice() {
347+
let parcel_invoice = ParcelInvoice::Single(Invoice::Failed);
348+
349+
let encoded = parcel_invoice.rlp_bytes();
350+
let rlp = UntrustedRlp::new(&encoded);
351+
let decoded = rlp.as_val();
352+
353+
assert_eq!(Ok(parcel_invoice), decoded);
354+
}
355+
356+
#[test]
357+
fn encode_and_decode_empty_multiple_parcel_invoice() {
358+
let parcel_invoice = ParcelInvoice::Multiple(vec![]);
359+
360+
let encoded = parcel_invoice.rlp_bytes();
361+
let rlp = UntrustedRlp::new(&encoded);
362+
let decoded = rlp.as_val();
363+
364+
assert_eq!(Ok(parcel_invoice), decoded);
365+
}
366+
367+
#[test]
368+
fn encode_and_decode_multiple_parcel_invoice_with_success() {
369+
let parcel_invoice = ParcelInvoice::Multiple(vec![Invoice::Success]);
370+
371+
let encoded = parcel_invoice.rlp_bytes();
372+
let rlp = UntrustedRlp::new(&encoded);
373+
let decoded = rlp.as_val();
374+
375+
assert_eq!(Ok(parcel_invoice), decoded);
376+
}
377+
378+
#[test]
379+
fn encode_and_decode_multiple_parcel_invoice_with_failed() {
380+
let parcel_invoice = ParcelInvoice::Multiple(vec![Invoice::Failed]);
381+
382+
let encoded = parcel_invoice.rlp_bytes();
383+
let rlp = UntrustedRlp::new(&encoded);
384+
let decoded = rlp.as_val();
385+
386+
assert_eq!(Ok(parcel_invoice), decoded);
387+
}
388+
389+
#[test]
390+
fn encode_and_decode_multiple_parcel_invoice() {
391+
let parcel_invoice = ParcelInvoice::Multiple(vec![
392+
Invoice::Failed,
393+
Invoice::Success,
394+
Invoice::Success,
395+
Invoice::Success,
396+
Invoice::Success,
397+
]);
398+
399+
let encoded = parcel_invoice.rlp_bytes();
400+
let rlp = UntrustedRlp::new(&encoded);
401+
let decoded = rlp.as_val();
402+
403+
assert_eq!(Ok(parcel_invoice), decoded);
404+
}
320405
}

core/src/blockchain/invoice_db.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use kvdb::{DBTransaction, KeyValueDB};
2222
use parking_lot::RwLock;
2323

2424
use super::super::db::{self, CacheUpdatePolicy, Readable, Writable};
25-
use super::extras::{BlockInvoices, ParcelAddress, ParcelInvoices};
25+
use super::extras::{BlockInvoices, ParcelAddress, ParcelInvoice};
2626

2727
/// Structure providing fast access to blockchain data.
2828
///
@@ -46,7 +46,7 @@ impl InvoiceDB {
4646
/// Inserts the block into backing cache database.
4747
/// Expects the block to be valid and already verified.
4848
/// If the block is already known, does nothing.
49-
pub fn insert_invoice(&self, batch: &mut DBTransaction, hash: &H256, invoices: Vec<ParcelInvoices>) {
49+
pub fn insert_invoice(&self, batch: &mut DBTransaction, hash: &H256, invoices: Vec<ParcelInvoice>) {
5050
if self.is_known_invoice(hash) {
5151
return
5252
}
@@ -68,7 +68,7 @@ pub trait InvoiceProvider {
6868
fn block_invoices(&self, hash: &H256) -> Option<BlockInvoices>;
6969

7070
/// Get parcel invoice.
71-
fn parcel_invoices(&self, address: &ParcelAddress) -> Option<ParcelInvoices>;
71+
fn parcel_invoice(&self, address: &ParcelAddress) -> Option<ParcelInvoice>;
7272
}
7373

7474
impl InvoiceProvider for InvoiceDB {
@@ -83,7 +83,7 @@ impl InvoiceProvider for InvoiceDB {
8383
}
8484

8585
/// Get parcel invoice.
86-
fn parcel_invoices(&self, address: &ParcelAddress) -> Option<ParcelInvoices> {
86+
fn parcel_invoice(&self, address: &ParcelAddress) -> Option<ParcelInvoice> {
8787
self.block_invoices(&address.block_hash)
8888
.and_then(|bi| bi.invoices.into_iter().nth(address.index))
8989
.map(Into::into)

core/src/blockchain/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ mod route;
2424

2525
pub use self::blockchain::{BlockChain, BlockProvider};
2626
pub use self::body_db::BodyProvider;
27-
pub use self::extras::{BlockDetails, ParcelAddress, ParcelInvoices, TransactionAddress};
27+
pub use self::extras::{BlockDetails, ParcelAddress, ParcelInvoice, TransactionAddress};
2828
pub use self::headerchain::HeaderProvider;
2929
pub use self::invoice_db::InvoiceProvider;
3030
pub use self::route::ImportRoute;

core/src/client/client.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use trie::{TrieFactory, TrieSpec};
3131
use super::super::block::{enact, ClosedBlock, Drain, IsBlock, LockedBlock, OpenBlock, SealedBlock};
3232
use super::super::blockchain::{
3333
BlockChain, BlockProvider, BodyProvider, HeaderProvider, ImportRoute, InvoiceProvider, ParcelAddress,
34-
ParcelInvoices, TransactionAddress,
34+
ParcelInvoice, TransactionAddress,
3535
};
3636
use super::super::consensus::epoch::Transition as EpochTransition;
3737
use super::super::consensus::CodeChainEngine;
@@ -383,18 +383,20 @@ impl BlockChainClient for Client {
383383
self.parcel_address(id).and_then(|address| chain.parcel(&address))
384384
}
385385

386-
fn parcel_invoices(&self, id: ParcelId) -> Option<ParcelInvoices> {
386+
fn parcel_invoice(&self, id: ParcelId) -> Option<ParcelInvoice> {
387387
let chain = self.chain.read();
388-
self.parcel_address(id).and_then(|address| chain.parcel_invoices(&address))
388+
self.parcel_address(id).and_then(|address| chain.parcel_invoice(&address))
389389
}
390390

391391
fn transaction_invoice(&self, id: TransactionId) -> Option<Invoice> {
392392
self.transaction_address(id).and_then(|transaction_address| {
393393
let parcel_address = transaction_address.parcel_address.clone();
394394
let parcel_id = parcel_address.into();
395395

396-
self.parcel_invoices(parcel_id)
397-
.and_then(|invoices| invoices.invoices.get(transaction_address.index).cloned())
396+
self.parcel_invoice(parcel_id).and_then(|parcel_invoice| match parcel_invoice {
397+
ParcelInvoice::Multiple(invoices) => invoices.get(transaction_address.index).cloned(),
398+
ParcelInvoice::Single(_) => None,
399+
})
398400
})
399401
}
400402
}

core/src/client/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use cnetwork::NodeId;
3131
use ctypes::{Address, Bytes, H256, Public, U256};
3232

3333
use super::block::{ClosedBlock, OpenBlock, SealedBlock};
34-
use super::blockchain::ParcelInvoices;
34+
use super::blockchain::ParcelInvoice;
3535
use super::blockchain_info::BlockChainInfo;
3636
use super::encoded;
3737
use super::error::BlockImportError;
@@ -184,7 +184,7 @@ pub trait BlockChainClient: Sync + Send + AccountData + BlockChain + ImportBlock
184184
fn parcel(&self, id: ParcelId) -> Option<LocalizedParcel>;
185185

186186
/// Get parcel invoice with given hash.
187-
fn parcel_invoices(&self, id: ParcelId) -> Option<ParcelInvoices>;
187+
fn parcel_invoice(&self, id: ParcelId) -> Option<ParcelInvoice>;
188188

189189
fn transaction_invoice(&self, id: TransactionId) -> Option<Invoice>;
190190
}

core/src/client/test_client.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ use rlp::*;
4646
use trie;
4747

4848
use super::super::block::{ClosedBlock, OpenBlock, SealedBlock};
49-
use super::super::blockchain::ParcelInvoices;
49+
use super::super::blockchain::ParcelInvoice;
5050
use super::super::blockchain_info::BlockChainInfo;
5151
use super::super::client::ImportResult;
5252
use super::super::client::{
@@ -507,7 +507,7 @@ impl BlockChainClient for TestBlockChainClient {
507507
unimplemented!();
508508
}
509509

510-
fn parcel_invoices(&self, _id: ParcelId) -> Option<ParcelInvoices> {
510+
fn parcel_invoice(&self, _id: ParcelId) -> Option<ParcelInvoice> {
511511
unimplemented!();
512512
}
513513

core/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ mod tests;
8686

8787
pub use account_provider::AccountProvider;
8888
pub use block::Block;
89+
pub use blockchain::ParcelInvoice;
8990
pub use client::{
9091
Balance, BlockChainClient, BlockInfo, ChainInfo, ChainNotify, Client, ImportBlock, Nonce, RegularKey,
9192
TestBlockChainClient,

0 commit comments

Comments
 (0)