mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-13 06:29:25 +00:00
Add SignableTransaction Read/Write
This commit is contained in:
@@ -173,12 +173,6 @@ pub struct RctBase {
|
||||
}
|
||||
|
||||
impl RctBase {
|
||||
/// The weight of this RctBase as relevant for fees.
|
||||
pub fn fee_weight(outputs: usize, fee: u64) -> usize {
|
||||
// 1 byte for the RCT signature type
|
||||
1 + (outputs * (8 + 32)) + varint_len(fee)
|
||||
}
|
||||
|
||||
/// Write the RctBase.
|
||||
pub fn write<W: Write>(&self, w: &mut W, rct_type: RctType) -> io::Result<()> {
|
||||
w.write_all(&[u8::from(rct_type)])?;
|
||||
@@ -295,16 +289,6 @@ pub enum RctPrunable {
|
||||
}
|
||||
|
||||
impl RctPrunable {
|
||||
/// The weight of this RctPrunable as relevant for fees.
|
||||
#[rustfmt::skip]
|
||||
pub fn fee_weight(bp_plus: bool, ring_len: usize, inputs: usize, outputs: usize) -> usize {
|
||||
// 1 byte for number of BPs (technically a VarInt, yet there's always just zero or one)
|
||||
1 +
|
||||
Bulletproof::fee_weight(bp_plus, outputs) +
|
||||
// There's both the CLSAG and the pseudo-out
|
||||
(inputs * (Clsag::fee_weight(ring_len) + 32))
|
||||
}
|
||||
|
||||
/// Write the RctPrunable.
|
||||
pub fn write<W: Write>(&self, w: &mut W, rct_type: RctType) -> io::Result<()> {
|
||||
match self {
|
||||
@@ -446,17 +430,6 @@ impl RctProofs {
|
||||
}
|
||||
}
|
||||
|
||||
/// The weight of this RctProofs, as relevant for fees.
|
||||
pub fn fee_weight(
|
||||
bp_plus: bool,
|
||||
ring_len: usize,
|
||||
inputs: usize,
|
||||
outputs: usize,
|
||||
fee: u64,
|
||||
) -> usize {
|
||||
RctBase::fee_weight(outputs, fee) + RctPrunable::fee_weight(bp_plus, ring_len, inputs, outputs)
|
||||
}
|
||||
|
||||
/// Write the RctProofs.
|
||||
pub fn write<W: Write>(&self, w: &mut W) -> io::Result<()> {
|
||||
let rct_type = self.rct_type();
|
||||
|
||||
@@ -32,13 +32,6 @@ pub enum Input {
|
||||
}
|
||||
|
||||
impl Input {
|
||||
/// The weight of this Input, as relevant for fees.
|
||||
pub fn fee_weight(offsets_weight: usize) -> usize {
|
||||
// Uses 1 byte for the input type
|
||||
// Uses 1 byte for the VarInt amount due to amount being 0
|
||||
1 + 1 + offsets_weight + 32
|
||||
}
|
||||
|
||||
/// Write the Input.
|
||||
pub fn write<W: Write>(&self, w: &mut W) -> io::Result<()> {
|
||||
match self {
|
||||
@@ -98,13 +91,6 @@ pub struct Output {
|
||||
}
|
||||
|
||||
impl Output {
|
||||
/// The weight of this Output, as relevant for fees.
|
||||
pub fn fee_weight(view_tags: bool) -> usize {
|
||||
// Uses 1 byte for the output type
|
||||
// Uses 1 byte for the VarInt amount due to amount being 0
|
||||
1 + 1 + 32 + if view_tags { 1 } else { 0 }
|
||||
}
|
||||
|
||||
/// Write the Output.
|
||||
pub fn write<W: Write>(&self, w: &mut W) -> io::Result<()> {
|
||||
write_varint(&self.amount.unwrap_or(0), w)?;
|
||||
@@ -221,23 +207,6 @@ pub struct TransactionPrefix {
|
||||
}
|
||||
|
||||
impl TransactionPrefix {
|
||||
/// The weight of this TransactionPrefix, as relevant for fees.
|
||||
pub fn fee_weight(
|
||||
decoy_weights: &[usize],
|
||||
outputs: usize,
|
||||
view_tags: bool,
|
||||
extra: usize,
|
||||
) -> usize {
|
||||
// Assumes Timelock::None since this library won't let you create a TX with a timelock
|
||||
// 1 input for every decoy weight
|
||||
1 + varint_len(decoy_weights.len()) +
|
||||
decoy_weights.iter().map(|&offsets_weight| Input::fee_weight(offsets_weight)).sum::<usize>() +
|
||||
varint_len(outputs) +
|
||||
(outputs * Output::fee_weight(view_tags)) +
|
||||
varint_len(extra) +
|
||||
extra
|
||||
}
|
||||
|
||||
/// Write a TransactionPrefix.
|
||||
///
|
||||
/// This is distinct from Monero in that it won't write any version.
|
||||
@@ -323,22 +292,6 @@ impl Transaction {
|
||||
}
|
||||
}
|
||||
|
||||
/// The weight of this Transaction, as relevant for fees.
|
||||
// TODO: Replace ring_len, decoy_weights for &[&[usize]], where the inner buf is the decoy
|
||||
// offsets
|
||||
pub fn fee_weight(
|
||||
view_tags: bool,
|
||||
bp_plus: bool,
|
||||
ring_len: usize,
|
||||
decoy_weights: &[usize],
|
||||
outputs: usize,
|
||||
extra: usize,
|
||||
fee: u64,
|
||||
) -> usize {
|
||||
1 + TransactionPrefix::fee_weight(decoy_weights, outputs, view_tags, extra) +
|
||||
RctProofs::fee_weight(bp_plus, ring_len, decoy_weights.len(), outputs, fee)
|
||||
}
|
||||
|
||||
/// Write the Transaction.
|
||||
///
|
||||
/// Some writable transactions may not be readable if they're malformed, per Monero's consensus
|
||||
|
||||
Reference in New Issue
Block a user