Browse Source

Merge #704

704: Move transaction signing onto `Dlc` r=thomaseizinger a=thomaseizinger



Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
debug-collab-settlement
bors[bot] 3 years ago
committed by GitHub
parent
commit
d31d1ef99d
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 180
      daemon/src/model/cfd.rs

180
daemon/src/model/cfd.rs

@ -1057,26 +1057,7 @@ impl Cfd {
bail!("Refund transaction can only be constructed when in state PendingRefund, but we are currently in {}", self.state.clone())
};
let sig_hash = spending_tx_sighash(
&dlc.refund.0,
&dlc.commit.2,
Amount::from_sat(dlc.commit.0.output[0].value),
);
let our_sig = SECP256K1.sign(&sig_hash, &dlc.identity);
let our_pubkey = PublicKey::new(bdk::bitcoin::secp256k1::PublicKey::from_secret_key(
SECP256K1,
&dlc.identity,
));
let counterparty_sig = dlc.refund.1;
let counterparty_pubkey = dlc.identity_counterparty;
let signed_refund_tx = finalize_spend_transaction(
dlc.refund.0,
&dlc.commit.2,
(our_pubkey, our_sig),
(counterparty_pubkey, counterparty_sig),
)?;
Ok(signed_refund_tx)
dlc.signed_refund_tx()
}
pub fn commit_tx(&self) -> Result<Transaction> {
@ -1092,28 +1073,7 @@ impl Cfd {
)
};
let sig_hash = spending_tx_sighash(
&dlc.commit.0,
&dlc.lock.1,
Amount::from_sat(dlc.lock.0.output[0].value),
);
let our_sig = SECP256K1.sign(&sig_hash, &dlc.identity);
let our_pubkey = PublicKey::new(bdk::bitcoin::secp256k1::PublicKey::from_secret_key(
SECP256K1,
&dlc.identity,
));
let counterparty_sig = dlc.commit.1.decrypt(&dlc.publish)?;
let counterparty_pubkey = dlc.identity_counterparty;
let signed_commit_tx = finalize_spend_transaction(
dlc.commit.0,
&dlc.lock.1,
(our_pubkey, our_sig),
(counterparty_pubkey, counterparty_sig),
)?;
Ok(signed_commit_tx)
dlc.signed_commit_tx()
}
pub fn cet(&self) -> Result<Result<Transaction, NotReadyYet>> {
@ -1137,48 +1097,7 @@ impl Cfd {
_ => bail!("Cannot publish CET in state {}", self.state.clone()),
};
let cets = dlc
.cets
.get(&attestation.id)
.context("Unable to find oracle event id within the cets of the dlc")?;
let Cet {
tx: cet,
adaptor_sig: encsig,
n_bits,
..
} = cets
.iter()
.find(|Cet { range, .. }| range.contains(&attestation.price))
.context("Price out of range of cets")?;
let oracle_attestations = attestation.scalars;
let mut decryption_sk = oracle_attestations[0];
for oracle_attestation in oracle_attestations[1..*n_bits].iter() {
decryption_sk.add_assign(oracle_attestation.as_ref())?;
}
let sig_hash = spending_tx_sighash(
cet,
&dlc.commit.2,
Amount::from_sat(dlc.commit.0.output[0].value),
);
let our_sig = SECP256K1.sign(&sig_hash, &dlc.identity);
let our_pubkey = PublicKey::new(bdk::bitcoin::secp256k1::PublicKey::from_secret_key(
SECP256K1,
&dlc.identity,
));
let counterparty_sig = encsig.decrypt(&decryption_sk)?;
let counterparty_pubkey = dlc.identity_counterparty;
let signed_cet = finalize_spend_transaction(
cet.clone(),
&dlc.commit.2,
(our_pubkey, our_sig),
(counterparty_pubkey, counterparty_sig),
)?;
let signed_cet = dlc.signed_cet(&attestation)?;
Ok(Ok(signed_cet))
}
@ -1585,6 +1504,99 @@ impl Dlc {
Role::Taker => self.taker_address.script_pubkey(),
}
}
pub fn signed_refund_tx(&self) -> Result<Transaction> {
let sig_hash = spending_tx_sighash(
&self.refund.0,
&self.commit.2,
Amount::from_sat(self.commit.0.output[0].value),
);
let our_sig = SECP256K1.sign(&sig_hash, &self.identity);
let our_pubkey = PublicKey::new(bdk::bitcoin::secp256k1::PublicKey::from_secret_key(
SECP256K1,
&self.identity,
));
let counterparty_sig = self.refund.1;
let counterparty_pubkey = self.identity_counterparty;
let signed_refund_tx = finalize_spend_transaction(
self.refund.0.clone(),
&self.commit.2,
(our_pubkey, our_sig),
(counterparty_pubkey, counterparty_sig),
)?;
Ok(signed_refund_tx)
}
pub fn signed_commit_tx(&self) -> Result<Transaction> {
let sig_hash = spending_tx_sighash(
&self.commit.0,
&self.lock.1,
Amount::from_sat(self.lock.0.output[0].value),
);
let our_sig = SECP256K1.sign(&sig_hash, &self.identity);
let our_pubkey = PublicKey::new(bdk::bitcoin::secp256k1::PublicKey::from_secret_key(
SECP256K1,
&self.identity,
));
let counterparty_sig = self.commit.1.decrypt(&self.publish)?;
let counterparty_pubkey = self.identity_counterparty;
let signed_commit_tx = finalize_spend_transaction(
self.commit.0.clone(),
&self.lock.1,
(our_pubkey, our_sig),
(counterparty_pubkey, counterparty_sig),
)?;
Ok(signed_commit_tx)
}
pub fn signed_cet(&self, attestation: &Attestation) -> Result<Transaction> {
let cets = self
.cets
.get(&attestation.id)
.context("Unable to find oracle event id within the cets of the self")?;
let Cet {
tx: cet,
adaptor_sig: encsig,
n_bits,
..
} = cets
.iter()
.find(|Cet { range, .. }| range.contains(&attestation.price))
.context("Price out of range of cets")?;
let mut decryption_sk = attestation.scalars[0];
for oracle_attestation in attestation.scalars[1..*n_bits].iter() {
decryption_sk.add_assign(oracle_attestation.as_ref())?;
}
let sig_hash = spending_tx_sighash(
cet,
&self.commit.2,
Amount::from_sat(self.commit.0.output[0].value),
);
let our_sig = SECP256K1.sign(&sig_hash, &self.identity);
let our_pubkey = PublicKey::new(bdk::bitcoin::secp256k1::PublicKey::from_secret_key(
SECP256K1,
&self.identity,
));
let counterparty_sig = encsig.decrypt(&decryption_sk)?;
let counterparty_pubkey = self.identity_counterparty;
let signed_cet = finalize_spend_transaction(
cet.clone(),
&self.commit.2,
(our_pubkey, our_sig),
(counterparty_pubkey, counterparty_sig),
)?;
Ok(signed_cet)
}
}
/// Information which we need to remember in order to construct a

Loading…
Cancel
Save