Skip to content
This repository was archived by the owner on Feb 1, 2024. It is now read-only.

Commit 3916f0c

Browse files
authored
Merge pull request #2329 from peterschwarz/rust-perm-verifier-1_3
Rust perm verifier 1 3
2 parents e7c9317 + d0c2514 commit 3916f0c

File tree

13 files changed

+724
-160
lines changed

13 files changed

+724
-160
lines changed

.dockerignore

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,29 @@
2929
/cli/**/__pycache__/
3030

3131
/families/**/__pycache__/
32+
/families/block_info/rust/sawtooth_block_info/bin
33+
/families/block_info/rust/sawtooth_block_info/src/block_info.rs
34+
/families/block_info/rust/sawtooth_block_info/target
35+
/families/block_info/rust/sawtooth_block_info/Cargo.lock
36+
/families/block_info/sawtooth_block_info/protobuf
37+
/families/block_info/sawtooth_block_info/bin
38+
/families/block_info/sawtooth_block_info/src/block_info.rs
39+
/families/block_info/sawtooth_block_info/target
40+
/families/block_info/sawtooth_block_info/Cargo.lock
3241
/families/settings/sawtooth_settings/target/
3342
/families/settings/sawtooth_settings/bin/
3443
/families/settings/sawtooth_settings/Cargo.lock
3544
/families/settings/tests/sawtooth_settings_test/protobuf/
36-
/families/block_info/python/sawtooth_block_info/protobuf
37-
/families/identity/sawtooth_identity/protobuf
3845
/families/smallbank/smallbank_rust/target/
3946
/families/smallbank/smallbank_rust/Cargo.lock
4047
/families/smallbank/smallbank_rust/bin/
41-
/families/smallbank/smallbank_rust/src/smallbank.rs
42-
/families/battleship/target/
48+
/families/identity/python/sawtooth_identity/protobuf/
49+
/families/identity/sawtooth_identity/bin/
50+
/families/identity/sawtooth_identity/target/
51+
/families/identity/sawtooth_identity/Cargo.lock
52+
/families/identity/sawtooth_identity/protobuf/
53+
/families/battleship/target
54+
/families/battleship/Cargo.lock
4355

4456
/coverage
4557
/coverage/html
@@ -56,19 +68,6 @@
5668
/rest_api/sawtooth_rest_api/protobuf/
5769
/rest_api/**/__pycache__/
5870

59-
/sdk/javascript/node_modules
60-
/sdk/javascript/package-lock.json
61-
/sdk/javascript/protobuf/protobuf_bundle.json
62-
/sdk/examples/xo_javascript/node_modules/
63-
/sdk/examples/xo_javascript/package-lock.json
64-
/sdk/examples/intkey_javascript/node_modules/
65-
/sdk/examples/intkey_javascript/package-lock.json
66-
/sdk/examples/intkey_java/dependency-reduced-pom.xml
67-
/sdk/examples/intkey_java/target/
68-
/sdk/examples/xo_java/dependency-reduced-pom.xml
69-
/sdk/examples/xo_java/target/
70-
/sdk/java/target/
71-
7271
/validator/build/
7372
/validator/sawtooth_validator.egg-info/
7473
/validator/sawtooth_validator/protobuf/
@@ -77,15 +76,11 @@
7776
/validator/Cargo.lock
7877
/validator/bin/
7978
/validator/lib/
80-
/validator/src/proto
81-
82-
/sdk/cxx/build/
8379

8480
/perf/sawtooth_perf/Cargo.lock
8581
/perf/sawtooth_perf/target/
8682
/perf/sawtooth_workload/Cargo.lock
8783
/perf/sawtooth_workload/target/
88-
/perf/smallbank_workload/src/smallbank.rs
8984
/perf/smallbank_workload/Cargo.lock
9085
/perf/smallbank_workload/target/
9186
/perf/smallbank_workload/bin/

validator/src/gossip/permission_verifier.rs

Lines changed: 0 additions & 56 deletions
This file was deleted.

