Skip to content

Commit fc8e630

Browse files
majectysgkim126
authored andcommitted
Add error information to the invoice
1 parent 09682c0 commit fc8e630

File tree

23 files changed

+502
-394
lines changed

23 files changed

+502
-394
lines changed

core/src/block.rs

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ use ccrypto::BLAKE_NULL_RLP;
2020
use ckey::Address;
2121
use cmerkle::skewed_merkle_root;
2222
use cstate::{StateDB, StateError, StateWithCache, TopLevelState};
23-
use ctypes::invoice::{Invoice, ParcelInvoice};
23+
use ctypes::invoice::ParcelInvoice;
2424
use ctypes::machine::{LiveBlock, Parcels};
25-
use ctypes::parcel::{Error as ParcelError, Outcome as ParcelOutcome};
25+
use ctypes::parcel::Error as ParcelError;
2626
use ctypes::util::unexpected::Mismatch;
2727
use primitives::{Bytes, H256};
2828
use rlp::{Decodable, DecoderError, Encodable, RlpStream, UntrustedRlp};
@@ -153,23 +153,11 @@ impl<'x> OpenBlock<'x> {
153153
return Err(StateError::Parcel(ParcelError::ParcelAlreadyImported).into())
154154
}
155155

156-
let outcomes = self.block.state.apply(&parcel, parcel.sender(), &parcel.public_key())?;
156+
let invoice = self.block.state.apply(&parcel, parcel.sender(), &parcel.public_key())?;
157157

158158
self.block.parcels_set.insert(h.unwrap_or_else(|| parcel.hash()));
159159
self.block.parcels.push(parcel.into());
160-
match outcomes {
161-
ParcelOutcome::Single {
162-
invoice,
163-
..
164-
} => {
165-
self.block.invoices.push(ParcelInvoice::Single(invoice));
166-
}
167-
ParcelOutcome::Transactions(invoices) => {
168-
self.block
169-
.invoices
170-
.push(invoices.into_iter().map(|outcome| outcome.invoice).collect::<Vec<Invoice>>().into());
171-
}
172-
}
160+
self.block.invoices.push(invoice);
173161
Ok(())
174162
}
175163

