Skip to content

Commit b27f0ab

Browse files
committed
Call the IBC transactions in the state module
1 parent ec4f407 commit b27f0ab

File tree

12 files changed

+102
-28
lines changed

12 files changed

+102
-28
lines changed

core/src/block.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::transaction::{SignedTransaction, UnverifiedTransaction};
2222
use crate::BlockId;
2323
use ccrypto::BLAKE_NULL_RLP;
2424
use ckey::Address;
25-
use cstate::{FindActionHandler, StateDB, StateError, StateWithCache, TopLevelState};
25+
use cstate::{FindActionHandler, IBCTransactionExecutor, StateDB, StateError, StateWithCache, TopLevelState};
2626
use ctypes::errors::HistoryError;
2727
use ctypes::header::{Header, Seal};
2828
use ctypes::util::unexpected::Mismatch;
@@ -149,7 +149,7 @@ impl<'x> OpenBlock<'x> {
149149
}
150150

151151
/// Push a transaction into the block.
152-
pub fn push_transaction<C: ChainTimeInfo + FindActionHandler>(
152+
pub fn push_transaction<C: ChainTimeInfo + FindActionHandler + IBCTransactionExecutor>(
153153
&mut self,
154154
tx: SignedTransaction,
155155
h: Option<TxHash>,
@@ -192,7 +192,7 @@ impl<'x> OpenBlock<'x> {
192192
}
193193

194194
/// Push transactions onto the block.
195-
pub fn push_transactions<C: ChainTimeInfo + FindActionHandler>(
195+
pub fn push_transactions<C: ChainTimeInfo + FindActionHandler + IBCTransactionExecutor>(
196196
&mut self,
197197
transactions: &[SignedTransaction],
198198
client: &C,
@@ -455,7 +455,7 @@ impl IsBlock for SealedBlock {
455455
}
456456

457457
/// Enact the block given by block header, transactions and uncles
458-
pub fn enact<C: ChainTimeInfo + EngineInfo + FindActionHandler + TermInfo>(
458+
pub fn enact<C: ChainTimeInfo + EngineInfo + FindActionHandler + TermInfo + IBCTransactionExecutor>(
459459
header: &Header,
460460
transactions: &[SignedTransaction],
461461
engine: &dyn CodeChainEngine,

core/src/client/client.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ use cdb::{new_journaldb, Algorithm, AsHashDB, DatabaseError};
3636
use cio::IoChannel;
3737
use ckey::{Address, NetworkId, PlatformAddress, Public};
3838
use cnetwork::NodeId;
39-
use cstate::{ActionHandler, FindActionHandler, StateDB, StateResult, TopLevelState, TopStateView};
39+
use cstate::{
40+
ActionHandler, FindActionHandler, IBCTransactionExecutor, StateDB, StateResult, TopLevelState, TopStateView,
41+
};
4042
use ctimer::{TimeoutHandler, TimerApi, TimerScheduleError, TimerToken};
4143
use ctypes::header::Header;
4244
use ctypes::transaction::{AssetTransferInput, PartialHashing, ShardTransaction};
@@ -856,3 +858,15 @@ impl SnapshotClient for Client {
856858
}
857859
}
858860
}
861+
862+
impl IBCTransactionExecutor for Client {
863+
fn execute(
864+
&self,
865+
_bytes: &[u8],
866+
_state: &mut TopLevelState,
867+
_fee_payer: &Address,
868+
_sender_pubkey: &Public,
869+
) -> StateResult<()> {
870+
unimplemented!()
871+
}
872+
}

core/src/client/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,3 +324,5 @@ pub trait StateInfo {
324324
pub trait SnapshotClient {
325325
fn notify_snapshot(&self, id: BlockId);
326326
}
327+
328+
pub trait IBCClient {}

core/src/client/test_client.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ use cdb;
5050
use ckey::{public_to_address, Address, Generator, KeyPair, NetworkId, PlatformAddress, Private, Public, Random};
5151
use cnetwork::NodeId;
5252
use cstate::tests::helpers::empty_top_state;
53-
use cstate::{FindActionHandler, StateDB, TopLevelState};
53+
use cstate::{FindActionHandler, IBCTransactionExecutor, StateDB, TopLevelState};
5454
use ctimer::{TimeoutHandler, TimerToken};
5555
use ctypes::header::Header;
5656
use ctypes::transaction::{Action, Transaction};
@@ -691,3 +691,5 @@ impl StateInfo for TestBlockChainClient {
691691
Some(top_state)
692692
}
693693
}
694+
695+
impl IBCTransactionExecutor for TestBlockChainClient {}

core/src/miner/miner.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use crate::scheme::Scheme;
3030
use crate::transaction::{PendingSignedTransactions, SignedTransaction, UnverifiedTransaction};
3131
use crate::types::{BlockId, TransactionId};
3232
use ckey::{public_to_address, Address, Password, PlatformAddress, Public};
33-
use cstate::{FindActionHandler, TopLevelState};
33+
use cstate::{FindActionHandler, IBCTransactionExecutor, TopLevelState};
3434
use ctypes::errors::HistoryError;
3535
use ctypes::transaction::{Action, IncompleteTransaction};
3636
use ctypes::{BlockHash, TxHash};
@@ -287,7 +287,14 @@ impl Miner {
287287

288288
/// Prepares new block for sealing including top transactions from queue and seal it.
289289
fn prepare_and_seal_block<
290-
C: AccountData + BlockChainTrait + BlockProducer + ChainTimeInfo + EngineInfo + FindActionHandler + TermInfo,
290+
C: AccountData
291+
+ BlockChainTrait
292+
+ BlockProducer
293+
+ ChainTimeInfo
294+
+ EngineInfo
295+
+ FindActionHandler
296+
+ TermInfo
297+
+ IBCTransactionExecutor,
291298
>(
292299
&self,
293300
parent_block_id: BlockId,
@@ -519,7 +526,8 @@ impl MinerService for Miner {
519526
+ ImportBlock
520527
+ ChainTimeInfo
521528
+ FindActionHandler
522-
+ TermInfo, {
529+
+ TermInfo
530+
+ IBCTransactionExecutor, {
523531
ctrace!(MINER, "update_sealing: preparing a block");
524532

525533
let block = match self.prepare_and_seal_block(parent_block, chain) {
@@ -557,7 +565,7 @@ impl MinerService for Miner {
557565
}
558566
}
559567

560-
fn import_external_transactions<C: MiningBlockChainClient + EngineInfo + TermInfo>(
568+
fn import_external_transactions<C: MiningBlockChainClient + EngineInfo + TermInfo + IBCTransactionExecutor>(
561569
&self,
562570
client: &C,
563571
transactions: Vec<UnverifiedTransaction>,
@@ -582,7 +590,7 @@ impl MinerService for Miner {
582590
results
583591
}
584592

585-
fn import_own_transaction<C: MiningBlockChainClient + EngineInfo + TermInfo>(
593+
fn import_own_transaction<C: MiningBlockChainClient + EngineInfo + TermInfo + IBCTransactionExecutor>(
586594
&self,
587595
chain: &C,
588596
tx: SignedTransaction,
@@ -627,7 +635,9 @@ impl MinerService for Miner {
627635
imported
628636
}
629637

630-
fn import_incomplete_transaction<C: MiningBlockChainClient + AccountData + EngineInfo + TermInfo>(
638+
fn import_incomplete_transaction<
639+
C: MiningBlockChainClient + AccountData + EngineInfo + TermInfo + IBCTransactionExecutor,
640+
>(
631641
&self,
632642
client: &C,
633643
account_provider: &AccountProvider,
@@ -687,7 +697,7 @@ impl MinerService for Miner {
687697
self.mem_pool.read().future_transactions()
688698
}
689699

690-
fn start_sealing<C: MiningBlockChainClient + EngineInfo + TermInfo>(&self, client: &C) {
700+
fn start_sealing<C: MiningBlockChainClient + EngineInfo + TermInfo + IBCTransactionExecutor>(&self, client: &C) {
691701
cdebug!(MINER, "Start sealing");
692702
self.sealing_enabled.store(true, Ordering::Relaxed);
693703
// ------------------------------------------------------------------

core/src/miner/mod.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ mod mem_pool_types;
2121
mod miner;
2222

2323
use ckey::{public_to_address, Address, Password, PlatformAddress, Public};
24-
use cstate::{FindActionHandler, TopStateView};
24+
use cstate::{FindActionHandler, IBCTransactionExecutor, TopStateView};
2525
use ctypes::transaction::IncompleteTransaction;
2626
use ctypes::{BlockHash, TxHash};
2727
use cvm::ChainTimeInfo;
@@ -84,24 +84,27 @@ pub trait MinerService: Send + Sync {
8484
+ ChainTimeInfo
8585
+ EngineInfo
8686
+ FindActionHandler
87+
+ IBCTransactionExecutor
8788
+ TermInfo;
8889

8990
/// Imports transactions to mem pool.
90-
fn import_external_transactions<C: MiningBlockChainClient + EngineInfo + TermInfo>(
91+
fn import_external_transactions<C: MiningBlockChainClient + EngineInfo + TermInfo + IBCTransactionExecutor>(
9192
&self,
9293
client: &C,
9394
transactions: Vec<UnverifiedTransaction>,
9495
) -> Vec<Result<TransactionImportResult, Error>>;
9596

9697
/// Imports own (node owner) transaction to mem pool.
97-
fn import_own_transaction<C: MiningBlockChainClient + EngineInfo + TermInfo>(
98+
fn import_own_transaction<C: MiningBlockChainClient + EngineInfo + TermInfo + IBCTransactionExecutor>(
9899
&self,
99100
chain: &C,
100101
tx: SignedTransaction,
101102
) -> Result<TransactionImportResult, Error>;
102103

103104
/// Imports incomplete (node owner) transaction to mem pool.
104-
fn import_incomplete_transaction<C: MiningBlockChainClient + AccountData + EngineInfo + TermInfo>(
105+
fn import_incomplete_transaction<
106+
C: MiningBlockChainClient + AccountData + EngineInfo + TermInfo + IBCTransactionExecutor,
107+
>(
105108
&self,
106109
chain: &C,
107110
account_provider: &AccountProvider,
@@ -121,7 +124,7 @@ pub trait MinerService: Send + Sync {
121124
fn future_transactions(&self) -> Vec<SignedTransaction>;
122125

123126
/// Start sealing.
124-
fn start_sealing<C: MiningBlockChainClient + EngineInfo + TermInfo>(&self, client: &C);
127+
fn start_sealing<C: MiningBlockChainClient + EngineInfo + TermInfo + IBCTransactionExecutor>(&self, client: &C);
125128

126129
/// Stop sealing.
127130
fn stop_sealing(&self);

rpc/src/v1/impls/account.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use super::super::traits::Account;
1919
use super::super::types::{SendTransactionResult, UnsignedTransaction};
2020
use ccore::{AccountData, AccountProvider, EngineInfo, MinerService, MiningBlockChainClient, TermInfo};
2121
use ckey::{Password, PlatformAddress, Signature};
22+
use cstate::IBCTransactionExecutor;
2223
use ctypes::transaction::IncompleteTransaction;
2324
use jsonrpc_core::Result;
2425
use parking_lot::Mutex;
@@ -48,7 +49,7 @@ where
4849

4950
impl<C, M> Account for AccountClient<C, M>
5051
where
51-
C: EngineInfo + MiningBlockChainClient + AccountData + TermInfo + 'static,
52+
C: EngineInfo + MiningBlockChainClient + AccountData + TermInfo + IBCTransactionExecutor + 'static,
5253
M: MinerService + 'static,
5354
{
5455
fn get_account_list(&self) -> Result<Vec<PlatformAddress>> {

rpc/src/v1/impls/devel.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use ccore::{
2424
use cjson::bytes::Bytes;
2525
use ckey::{Address, KeyPair, Private};
2626
use cnetwork::{unbounded_event_callback, EventSender, IntoSocketAddr};
27+
use cstate::IBCTransactionExecutor;
2728
use csync::BlockSyncEvent;
2829
use ctypes::transaction::{Action, Transaction};
2930
use ctypes::BlockHash;
@@ -63,7 +64,14 @@ where
6364

6465
impl<C, M> Devel for DevelClient<C, M>
6566
where
66-
C: DatabaseClient + EngineInfo + EngineClient + MiningBlockChainClient + TermInfo + SnapshotClient + 'static,
67+
C: DatabaseClient
68+
+ EngineInfo
69+
+ EngineClient
70+
+ MiningBlockChainClient
71+
+ TermInfo
72+
+ SnapshotClient
73+
+ IBCTransactionExecutor
74+
+ 'static,
6775
M: MinerService + 'static,
6876
{
6977
fn get_state_trie_keys(&self, offset: usize, limit: usize) -> Result<Vec<H256>> {

state/src/ibc.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright 2020 Kodebox, Inc.
2+
// This file is part of CodeChain.
3+
//
4+
// This program is free software: you can redistribute it and/or modify
5+
// it under the terms of the GNU Affero General Public License as
6+
// published by the Free Software Foundation, either version 3 of the
7+
// License, or (at your option) any later version.
8+
//
9+
// This program is distributed in the hope that it will be useful,
10+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
// GNU Affero General Public License for more details.
13+
//
14+
// You should have received a copy of the GNU Affero General Public License
15+
// along with this program. If not, see <https://www.gnu.org/licenses/>.
16+
17+
use crate::{StateResult, TopLevelState};
18+
use ckey::{Address, Public};
19+
20+
pub trait IBCTransactionExecutor {
21+
fn execute(
22+
&self,
23+
_bytes: &[u8],
24+
_state: &mut TopLevelState,
25+
_fee_payer: &Address,
26+
_sender_pubkey: &Public,
27+
) -> StateResult<()> {
28+
Ok(())
29+
}
30+
}

state/src/impls/top_level.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ use crate::checkpoint::{CheckpointId, StateWithCheckpoint};
4040
use crate::error::Error;
4141
use crate::traits::{ShardState, ShardStateView, StateWithCache, TopState, TopStateView};
4242
use crate::{
43-
Account, ActionData, FindActionHandler, IBCData, Metadata, MetadataAddress, RegularAccount, RegularAccountAddress,
44-
Shard, ShardAddress, ShardLevelState, StateDB, StateResult,
43+
Account, ActionData, FindActionHandler, IBCData, IBCTransactionExecutor, Metadata, MetadataAddress, RegularAccount,
44+
RegularAccountAddress, Shard, ShardAddress, ShardLevelState, StateDB, StateResult,
4545
};
4646
use ccrypto::BLAKE_NULL_RLP;
4747
use cdb::{AsHashDB, DatabaseError};
@@ -245,7 +245,7 @@ impl TopLevelState {
245245

246246
/// Execute a given tranasction, charging tranasction fee.
247247
/// This will change the state accordingly.
248-
pub fn apply<C: ChainTimeInfo + FindActionHandler>(
248+
pub fn apply<C: ChainTimeInfo + FindActionHandler + IBCTransactionExecutor>(
249249
&mut self,
250250
tx: &Transaction,
251251
signed_hash: &TxHash,
@@ -276,7 +276,7 @@ impl TopLevelState {
276276
result
277277
}
278278

279-
fn apply_internal<C: ChainTimeInfo + FindActionHandler>(
279+
fn apply_internal<C: ChainTimeInfo + FindActionHandler + IBCTransactionExecutor>(
280280
&mut self,
281281
tx: &Transaction,
282282
signed_hash: &TxHash,
@@ -341,7 +341,7 @@ impl TopLevelState {
341341
}
342342

343343
#[allow(clippy::too_many_arguments)]
344-
fn apply_action<C: ChainTimeInfo + FindActionHandler>(
344+
fn apply_action<C: ChainTimeInfo + FindActionHandler + IBCTransactionExecutor>(
345345
&mut self,
346346
action: &Action,
347347
network_id: NetworkId,
@@ -406,9 +406,9 @@ impl TopLevelState {
406406
return Ok(())
407407
}
408408
Action::IBC {
409-
..
409+
bytes,
410410
} => {
411-
// FIXME: call ibc transactions
411+
IBCTransactionExecutor::execute(client, bytes, self, fee_payer, signer_public)?;
412412
return Ok(())
413413
}
414414
};

0 commit comments

Comments
 (0)