validator/src/journal/block_validator.rs

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,28 @@
2020
use batch::Batch;
2121
use block::Block;
2222
use execution::execution_platform::{ExecutionPlatform, NULL_STATE_HASH};
23-
use gossip::permission_verifier::PermissionVerifier;
23+
use std::sync::{
24+
atomic::{AtomicBool, AtomicUsize, Ordering},
25+
mpsc::{channel, Receiver, RecvTimeoutError, Sender},
26+
Arc, Mutex,
27+
};
28+
use std::thread;
29+
use std::time::Duration;
30+
31+
use uluru;
32+
2433
use journal::block_scheduler::BlockScheduler;
2534
use journal::chain_commit_state::{
2635
validate_no_duplicate_batches, validate_no_duplicate_transactions,
2736
validate_transaction_dependencies, ChainCommitStateError,
2837
};
2938
use journal::validation_rule_enforcer::enforce_validation_rules;
3039
use journal::{block_manager::BlockManager, block_wrapper::BlockStatus};
40+
use permissions::verifier::PermissionVerifier;
3141
use scheduler::TxnExecutionResult;
32-
use state::{settings_view::SettingsView, state_view_factory::StateViewFactory};
33-
use std::sync::{
34-
atomic::{AtomicBool, AtomicUsize, Ordering},
35-
mpsc::{channel, Receiver, RecvTimeoutError, Sender},
36-
Arc, Mutex,
42+
use state::{
43+
identity_view::IdentityView, settings_view::SettingsView, state_view_factory::StateViewFactory,
3744
};
38-
use std::thread;
39-
use std::time::Duration;
40-
use uluru;
4145

4246
const BLOCKVALIDATION_QUEUE_RECV_TIMEOUT: u64 = 100;
4347

@@ -162,7 +166,7 @@ impl BlockValidationResult {
162166
type InternalSender = Sender<(Block, Sender<BlockValidationResult>)>;
163167
type InternalReceiver = Receiver<(Block, Sender<BlockValidationResult>)>;
164168

165-
pub struct BlockValidator<TEP: ExecutionPlatform, PV: PermissionVerifier> {
169+
pub struct BlockValidator<TEP: ExecutionPlatform> {
166170
channels: Vec<(InternalSender, Option<InternalReceiver>)>,
167171
index: Arc<AtomicUsize>,
168172
validation_thread_exit: Arc<AtomicBool>,
@@ -171,20 +175,17 @@ pub struct BlockValidator<TEP: ExecutionPlatform, PV: PermissionVerifier> {
171175
block_manager: BlockManager,
172176
transaction_executor: TEP,
173177
view_factory: StateViewFactory,
174-
permission_verifier: PV,
175178
}
176179

177-
impl<TEP: ExecutionPlatform + 'static, PV: PermissionVerifier + 'static> BlockValidator<TEP, PV>
180+
impl<TEP: ExecutionPlatform + 'static> BlockValidator<TEP>
178181
where
179182
TEP: Clone,
180-
PV: Clone,
181183
{
182184
#[allow(too_many_arguments)]
183185
pub fn new(
184186
block_manager: BlockManager,
185187
transaction_executor: TEP,
186188
block_status_store: BlockValidationResultStore,
187-
permission_verifier: PV,
188189
view_factory: StateViewFactory,
189190
) -> Self {
190191
let mut channels = vec![];
@@ -201,7 +202,6 @@ where
201202
block_status_store,
202203
block_manager,
203204
view_factory,
204-
permission_verifier,
205205
}
206206
}
207207

@@ -223,8 +223,8 @@ where
223223
let validation2: Box<BlockValidation<ReturnValue = ()>> =
224224
Box::new(OnChainRulesValidation::new(self.view_factory.clone()));
225225

226-
let validation3: Box<BlockValidation<ReturnValue = ()>> =
227-
Box::new(PermissionValidation::new(self.permission_verifier.clone()));
226+
let validation3: Box<dyn BlockValidation<ReturnValue = ()>> =
227+
Box::new(PermissionValidation::new(self.view_factory.clone()));
228228

229229
let validations = vec![validation1, validation2, validation3];
230230

@@ -355,8 +355,8 @@ where
355355
let validation2: Box<BlockValidation<ReturnValue = ()>> =
356356
Box::new(OnChainRulesValidation::new(self.view_factory.clone()));
357357

358-
let validation3: Box<BlockValidation<ReturnValue = ()>> =
359-
Box::new(PermissionValidation::new(self.permission_verifier.clone()));
358+
let validation3: Box<dyn BlockValidation<ReturnValue = ()>> =
359+
Box::new(PermissionValidation::new(self.view_factory.clone()));
360360

361361
let validations = vec![validation1, validation2, validation3];
362362

@@ -375,9 +375,7 @@ where
375375
}
376376
}
377377

378-
impl<TEP: ExecutionPlatform + Clone, PV: PermissionVerifier + Clone> Clone
379-
for BlockValidator<TEP, PV>
380-
{
378+
impl<TEP: ExecutionPlatform + Clone> Clone for BlockValidator<TEP> {
381379
fn clone(&self) -> Self {
382380
let transaction_executor = self.transaction_executor.clone();
383381
let validation_thread_exit = Arc::clone(&self.validation_thread_exit);
@@ -398,7 +396,6 @@ impl<TEP: ExecutionPlatform + Clone, PV: PermissionVerifier + Clone> Clone
398396
block_scheduler: self.block_scheduler.clone(),
399397
block_status_store: self.block_status_store.clone(),
400398
block_manager: self.block_manager.clone(),
401-
permission_verifier: self.permission_verifier.clone(),
402399
view_factory: self.view_factory.clone(),
403400
}
404401
}
@@ -638,19 +635,17 @@ impl BlockValidation for DuplicatesAndDependenciesValidation {
638635
}
639636
}
640637

641-
struct PermissionValidation<PV: PermissionVerifier> {
642-
permission_verifier: PV,
638+
struct PermissionValidation {
639+
state_view_factory: StateViewFactory,
643640
}
644641

645-
impl<PV: PermissionVerifier> PermissionValidation<PV> {
646-
fn new(permission_verifier: PV) -> Self {
647-
PermissionValidation {
648-
permission_verifier,
649-
}
642+
impl PermissionValidation {
643+
fn new(state_view_factory: StateViewFactory) -> Self {
644+
Self { state_view_factory }
650645
}
651646
}
652647

653-
impl<PV: PermissionVerifier> BlockValidation for PermissionValidation<PV> {
648+
impl BlockValidation for PermissionValidation {
654649
type ReturnValue = ();
655650

656651
fn validate_block(
@@ -664,13 +659,23 @@ impl<PV: PermissionVerifier> BlockValidation for PermissionValidation<PV> {
664659
format!("During permission check of block {} block_num is {} but missing a previous state root",
665660
&block.header_signature, block.block_num))
666661
})?;
662+
663+
let identity_view: IdentityView = self.state_view_factory.create_view(state_root)
664+
.map_err(|err| {
665+
ValidationError::BlockValidationError(
666+
format!("During permission check of block ({}, {}) state root was not found in state: {}",
667+
&block.header_signature, block.block_num, err))
668+
})?;
669+
let permission_verifier = PermissionVerifier::new(Box::new(identity_view));
667670
for batch in &block.batches {
668671
let batch_id = &batch.header_signature;
669-
if !self
670-
.permission_verifier
671-
.is_batch_signer_authorized(batch, state_root)
672-
{
673-
return Err(ValidationError::BlockValidationError(
672+
if !permission_verifier.is_batch_signer_authorized(batch)
673+
.map_err(|err| {
674+
ValidationError::BlockValidationError(
675+
format!("During permission check of block ({}, {}), unable to read permissions: {}",
676+
&block.header_signature, block.block_num, err))
677+
})? {
678+
return Err(ValidationError::BlockValidationFailure(
674679
format!("Block {} failed permission verification: batch {} signer is not authorized",
675680
&block.header_signature,
676681
batch_id)));

validator/src/journal/block_validator_ffi.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
use cpython;
1919
use execution::py_executor::PyExecutor;
20-
use gossip::permission_verifier::PyPermissionVerifier;
2120
use journal::{
2221
block_manager::BlockManager,
2322
block_validator::{BlockValidationResultStore, BlockValidator},
@@ -64,7 +63,7 @@ pub unsafe extern "C" fn block_validator_new(
6463
block_manager_ptr: *const c_void,
6564
transaction_executor_ptr: *mut py_ffi::PyObject,
6665
block_status_store_ptr: *const c_void,
67-
permission_verifier: *mut py_ffi::PyObject,
66+
_permission_verifier: *mut py_ffi::PyObject,
6867
view_factory_ptr: *const c_void,
6968
block_validator_ptr: *mut *const c_void,
7069
) -> ErrorCode {
@@ -83,15 +82,10 @@ pub unsafe extern "C" fn block_validator_new(
8382
let py_transaction_executor =
8483
PyExecutor::new(ex).expect("The PyExecutor could not be created from a PyObject");
8584

86-
let py_permission_verifier: PyPermissionVerifier = PyPermissionVerifier::new(
87-
cpython::PyObject::from_borrowed_ptr(py, permission_verifier),
88-
);
89-
9085
let block_validator = BlockValidator::new(
9186
block_manager,
9287
py_transaction_executor,
9388
block_status_store,
94-
py_permission_verifier,
9589
view_factory,
9690
);
9791

@@ -104,15 +98,15 @@ pub unsafe extern "C" fn block_validator_new(
10498
pub unsafe extern "C" fn block_validator_start(block_validator_ptr: *mut c_void) -> ErrorCode {
10599
check_null!(block_validator_ptr);
106100

107-
(*(block_validator_ptr as *mut BlockValidator<PyExecutor, PyPermissionVerifier>)).start();
101+
(*(block_validator_ptr as *mut BlockValidator<PyExecutor>)).start();
108102

109103
ErrorCode::Success
110104
}
111105

112106
#[no_mangle]
113107
pub unsafe extern "C" fn block_validator_stop(block_validator_ptr: *mut c_void) -> ErrorCode {
114108
check_null!(block_validator_ptr);
115-
(*(block_validator_ptr as *mut BlockValidator<PyExecutor, PyPermissionVerifier>)).stop();
109+
(*(block_validator_ptr as *mut BlockValidator<PyExecutor>)).stop();
116110

117111
ErrorCode::Success
118112
}
@@ -121,7 +115,7 @@ pub unsafe extern "C" fn block_validator_stop(block_validator_ptr: *mut c_void)
121115
pub unsafe extern "C" fn block_validator_drop(block_validator_ptr: *mut c_void) -> ErrorCode {
122116
check_null!(block_validator_ptr);
123117

124-
Box::from_raw(block_validator_ptr as *mut BlockValidator<PyExecutor, PyPermissionVerifier>);
118+
Box::from_raw(block_validator_ptr as *mut BlockValidator<PyExecutor>);
125119

126120
ErrorCode::Success
127121
}

0 commit comments

Comments
 (0)