@@ -208,7 +196,7 @@ impl<'x> OpenBlock<'x> {
208196
self.block.header.set_state_root(self.block.state.root().clone());
209197
self.block.header.set_invoices_root(skewed_merkle_root(
210198
parent_invoices_root,
211-
self.block.invoices.iter().flat_map(|invoices| invoices.iter().map(|invoice| invoice.rlp_bytes())),
199+
self.block.invoices.iter().flat_map(|invoices| invoices.iter_result().map(|invoice| invoice.rlp_bytes())),
212200
));
213201

214202
ClosedBlock {
@@ -235,7 +223,10 @@ impl<'x> OpenBlock<'x> {
235223
if self.block.header.invoices_root().is_zero() || self.block.header.invoices_root() == &BLAKE_NULL_RLP {
236224
self.block.header.set_invoices_root(skewed_merkle_root(
237225
parent_invoices_root,
238-
self.block.invoices.iter().flat_map(|invoices| invoices.iter().map(|invoice| invoice.rlp_bytes())),
226+
self.block
227+
.invoices
228+
.iter()
229+
.flat_map(|invoices| invoices.iter_result().map(|invoice| invoice.rlp_bytes())),
239230
));
240231
}
241232
self.block.header.set_state_root(self.block.state.root().clone());

core/src/client/client.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ use super::super::views::{BlockView, HeaderView};
5858
use super::{
5959
AccountData, AssetClient, Balance, BlockChain as BlockChainTrait, BlockChainClient, BlockChainInfo, BlockInfo,
6060
BlockProducer, ChainInfo, ChainNotify, ClientConfig, DatabaseClient, EngineClient, EngineInfo,
61-
Error as ClientError, ExecuteClient, ImportBlock, ImportResult, ImportSealedBlock, Invoice, MiningBlockChainClient,
62-
Nonce, ParcelInfo, PrepareOpenBlock, RegularKey, ReopenBlock, Shard, StateOrBlock, TransactionInfo,
61+
Error as ClientError, ExecuteClient, ImportBlock, ImportResult, ImportSealedBlock, MiningBlockChainClient, Nonce,
62+
ParcelInfo, PrepareOpenBlock, RegularKey, ReopenBlock, Shard, StateOrBlock, TransactionInfo, TransactionInvoice,
6363
};
6464

6565
const MAX_MEM_POOL_SIZE: usize = 4096;
@@ -492,14 +492,15 @@ impl BlockChainClient for Client {
492492
self.transaction_address(id).and_then(|address| chain.transaction(&address))
493493
}
494494

495-
fn transaction_invoice(&self, id: TransactionId) -> Option<Invoice> {
495+
fn transaction_invoice(&self, id: TransactionId) -> Option<TransactionInvoice> {
496496
self.transaction_address(id).and_then(|transaction_address| {
497497
let parcel_address = transaction_address.parcel_address.clone();
498498
let parcel_id = parcel_address.into();
499499

500500
self.parcel_invoice(parcel_id).and_then(|parcel_invoice| match parcel_invoice {
501501
ParcelInvoice::Multiple(invoices) => invoices.get(transaction_address.index).cloned(),
502-
ParcelInvoice::Single(_) => None,
502+
ParcelInvoice::SingleSuccess => None,
503+
ParcelInvoice::SingleFail(_) => None,
503504
})
504505
})
505506
}

core/src/client/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use ckey::{Address, Public};
3333
use cmerkle::Result as TrieResult;
3434
use cnetwork::NodeId;
3535
use cstate::{ActionHandler, Asset, AssetScheme, AssetSchemeAddress, TopStateInfo};
36-
use ctypes::invoice::{Invoice, ParcelInvoice};
36+
use ctypes::invoice::{ParcelInvoice, TransactionInvoice};
3737
use ctypes::parcel::ChangeShard;
3838
use ctypes::transaction::Transaction;
3939
use ctypes::{BlockNumber, ShardId};
@@ -216,7 +216,7 @@ pub trait BlockChainClient: Sync + Send + AccountData + BlockChain + ImportBlock
216216
/// Get the transaction with given hash.
217217
fn transaction(&self, id: TransactionId) -> Option<Transaction>;
218218

219-
fn transaction_invoice(&self, id: TransactionId) -> Option<Invoice>;
219+
fn transaction_invoice(&self, id: TransactionId) -> Option<TransactionInvoice>;
220220

221221
fn custom_handlers(&self) -> Vec<Arc<ActionHandler>>;
222222
}

core/src/client/test_client.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use ckey::{Address, Generator, Random};
3939
use cmerkle::skewed_merkle_root;
4040
use cnetwork::NodeId;
4141
use cstate::{ActionHandler, StateDB};
42-
use ctypes::invoice::ParcelInvoice;
42+
use ctypes::invoice::{ParcelInvoice, TransactionInvoice};
4343
use ctypes::parcel::{Action, Parcel};
4444
use ctypes::transaction::Transaction;
4545
use ctypes::BlockNumber;
@@ -55,7 +55,7 @@ use super::super::blockchain_info::BlockChainInfo;
5555
use super::super::client::ImportResult;
5656
use super::super::client::{
5757
AccountData, Balance, BlockChain, BlockChainClient, BlockInfo, BlockProducer, BlockStatus, ChainInfo, ImportBlock,
58-
ImportSealedBlock, Invoice, MiningBlockChainClient, Nonce, ParcelInfo, PrepareOpenBlock, ReopenBlock, StateOrBlock,
58+
ImportSealedBlock, MiningBlockChainClient, Nonce, ParcelInfo, PrepareOpenBlock, ReopenBlock, StateOrBlock,
5959
TransactionInfo,
6060
};
6161
use super::super::db::{COL_STATE, NUM_COLUMNS};
@@ -512,7 +512,7 @@ impl BlockChainClient for TestBlockChainClient {
512512
unimplemented!();
513513
}
514514

515-
fn transaction_invoice(&self, _id: TransactionId) -> Option<Invoice> {
515+
fn transaction_invoice(&self, _id: TransactionId) -> Option<TransactionInvoice> {
516516
unimplemented!()
517517
}
518518

rpc/src/v1/impls/chain.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use ccore::{
2222
};
2323
use ckey::{Address, Public};
2424
use cstate::{Asset, AssetScheme, AssetSchemeAddress};
25-
use ctypes::invoice::{Invoice, ParcelInvoice};
25+
use ctypes::invoice::{ParcelInvoice, TransactionInvoice};
2626
use ctypes::parcel::{Action, ChangeShard};
2727
use ctypes::transaction::Transaction;
2828
use ctypes::{BlockNumber, ShardId};
@@ -99,7 +99,7 @@ where
9999
Ok(self.client.transaction(transaction_hash.into()))
100100
}
101101

102-
fn get_transaction_invoice(&self, transaction_hash: H256) -> Result<Option<Invoice>> {
102+
fn get_transaction_invoice(&self, transaction_hash: H256) -> Result<Option<TransactionInvoice>> {
103103
Ok(self.client.transaction_invoice(transaction_hash.into()))
104104
}
105105

rpc/src/v1/traits/chain.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
use ckey::{Address, Public};
1818
use cstate::{Asset, AssetScheme};
19-
use ctypes::invoice::{Invoice, ParcelInvoice};
19+
use ctypes::invoice::{ParcelInvoice, TransactionInvoice};
2020
use ctypes::parcel::ChangeShard;
2121
use ctypes::transaction::Transaction;
2222
use ctypes::{BlockNumber, ShardId};
@@ -46,7 +46,7 @@ build_rpc_trait! {
4646

4747
/// Gets transaction invoice with given hash.
4848
# [rpc(name = "chain_getTransactionInvoice")]
49-
fn get_transaction_invoice(&self, H256) -> Result<Option<Invoice>>;
49+
fn get_transaction_invoice(&self, H256) -> Result<Option<TransactionInvoice>>;
5050

5151
/// Gets asset scheme with given transaction hash.
5252
# [rpc(name = "chain_getAssetSchemeByHash")]

state/src/action_handler/hit.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616

1717
use ccrypto::blake256;
1818
use cmerkle::TrieMut;
19-
use ctypes::invoice::Invoice;
20-
use ctypes::parcel::Outcome;
19+
use ctypes::invoice::ParcelInvoice;
2120
use primitives::{Bytes, H256};
2221
use rlp::{self, Decodable, DecoderError, Encodable, UntrustedRlp};
2322

@@ -72,15 +71,12 @@ impl ActionHandler for HitHandler {
7271
}
7372

7473
/// `bytes` must be valid encoding of HitAction
75-
fn execute(&self, bytes: &Bytes, state: &mut TopLevelState) -> Option<StateResult<Outcome>> {
74+
fn execute(&self, bytes: &Bytes, state: &mut TopLevelState) -> Option<StateResult<ParcelInvoice>> {
7675
HitAction::decode(&UntrustedRlp::new(bytes)).ok().map(|action| {
7776
let prev_counter: u32 = rlp::decode(&state.action_data(&self.address())?);
7877
let increase = action.increase as u32;
7978
state.update_action_data(&self.address(), (prev_counter + increase).rlp_bytes().to_vec())?;
80-
Ok(Outcome::Single {
81-
invoice: Invoice::Success,
82-
error: None,
83-
})
79+
Ok(ParcelInvoice::SingleSuccess)
8480
})
8581
}
8682
}

state/src/action_handler/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@
1717
mod hit;
1818

1919
use cmerkle::TrieMut;
20-
use ctypes::parcel::Outcome;
20+
use ctypes::invoice::ParcelInvoice;
2121
use primitives::Bytes;
2222

2323
use super::{StateResult, TopLevelState};
2424

2525
pub trait ActionHandler: Send + Sync {
2626
fn init(&self, state: &mut TrieMut) -> StateResult<()>;
2727
fn is_target(&self, bytes: &Bytes) -> bool;
28-
fn execute(&self, bytes: &Bytes, state: &mut TopLevelState) -> Option<StateResult<Outcome>>;
28+
fn execute(&self, bytes: &Bytes, state: &mut TopLevelState) -> Option<StateResult<ParcelInvoice>>;
2929
}
3030

3131
pub use self::hit::HitHandler;

0 commit comments

Comments
 (0)