Skip to content

Commit

Permalink
Create a function to make penalty Tx
Browse files Browse the repository at this point in the history
In this commit, we add a function to prepare a Punishment Tx for later
broadcasting incase of illegal broadcasting of a revoked transaction.
  • Loading branch information
aarani authored and knocte committed Dec 9, 2020
1 parent 8be2dcd commit f0a3778
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 1 deletion.
109 changes: 109 additions & 0 deletions src/DotNetLightning.Core/Channel/CommitmentsModule.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ open NBitcoin

open DotNetLightning.Utils
open DotNetLightning.Transactions
open DotNetLightning.Transactions.Transactions
open DotNetLightning.Crypto
open DotNetLightning.Chain
open DotNetLightning.Serialization.Msgs
Expand Down Expand Up @@ -437,6 +438,114 @@ module RemoteForceClose =
return obscuredCommitmentNumber
}

let createPunishmentTx (perCommitmentSecret: PerCommitmentSecret)
(commitments: Commitments)
(localChannelPrivKeys: ChannelPrivKeys)
(network: Network)
: TransactionBuilder =

let localChannelPubKeys = commitments.LocalParams.ChannelPubKeys
let remoteChannelPubKeys = commitments.RemoteParams.ChannelPubKeys

let perCommitmentPoint = perCommitmentSecret.PerCommitmentPoint()

let localCommitmentPubKeys =
perCommitmentPoint.DeriveCommitmentPubKeys localChannelPubKeys

let remoteCommitmentPubKeys =
perCommitmentPoint.DeriveCommitmentPubKeys remoteChannelPubKeys

let transactionBuilder = createTransactionBuilder network

let toRemoteScriptPubKey =
localCommitmentPubKeys
.PaymentPubKey
.RawPubKey()
.WitHash.ScriptPubKey

let toLocalScriptPubKey =
Scripts.toLocalDelayed
localCommitmentPubKeys.RevocationPubKey
commitments.RemoteParams.ToSelfDelay
remoteCommitmentPubKeys.DelayedPaymentPubKey

let toLocalWitScriptPubKey = toLocalScriptPubKey.WitHash.ScriptPubKey

let commitFee = commitTxFee
commitments.RemoteParams.DustLimitSatoshis
commitments.RemoteCommit.Spec

let (toLocalAmount, toRemoteAmount) =
if (commitments.LocalParams.IsFunder) then
(commitments.RemoteCommit.Spec.ToLocal.Satoshi
|> Money.Satoshis),
(commitments.RemoteCommit.Spec.ToRemote.Satoshi
|> Money.Satoshis) - commitFee
else
(commitments.RemoteCommit.Spec.ToLocal.Satoshi
|> Money.Satoshis) - commitFee,
(commitments.RemoteCommit.Spec.ToRemote.Satoshi
|> Money.Satoshis)

let toLocalTxOut =
TxOut(toLocalAmount, toLocalWitScriptPubKey)
let toRemoteTxOut =
TxOut(toRemoteAmount, toRemoteScriptPubKey)

let outputs =
seq {
if toLocalAmount > commitments.RemoteParams.DustLimitSatoshis then
yield toLocalTxOut

if toRemoteAmount > commitments.RemoteParams.DustLimitSatoshis then
yield toRemoteTxOut
}
|> Seq.sortWith TxOut.LexicographicCompare

let toRemoteIndexOpt =
outputs
|> Seq.tryFindIndex (fun out -> out.ScriptPubKey = toRemoteScriptPubKey)

match toRemoteIndexOpt with
| None -> ()
| Some toRemoteIndex ->
let localPaymentPrivKey =
perCommitmentPoint.DerivePaymentPrivKey localChannelPrivKeys.PaymentBasepointSecret

(transactionBuilder.AddKeys(localPaymentPrivKey.RawKey()))
.AddCoins(Coin
(commitments.RemoteCommit.TxId.Value,
toRemoteIndex |> uint32,
toRemoteTxOut.Value,
toRemoteTxOut.ScriptPubKey))
|> ignore
()

let toLocalIndexOpt =
outputs
|> Seq.tryFindIndex (fun out -> out.ScriptPubKey = toLocalWitScriptPubKey)

match toLocalIndexOpt with
| None -> ()
| Some toLocalIndex ->
let revocationPrivKey =
perCommitmentSecret.DeriveRevocationPrivKey localChannelPrivKeys.RevocationBasepointSecret

transactionBuilder.Extensions.Add(CommitmentToLocalExtension())
|> ignore

(transactionBuilder.AddKeys(revocationPrivKey.RawKey()))
.AddCoins(ScriptCoin
(commitments.RemoteCommit.TxId.Value,
toLocalIndex |> uint32,
toLocalTxOut.Value,
toLocalWitScriptPubKey,
toLocalScriptPubKey))
|> ignore
()

transactionBuilder

let tryGetFundsFromRemoteCommitmentTx (commitments: Commitments)
(localChannelPrivKeys: ChannelPrivKeys)
(network: Network)
Expand Down
2 changes: 1 addition & 1 deletion src/DotNetLightning.Core/Transactions/Transactions.fs
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ module Transactions =
[<Literal>]
let OFFERED_HTLC_SCRIPT_WEIGHT = 133uy

let private createTransactionBuilder (network: Network) =
let internal createTransactionBuilder (network: Network) =
let txb = network.CreateTransactionBuilder()
txb.ShuffleOutputs <- false
txb.ShuffleInputs <- false
Expand Down

0 comments on commit f0a3778

Please sign in to comment.