Skip to content

Commit 0011473

Browse files
committed
feat(data_structures): add transaction factories for StakeTransaction
1 parent 8e5991d commit 0011473

File tree

13 files changed

+412
-150
lines changed

13 files changed

+412
-150
lines changed

config/src/defaults.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,13 @@ pub const PSEUDO_CONSENSUS_CONSTANTS_WIP0022_REWARD_COLLATERAL_RATIO: u64 = 125;
486486
// TODO: modify the value directly in ConsensusConstants
487487
pub const PSEUDO_CONSENSUS_CONSTANTS_WIP0027_COLLATERAL_AGE: u32 = 13440;
488488

489+
/// Maximum weight units that a block can devote to `StakeTransaction`s.
490+
pub const PSEUDO_CONSENSUS_CONSTANTS_POS_MAX_STAKE_BLOCK_WEIGHT: u32 = 10_000_000;
491+
492+
/// Minimum amount of nanoWits that a `StakeTransaction` can add, and minimum amount that can be
493+
/// left in stake by an `UnstakeTransaction`.
494+
pub const PSEUDO_CONSENSUS_CONSTANTS_POS_MIN_STAKE_NANOWITS: u64 = 10_000_000_000_000;
495+
489496
/// Struct that will implement all the development defaults
490497
pub struct Development;
491498

data_structures/examples/transactions_pool_overhead.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ fn random_transaction() -> (Transaction, u64) {
100100
} else {
101101
let dr_output = random_dr_output();
102102
Transaction::DataRequest(DRTransaction {
103-
body: DRTransactionBody::new(inputs, outputs, dr_output),
103+
body: DRTransactionBody::new(inputs, dr_output, outputs),
104104
signatures: vec![signature; num_inputs],
105105
})
106106
};

data_structures/src/chain/mod.rs

Lines changed: 72 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,6 @@ impl Block {
518518
pub fn weight(&self) -> u32 {
519519
self.dr_weight() + self.vt_weight() + self.st_weight()
520520
}
521-
522521
}
523522

524523
impl BlockTransactions {
@@ -1370,6 +1369,18 @@ pub struct ValueTransferOutput {
13701369
pub time_lock: u64,
13711370
}
13721371

1372+
impl ValueTransferOutput {
1373+
#[inline]
1374+
pub fn value(&self) -> u64 {
1375+
self.value
1376+
}
1377+
1378+
#[inline]
1379+
pub fn weight(&self) -> u32 {
1380+
OUTPUT_SIZE
1381+
}
1382+
}
1383+
13731384
/// Data request output transaction data structure
13741385
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize, ProtobufConvert, Hash, Default)]
13751386
#[protobuf_convert(pb = "witnet::DataRequestOutput")]
@@ -1436,6 +1447,44 @@ impl DataRequestOutput {
14361447
}
14371448
}
14381449

