rework kernel features support to handle fee and lock_height on features variants

This commit is contained in:
antiochp 2019-05-31 15:52:09 +01:00
parent a58cae651e
commit 6c322acaf8
No known key found for this signature in database
GPG key ID: 49CBDBCE8AB061C1
4 changed files with 41 additions and 34 deletions

View file

@ -119,13 +119,9 @@ fn basic_transaction_api(test_dir: &'static str) -> Result<(), libwallet::Error>
// Check we have a single kernel and that it is a Plain kernel (no lock_height). // Check we have a single kernel and that it is a Plain kernel (no lock_height).
assert_eq!(slate.tx.kernels().len(), 1); assert_eq!(slate.tx.kernels().len(), 1);
assert_eq!(
slate.tx.kernels().first().map(|k| k.lock_height).unwrap(),
0
);
assert_eq!( assert_eq!(
slate.tx.kernels().first().map(|k| k.features).unwrap(), slate.tx.kernels().first().map(|k| k.features).unwrap(),
transaction::KernelFeatures::Plain transaction::KernelFeatures::Plain { fee: 0 }
); );
Ok(()) Ok(())

View file

@ -20,8 +20,7 @@ use crate::error::{Error, ErrorKind};
use crate::grin_core::core::amount_to_hr_string; use crate::grin_core::core::amount_to_hr_string;
use crate::grin_core::core::committed::Committed; use crate::grin_core::core::committed::Committed;
use crate::grin_core::core::transaction::{ use crate::grin_core::core::transaction::{
kernel_features, kernel_sig_msg, Input, Output, Transaction, TransactionBody, TxKernel, Input, KernelFeatures, Output, Transaction, TransactionBody, TxKernel, Weighting,
Weighting,
}; };
use crate::grin_core::core::verifier_cache::LruVerifierCache; use crate::grin_core::core::verifier_cache::LruVerifierCache;
use crate::grin_core::libtx::{aggsig, build, proof::ProofBuild, secp_ser, tx_fee}; use crate::grin_core::libtx::{aggsig, build, proof::ProofBuild, secp_ser, tx_fee};
@ -290,11 +289,16 @@ impl Slate {
} }
// This is the msg that we will sign as part of the tx kernel. // This is the msg that we will sign as part of the tx kernel.
// Currently includes the fee and the lock_height. // If lock_height is 0 then build a plain kernel, otherwise build a height locked kernel.
fn msg_to_sign(&self) -> Result<secp::Message, Error> { fn msg_to_sign(&self) -> Result<secp::Message, Error> {
// Currently we only support interactively creating a tx with a "default" kernel. let features = match self.lock_height {
let features = kernel_features(self.lock_height); 0 => KernelFeatures::Plain { fee: self.fee },
let msg = kernel_sig_msg(self.fee, self.lock_height, features)?; _ => KernelFeatures::HeightLocked {
fee: self.fee,
lock_height: self.lock_height,
},
};
let msg = features.kernel_sig_msg()?;
Ok(msg) Ok(msg)
} }
@ -881,19 +885,19 @@ impl From<&Output> for OutputV2 {
impl From<&TxKernel> for TxKernelV2 { impl From<&TxKernel> for TxKernelV2 {
fn from(kernel: &TxKernel) -> TxKernelV2 { fn from(kernel: &TxKernel) -> TxKernelV2 {
let TxKernel { let (features, fee, lock_height) = match kernel.features {
features, KernelFeatures::Plain { fee } => (CompatKernelFeatures::Plain, fee, 0),
fee, KernelFeatures::Coinbase => (CompatKernelFeatures::Coinbase, 0, 0),
lock_height, KernelFeatures::HeightLocked { fee, lock_height } => {
excess, (CompatKernelFeatures::HeightLocked, fee, lock_height)
excess_sig, }
} = *kernel; };
TxKernelV2 { TxKernelV2 {
features, features,
fee, fee,
lock_height, lock_height,
excess, excess: kernel.excess,
excess_sig, excess_sig: kernel.excess_sig,
} }
} }
} }
@ -1025,19 +1029,23 @@ impl From<&OutputV2> for Output {
impl From<&TxKernelV2> for TxKernel { impl From<&TxKernelV2> for TxKernel {
fn from(kernel: &TxKernelV2) -> TxKernel { fn from(kernel: &TxKernelV2) -> TxKernel {
let TxKernelV2 { let (fee, lock_height) = (kernel.fee, kernel.lock_height);
features, let features = match kernel.features {
fee, CompatKernelFeatures::Plain => KernelFeatures::Plain { fee },
lock_height, CompatKernelFeatures::Coinbase => KernelFeatures::Coinbase,
excess, CompatKernelFeatures::HeightLocked => KernelFeatures::HeightLocked { fee, lock_height },
excess_sig, };
} = *kernel;
TxKernel { TxKernel {
features, features,
fee, excess: kernel.excess,
lock_height, excess_sig: kernel.excess_sig,
excess,
excess_sig,
} }
} }
} }
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub enum CompatKernelFeatures {
Plain,
Coinbase,
HeightLocked,
}

View file

@ -35,13 +35,14 @@
//! orig_version: u16, //! orig_version: u16,
//! block_header_version: u16, //! block_header_version: u16,
use crate::grin_core::core::transaction::{KernelFeatures, OutputFeatures}; use crate::grin_core::core::transaction::OutputFeatures;
use crate::grin_core::libtx::secp_ser; use crate::grin_core::libtx::secp_ser;
use crate::grin_keychain::BlindingFactor; use crate::grin_keychain::BlindingFactor;
use crate::grin_util::secp; use crate::grin_util::secp;
use crate::grin_util::secp::key::PublicKey; use crate::grin_util::secp::key::PublicKey;
use crate::grin_util::secp::pedersen::{Commitment, RangeProof}; use crate::grin_util::secp::pedersen::{Commitment, RangeProof};
use crate::grin_util::secp::Signature; use crate::grin_util::secp::Signature;
use crate::slate::CompatKernelFeatures;
use uuid::Uuid; use uuid::Uuid;
#[derive(Serialize, Deserialize, Debug, Clone)] #[derive(Serialize, Deserialize, Debug, Clone)]
@ -162,7 +163,7 @@ pub struct OutputV2 {
#[derive(Serialize, Deserialize, Debug, Clone)] #[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TxKernelV2 { pub struct TxKernelV2 {
/// Options for a kernel's structure or use /// Options for a kernel's structure or use
pub features: KernelFeatures, pub features: CompatKernelFeatures,
/// Fee originally included in the transaction this proof is for. /// Fee originally included in the transaction this proof is for.
#[serde(with = "secp_ser::string_or_u64")] #[serde(with = "secp_ser::string_or_u64")]
pub fee: u64, pub fee: u64,

View file

@ -23,7 +23,9 @@ use grin_wallet_util::grin_util::secp::key::{PublicKey, SecretKey};
use rand::thread_rng; use rand::thread_rng;
fn kernel_sig_msg() -> secp::Message { fn kernel_sig_msg() -> secp::Message {
transaction::kernel_sig_msg(0, 0, transaction::KernelFeatures::Plain).unwrap() transaction::KernelFeatures::Plain { fee: 0 }
.kernel_sig_msg()
.unwrap()
} }
#[test] #[test]