Skip to content

Commit d12871b

Browse files
authored
Merge pull request #2384 from subspace/bundle-storage-price
Use the consensus chain storage price to charge domain transaction fees
2 parents 6309462 + b67ea4e commit d12871b

File tree

37 files changed

+1054
-275
lines changed

37 files changed

+1054
-275
lines changed

Cargo.lock

Lines changed: 30 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/pallet-domains/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ subspace-runtime-primitives = { version = "0.1.0", default-features = false, pat
3434
domain-pallet-executive = { version = "0.1.0", default-features = false, path = "../../domains/pallets/executive" }
3535
pallet-balances = { version = "4.0.0-dev", git = "https://github.com/subspace/polkadot-sdk", rev = "0831dfc3c54b10ab46e82acf98603b4af1a47bd5" }
3636
pallet-timestamp = { version = "4.0.0-dev", git = "https://github.com/subspace/polkadot-sdk", rev = "0831dfc3c54b10ab46e82acf98603b4af1a47bd5" }
37+
pallet-block-fees = { version = "0.1.0", default-features = false, path = "../../domains/pallets/block-fees" }
3738
sp-externalities = { version = "0.19.0", git = "https://github.com/subspace/polkadot-sdk", rev = "0831dfc3c54b10ab46e82acf98603b4af1a47bd5" }
3839
sp-state-machine = { version = "0.28.0", git = "https://github.com/subspace/polkadot-sdk", rev = "0831dfc3c54b10ab46e82acf98603b4af1a47bd5" }
3940
sp-trie = { version = "22.0.0", git = "https://github.com/subspace/polkadot-sdk", rev = "0831dfc3c54b10ab46e82acf98603b4af1a47bd5" }

crates/pallet-domains/src/block_tree.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,8 @@ pub(crate) fn process_execution_receipt<T: Config>(
333333
return Ok(Some(ConfirmedDomainBlockInfo {
334334
domain_block_number: to_prune,
335335
operator_ids,
336-
rewards: execution_receipt.total_rewards,
336+
// TODO: also distribute the `storage_fee`
337+
rewards: execution_receipt.block_fees.domain_execution_fee,
337338
invalid_bundle_authors,
338339
}));
339340
}

crates/pallet-domains/src/lib.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ use sp_domains::{
5353
OperatorPublicKey, RuntimeId, DOMAIN_EXTRINSICS_SHUFFLING_SEED_SUBJECT, EMPTY_EXTRINSIC_ROOT,
5454
};
5555
use sp_domains_fraud_proof::fraud_proof::{
56-
FraudProof, InvalidDomainBlockHashProof, InvalidTotalRewardsProof,
56+
FraudProof, InvalidBlockFeesProof, InvalidDomainBlockHashProof,
5757
};
5858
use sp_domains_fraud_proof::verification::{
59-
verify_bundle_equivocation_fraud_proof, verify_invalid_bundles_fraud_proof,
60-
verify_invalid_domain_block_hash_fraud_proof,
59+
verify_bundle_equivocation_fraud_proof, verify_invalid_block_fees_fraud_proof,
60+
verify_invalid_bundles_fraud_proof, verify_invalid_domain_block_hash_fraud_proof,
6161
verify_invalid_domain_extrinsics_root_fraud_proof, verify_invalid_state_transition_fraud_proof,
62-
verify_invalid_total_rewards_fraud_proof, verify_valid_bundle_fraud_proof,
62+
verify_valid_bundle_fraud_proof,
6363
};
6464
use sp_runtime::traits::{CheckedSub, Hash, Header, One, Zero};
6565
use sp_runtime::{RuntimeAppPublic, SaturatedConversion, Saturating};
@@ -596,8 +596,8 @@ mod pallet {
596596
ChallengingGenesisReceipt,
597597
/// The descendants of the fraudulent ER is not pruned
598598
DescendantsOfFraudulentERNotPruned,
599-
/// Invalid fraud proof since total rewards are not mismatched.
600-
InvalidTotalRewardsFraudProof,
599+
/// Invalid fraud proof since block fees are not mismatched.
600+
InvalidBlockFeesFraudProof,
601601
/// Invalid domain block hash fraud proof.
602602
InvalidDomainBlockHashFraudProof,
603603
/// Invalid domain extrinsic fraud proof
@@ -1622,10 +1622,8 @@ impl<T: Config> Pallet<T> {
16221622
);
16231623

16241624
match fraud_proof {
1625-
FraudProof::InvalidTotalRewards(InvalidTotalRewardsProof {
1626-
storage_proof, ..
1627-
}) => {
1628-
verify_invalid_total_rewards_fraud_proof::<
1625+
FraudProof::InvalidBlockFees(InvalidBlockFeesProof { storage_proof, .. }) => {
1626+
verify_invalid_block_fees_fraud_proof::<
16291627
T::Block,
16301628
DomainBlockNumberFor<T>,
16311629
T::DomainHash,
@@ -1635,9 +1633,9 @@ impl<T: Config> Pallet<T> {
16351633
.map_err(|err| {
16361634
log::error!(
16371635
target: "runtime::domains",
1638-
"Total rewards proof verification failed: {err:?}"
1636+
"Block fees proof verification failed: {err:?}"
16391637
);
1640-
FraudProofError::InvalidTotalRewardsFraudProof
1638+
FraudProofError::InvalidBlockFeesFraudProof
16411639
})?;
16421640
}
16431641
FraudProof::InvalidDomainBlockHash(InvalidDomainBlockHashProof {

crates/pallet-domains/src/tests.rs

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ use sp_domains::{
3030
ProofOfElection, RuntimeType, SealedBundleHeader, StakingHoldIdentifier,
3131
};
3232
use sp_domains_fraud_proof::fraud_proof::{
33-
FraudProof, InvalidBundlesFraudProof, InvalidDomainBlockHashProof, InvalidExtrinsicsRootProof,
34-
InvalidTotalRewardsProof, ValidBundleDigest,
33+
FraudProof, InvalidBlockFeesProof, InvalidBundlesFraudProof, InvalidDomainBlockHashProof,
34+
InvalidExtrinsicsRootProof, ValidBundleDigest,
3535
};
3636
use sp_domains_fraud_proof::{
3737
FraudProofExtension, FraudProofHostFunctions, FraudProofVerificationInfoRequest,
@@ -68,6 +68,7 @@ frame_support::construct_runtime!(
6868
Balances: pallet_balances,
6969
Domains: pallet_domains,
7070
DomainExecutive: domain_pallet_executive,
71+
BlockFees: pallet_block_fees,
7172
}
7273
);
7374

@@ -188,6 +189,7 @@ parameter_types! {
188189
pub const BlockReward: Balance = 10 * SSC;
189190
pub const MaxPendingStakingOperation: u32 = 100;
190191
pub const MaxNominators: u32 = 5;
192+
pub const DomainChainByteFee: Balance = 1;
191193
}
192194

193195
pub struct MockRandomness;
@@ -242,7 +244,7 @@ impl domain_pallet_executive::ExtrinsicStorageFees<Test> for ExtrinsicStorageFee
242244
(None, DispatchInfo::default())
243245
}
244246

245-
fn on_storage_fees_charged(_charged_fees: Balance) {}
247+
fn on_storage_fees_charged(_charged_fees: Balance, _tx_size: u32) {}
246248
}
247249

248250
impl domain_pallet_executive::Config for Test {
@@ -253,6 +255,11 @@ impl domain_pallet_executive::Config for Test {
253255
type ExtrinsicStorageFees = ExtrinsicStorageFees;
254256
}
255257

258+
impl pallet_block_fees::Config for Test {
259+
type Balance = Balance;
260+
type DomainChainByteFee = DomainChainByteFee;
261+
}
262+
256263
pub(crate) fn new_test_ext() -> sp_io::TestExternalities {
257264
let t = frame_system::GenesisConfig::<Test>::default()
258265
.build_storage()
@@ -295,6 +302,17 @@ impl FraudProofHostFunctions for MockDomainFraudProofExtension {
295302
.encode(),
296303
)
297304
}
305+
FraudProofVerificationInfoRequest::ConsensusChainByteFeeExtrinsic(_) => {
306+
FraudProofVerificationInfoResponse::ConsensusChainByteFeeExtrinsic(
307+
UncheckedExtrinsic::new_unsigned(
308+
pallet_block_fees::Call::<Test>::set_next_consensus_chain_byte_fee {
309+
transaction_byte_fee: Default::default(),
310+
}
311+
.into(),
312+
)
313+
.encode(),
314+
)
315+
}
298316
FraudProofVerificationInfoRequest::DomainBundleBody { .. } => {
299317
FraudProofVerificationInfoResponse::DomainBundleBody(Default::default())
300318
}
@@ -417,7 +435,7 @@ pub(crate) fn create_dummy_receipt(
417435
final_state_root: Default::default(),
418436
execution_trace,
419437
execution_trace_root,
420-
total_rewards: 0,
438+
block_fees: Default::default(),
421439
}
422440
}
423441

@@ -908,7 +926,7 @@ fn test_invalid_fraud_proof() {
908926
}
909927

910928
#[test]
911-
fn test_invalid_total_rewards_fraud_proof() {
929+
fn test_invalid_block_fees_fraud_proof() {
912930
let creator = 0u64;
913931
let operator_id = 1u64;
914932
let head_domain_number = 10;
@@ -927,11 +945,22 @@ fn test_invalid_total_rewards_fraud_proof() {
927945
let bad_receipt_hash = domain_block
928946
.execution_receipt
929947
.hash::<DomainHashingFor<Test>>();
930-
let (fraud_proof, root) = generate_invalid_total_rewards_fraud_proof::<Test>(
948+
let (fraud_proof, root) = generate_invalid_block_fees_fraud_proof::<Test>(
931949
domain_id,
932950
bad_receipt_hash,
933951
// set different reward in the storage and generate proof for that value
934-
domain_block.execution_receipt.total_rewards + 1,
952+
domain_runtime_primitives::BlockFees::new(
953+
domain_block
954+
.execution_receipt
955+
.block_fees
956+
.domain_execution_fee
957+
+ 1,
958+
domain_block
959+
.execution_receipt
960+
.block_fees
961+
.consensus_storage_fee
962+
+ 1,
963+
),
935964
);
936965
domain_block.execution_receipt.final_state_root = root;
937966
BlockTreeNodes::<Test>::insert(bad_receipt_hash, domain_block);
@@ -942,23 +971,23 @@ fn test_invalid_total_rewards_fraud_proof() {
942971
type FraudProofFor<T> =
943972
FraudProof<BlockNumberFor<T>, <T as frame_system::Config>::Hash, <T as Config>::DomainHeader>;
944973

945-
fn generate_invalid_total_rewards_fraud_proof<T: Config>(
974+
fn generate_invalid_block_fees_fraud_proof<T: Config>(
946975
domain_id: DomainId,
947976
bad_receipt_hash: ReceiptHashFor<T>,
948-
rewards: BalanceOf<T>,
977+
block_fees: domain_runtime_primitives::BlockFees<BalanceOf<T>>,
949978
) -> (FraudProofFor<T>, T::Hash) {
950-
let storage_key = sp_domains_fraud_proof::fraud_proof::operator_block_rewards_final_key();
979+
let storage_key = sp_domains_fraud_proof::fraud_proof::operator_block_fees_final_key();
951980
let mut root = T::Hash::default();
952981
let mut mdb = PrefixedMemoryDB::<T::Hashing>::default();
953982
{
954983
let mut trie = TrieDBMutBuilderV1::new(&mut mdb, &mut root).build();
955-
trie.insert(&storage_key, &rewards.encode()).unwrap();
984+
trie.insert(&storage_key, &block_fees.encode()).unwrap();
956985
};
957986

958987
let backend = TrieBackendBuilder::new(mdb, root).build();
959988
let (root, storage_proof) = storage_proof_for_key::<T, _>(backend, StorageKey(storage_key));
960989
(
961-
FraudProof::InvalidTotalRewards(InvalidTotalRewardsProof {
990+
FraudProof::InvalidBlockFees(InvalidBlockFeesProof {
962991
domain_id,
963992
bad_receipt_hash,
964993
storage_proof,

crates/sp-domains-fraud-proof/src/bundle_equivocation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ mod test {
188188
final_state_root: Default::default(),
189189
execution_trace: vec![],
190190
execution_trace_root: Default::default(),
191-
total_rewards: 0,
191+
block_fees: Default::default(),
192192
},
193193
bundle_size: 0,
194194
estimated_bundle_weight: Default::default(),

0 commit comments

Comments
 (0)