1450+
#[derive(Debug, Default, Eq, PartialEq, Clone, Serialize, Deserialize, ProtobufConvert, Hash)]
1451+
#[protobuf_convert(pb = "witnet::StakeOutput")]
1452+
pub struct StakeOutput {
1453+
pub value: u64,
1454+
pub authorization: KeyedSignature,
1455+
}
1456+
1457+
impl StakeOutput {
1458+
#[inline]
1459+
pub fn weight(&self) -> u32 {
1460+
crate::transaction::STAKE_OUTPUT_WEIGHT
1461+
}
1462+
}
1463+
1464+
pub enum Output {
1465+
DataRequest(DataRequestOutput),
1466+
Stake(StakeOutput),
1467+
ValueTransfer(ValueTransferOutput),
1468+
}
1469+
1470+
impl Output {
1471+
pub fn value(&self) -> Result<u64, TransactionError> {
1472+
match self {
1473+
Output::DataRequest(output) => output.checked_total_value(),
1474+
Output::Stake(output) => Ok(output.value),
1475+
Output::ValueTransfer(output) => Ok(output.value),
1476+
}
1477+
}
1478+
1479+
pub fn weight(&self) -> u32 {
1480+
match self {
1481+
Output::DataRequest(output) => output.weight(),
1482+
Output::Stake(output) => output.weight(),
1483+
Output::ValueTransfer(output) => output.weight(),
1484+
}
1485+
}
1486+
}
1487+
14391488
/// Information about the total supply
14401489
#[derive(Clone, Debug, Serialize, Deserialize)]
14411490
pub struct SupplyInfo {
@@ -2761,8 +2810,7 @@ impl TransactionsPool {
27612810
/// Returns a list of all the removed transactions.
27622811
fn remove_transactions_for_size_limit(&mut self) -> Vec<Transaction> {
27632812
let mut removed_transactions = vec![];
2764-
while self.total_transactions_weight() > self.weight_limit
2765-
{
2813+
while self.total_transactions_weight() > self.weight_limit {
27662814
// Try to split the memory between value transfer and data requests using the same
27672815
// ratio as the one used in blocks
27682816
// The ratio of vt to dr in blocks is currently 1:4
@@ -3107,8 +3155,8 @@ impl TransactionsPool {
31073155
v
31083156
}
31093157

3110-
pub fn total_transactions_weight (&self) -> u64 {
3111-
self.total_vt_weight + self.total_dr_weight + self.total_st_weight
3158+
pub fn total_transactions_weight(&self) -> u64 {
3159+
self.total_vt_weight + self.total_dr_weight + self.total_st_weight
31123160
}
31133161
}
31143162

@@ -4218,7 +4266,7 @@ pub fn transaction_example() -> Transaction {
42184266
let outputs = vec![value_transfer_output];
42194267

42204268
Transaction::DataRequest(DRTransaction::new(
4221-
DRTransactionBody::new(inputs, outputs, data_request_output),
4269+
DRTransactionBody::new(inputs, data_request_output, outputs),
42224270
keyed_signature,
42234271
))
42244272
}
@@ -4322,7 +4370,7 @@ mod tests {
43224370
.iter()
43234371
.map(|input| {
43244372
DRTransaction::new(
4325-
DRTransactionBody::new(vec![*input], vec![], DataRequestOutput::default()),
4373+
DRTransactionBody::new(vec![*input], DataRequestOutput::default(), vec![]),
43264374
vec![],
43274375
)
43284376
})
@@ -4796,14 +4844,14 @@ mod tests {
47964844
);
47974845

47984846
let dr_1 = DRTransaction::new(
4799-
DRTransactionBody::new(vec![input], vec![], DataRequestOutput::default()),
4847+
DRTransactionBody::new(vec![input], DataRequestOutput::default(), vec![]),
48004848
vec![],
48014849
);
48024850
let dr_2 = DRTransaction::new(
48034851
DRTransactionBody::new(
48044852
vec![input],
4805-
vec![ValueTransferOutput::default()],
48064853
DataRequestOutput::default(),
4854+
vec![ValueTransferOutput::default()],
48074855
),
48084856
vec![],
48094857
);
@@ -4873,14 +4921,14 @@ mod tests {
48734921
);
48744922

48754923
let dr_1 = DRTransaction::new(
4876-
DRTransactionBody::new(vec![input], vec![], DataRequestOutput::default()),
4924+
DRTransactionBody::new(vec![input], DataRequestOutput::default(), vec![]),
48774925
vec![],
48784926
);
48794927
let dr_2 = DRTransaction::new(
48804928
DRTransactionBody::new(
48814929
vec![input2],
4882-
vec![ValueTransferOutput::default()],
48834930
DataRequestOutput::default(),
4931+
vec![ValueTransferOutput::default()],
48844932
),
48854933
vec![],
48864934
);
@@ -4974,11 +5022,11 @@ mod tests {
49745022
assert_ne!(input0, input1);
49755023

49765024
let dr_1 = DRTransaction::new(
4977-
DRTransactionBody::new(vec![input0], vec![], DataRequestOutput::default()),
5025+
DRTransactionBody::new(vec![input0], DataRequestOutput::default(), vec![]),
49785026
vec![],
49795027
);
49805028
let dr_2 = DRTransaction::new(
4981-
DRTransactionBody::new(vec![input0, input1], vec![], DataRequestOutput::default()),
5029+
DRTransactionBody::new(vec![input0, input1], DataRequestOutput::default(), vec![]),
49825030
vec![],
49835031
);
49845032

@@ -5040,7 +5088,7 @@ mod tests {
50405088
fn transactions_pool_malleability_dr() {
50415089
let input = Input::default();
50425090
let mut dr_1 = DRTransaction::new(
5043-
DRTransactionBody::new(vec![input], vec![], DataRequestOutput::default()),
5091+
DRTransactionBody::new(vec![input], DataRequestOutput::default(), vec![]),
50445092
vec![KeyedSignature::default()],
50455093
);
50465094
// Add dummy signature, but pretend it is valid
@@ -5235,12 +5283,12 @@ mod tests {
52355283
Transaction::DataRequest(DRTransaction::new(
52365284
DRTransactionBody::new(
52375285
vec![Input::default()],
5286+
DataRequestOutput::default(),
52385287
vec![ValueTransferOutput {
52395288
pkh: Default::default(),
52405289
value: i,
52415290
time_lock: 0,
52425291
}],
5243-
DataRequestOutput::default(),
52445292
),
52455293
vec![],
52465294
))
@@ -5478,7 +5526,7 @@ mod tests {
54785526
witnesses: 1,
54795527
..Default::default()
54805528
};
5481-
let drb = DRTransactionBody::new(vec![], vec![], dro);
5529+
let drb = DRTransactionBody::new(vec![], dro, vec![]);
54825530
let drt = DRTransaction::new(
54835531
drb,
54845532
vec![KeyedSignature {
@@ -5516,7 +5564,7 @@ mod tests {
55165564
commit_and_reveal_fee: 501,
55175565
..Default::default()
55185566
};
5519-
let drb1 = DRTransactionBody::new(vec![], vec![], dro1);
5567+
let drb1 = DRTransactionBody::new(vec![], dro1, vec![]);
55205568
let drt1 = DRTransaction::new(
55215569
drb1,
55225570
vec![KeyedSignature {
@@ -5531,7 +5579,7 @@ mod tests {
55315579
commit_and_reveal_fee: 100,
55325580
..Default::default()
55335581
};
5534-
let drb2 = DRTransactionBody::new(vec![], vec![], dro2);
5582+
let drb2 = DRTransactionBody::new(vec![], dro2, vec![]);
55355583
let drt2 = DRTransaction::new(
55365584
drb2,
55375585
vec![KeyedSignature {
@@ -5546,7 +5594,7 @@ mod tests {
55465594
commit_and_reveal_fee: 500,
55475595
..Default::default()
55485596
};
5549-
let drb3 = DRTransactionBody::new(vec![], vec![], dro3);
5597+
let drb3 = DRTransactionBody::new(vec![], dro3, vec![]);
55505598
let drt3 = DRTransaction::new(
55515599
drb3,
55525600
vec![KeyedSignature {
@@ -5638,7 +5686,7 @@ mod tests {
56385686
witnesses: 2,
56395687
..Default::default()
56405688
};
5641-
let drb = DRTransactionBody::new(vec![], vec![], dro);
5689+
let drb = DRTransactionBody::new(vec![], dro, vec![]);
56425690
let drt = DRTransaction::new(
56435691
drb,
56445692
vec![KeyedSignature {
@@ -5678,7 +5726,7 @@ mod tests {
56785726
witnesses: 1,
56795727
..Default::default()
56805728
};
5681-
let drb = DRTransactionBody::new(vec![], vec![], dro);
5729+
let drb = DRTransactionBody::new(vec![], dro, vec![]);
56825730
let drt = DRTransaction::new(
56835731
drb,
56845732
vec![KeyedSignature {
@@ -5717,7 +5765,7 @@ mod tests {
57175765
witnesses: 1,
57185766
..Default::default()
57195767
};
5720-
let drb = DRTransactionBody::new(vec![], vec![], dro);
5768+
let drb = DRTransactionBody::new(vec![], dro, vec![]);
57215769
let drt = DRTransaction::new(
57225770
drb,
57235771
vec![KeyedSignature {
@@ -5755,7 +5803,7 @@ mod tests {
57555803
witnesses: 2,
57565804
..Default::default()
57575805
};
5758-
let drb = DRTransactionBody::new(vec![], vec![], dro);
5806+
let drb = DRTransactionBody::new(vec![], dro, vec![]);
57595807
let drt = DRTransaction::new(
57605808
drb,
57615809
vec![KeyedSignature {
@@ -5793,7 +5841,7 @@ mod tests {
57935841
witnesses: 2,
57945842
..Default::default()
57955843
};
5796-
let drb = DRTransactionBody::new(vec![], vec![], dro);
5844+
let drb = DRTransactionBody::new(vec![], dro, vec![]);
57975845
let drt = DRTransaction::new(
57985846
drb,
57995847
vec![KeyedSignature {

data_structures/src/data_request.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -742,7 +742,7 @@ mod tests {
742742
..DataRequestInfo::default()
743743
};
744744
let dr_transaction = DRTransaction::new(
745-
DRTransactionBody::new(vec![Input::default()], vec![], DataRequestOutput::default()),
745+
DRTransactionBody::new(vec![Input::default()], DataRequestOutput::default(), vec![]),
746746
vec![KeyedSignature::default()],
747747
);
748748
let dr_pointer = dr_transaction.hash();
@@ -777,7 +777,7 @@ mod tests {
777777
..DataRequestOutput::default()
778778
};
779779
let dr_transaction = DRTransaction::new(
780-
DRTransactionBody::new(vec![Input::default()], vec![], dr_output),
780+
DRTransactionBody::new(vec![Input::default()], dr_output, vec![]),
781781
vec![KeyedSignature::default()],
782782
);
783783
let dr_pointer = dr_transaction.hash();
@@ -812,7 +812,7 @@ mod tests {
812812
..DataRequestOutput::default()
813813
};
814814
let dr_transaction = DRTransaction::new(
815-
DRTransactionBody::new(vec![Input::default()], vec![], dr_output),
815+
DRTransactionBody::new(vec![Input::default()], dr_output, vec![]),
816816
vec![KeyedSignature::default()],
817817
);
818818
let dr_pointer = dr_transaction.hash();

0 commit comments

Comments
 (0)