8.8 KiB
DLC Transactions
It is recommended that all keys be generated/derived as specified here.
Funding Transaction
Known Values
- Local Funding Inputs:
List[TransactionInput] - Local Change ScriptPubKey:
ScriptPubKey - Local Funding Public Key:
ECPublicKey - Remote Funding Inputs:
List[TransactionInput] - Remote Change ScriptPubKey:
ScriptPubKey - Remote Funding Public Key:
ECPublicKey - nLockTime:
UInt32 - Total Local Collateral:
CurrencyUnit - Total Remote Collateral:
CurrencyUnit - Fee Rate:
FeeUnit
Where
- Local something something Remote
- The sum of each
Funding Inputs' value is at least that of itsTotal Collateral Funding Public Keys are both 33-byte compressed public keysnLockTimeis in the past (rather than just using 0)- for privacy purposes and also to prevent fee snipping
- Both
Change ScriptPubKeys must be eitherP2WSH/P2WPKH, orP2SH-P2WSH/P2SH-P2WPKH
Global
- nLockTime
Inputs
- Local Funding Inputs
- Remote Funding Inputs
Outputs
- P2WSH(DLC Funding Output)
- Local Change ScriptPubKey
- Remote Change ScriptPubKey
Where
-
P2WSH(DLC Funding Output)'s value isTotal Local Collateral + Total Remote Collateral + Computed CET Fee + Computed ToLocal Closing Fee -
DLC Funding Output's script isOP_2 <Local Funding Public Key> <Remote Funding Public Key> OP_2 OP_CHECKMULTISIG -
Each
Change ScriptPubKey's value is at most that of its respectiveSum(Funding Inputs) - Total Collateral - Computed Fees - (Computed CET Fee + Computed ToLocal Closing Fee)/2withComputed Feesbeing proportional to each party's total input weight andComputed CET Feebeing the estimated fee for a Contract Execution Transaction andComputed ToLocal Closing Feebeing the estimated fee for a Unilateral Closing Transaction
Contract Execution Transaction
Known Values
- Oracle Signature Point:
ECPublicKey - Local CET Public Key:
ECPublicKey - Local Payout:
CurrencyUnit - Remote CET Public Key:
ECPublicKey - Remote Paytout:
CurrencyUnit - nLockTime:
UInt32 - Timeout:
UInt32 - DLC Funding Output:
ScriptPubKey - Fee Rate:
FeeUnit
Where
Oracle Signature Pointis the 33-byte public key associated with this CET's outcome- Both
CET Public Keys are 33-byte compressed public keys Local Paytout + Remote Payout = (DLC Funding Output).valuenLockTimeis set to the contract maturity timeTimeoutis a CSV locktime after which penalty transactions are validDLC Funding Outputis of the form specified above
Global
- nLockTime
Inputs
- Input Spending(P2WSH(DLC Funding Output))
Outputs
- P2WSH(ToLocalOutput)
- ToRemoteOutput
Where
-
P2WSH(ToLocalOutput).value = Local Payout + Computed ToLocal Closing Fee -
ToRemoteOutput.value = Remote Payout -
ToLocalOutput's script is:OP_IF <Oracle Signature Point + Local CET Public Key> OP_ELSE <Timeout> OP_CHECKSEQUENCEVERIFY OP_DROP <Remote CET Public Key> OP_ENDIF OP_CHECKSIG- Note that The addition in the if case is elliptic curve point addition
-
ToRemoteOutput's script is:OP_0 <Hash160(Remote CET Public Key)>Which is
P2WPKH(Remote CET Public Key)
Refund Transaction
Known Values
- Local Refund Public Key:
ECPublicKey - Total Local Collateral:
CurrencyUnit - Remote Refund Public Key:
ECPublicKey - Total Remote Collateral:
CurrencyUnit - Timeout:
UInt32 - DLC Funding Output:
ScriptPubKey - Fee Rate:
FeeUnit
Where
- Unlike CETs in a DLC, there is only one Refund Transaction that both parties share, similar to how there is only one Funding Transaction
- Both
Refund Public Keys are 33-byte compressed public keys Total Local Collateral + Total Remote Collateral = (DLC Funding Output).valueTimeoutis a CLTV locktime set well after the contract maturity timeDLC Funding Outputis of the form specified above
Global
- nLockTime is
Timeout
Inputs
- Input Spending(P2WSH(DLC Funding Output))
Outputs
- ToLocalOutput
- ToRemoteOutput
Where
-
ToLocalOutput's value isTotal Local Collateral + RefundFeeDelta/2 -
ToRemoteOutput's value isTotal Remote Collateral + RefundFeeDelta/2 -
RefundFeeDelta = Computed CET Fee + Computed ToLocal Closing Fee - Computed Refund Tx Fee(note that the Refund Transaction is smaller than any CET) -
ToLocalOutput's script is:OP_0 <Hash160(Local Refund Public Key)>Which is
P2WPKH(Local Refund Public Key) -
ToRemoteOutput's script is:OP_0 <Hash160(Remote Refund Public Key)>Which is
P2WPKH(Remote Refund Public Key)
Mutual Closing Transaction
Known Values
- Local Mutual Closing Public Key:
ECPublicKey - Local Payout:
CurrencyUnit - Remote Mutual Closing Public Key:
ECPublicKey - Remote Payout:
CurrencyUnit - nLockTime:
UInt32 - DLC Funding Output:
ScriptPubKey - Fee Rate:
FeeUnit
Where
- After the contract maturity time, Mutual Closing Transaction is created in cooperation for fee reduction and improvement in privacy
- Both
Mutual Closing Public Keys are 33-byte compressed public keys Local Payout = (Contract Execution Transaction Local Payout).valueRemote Payout = (Contract Execution Transaction Remote Payout).valuenLockTimeis in the past (rather than just using 0)- for privacy purposes and also to prevent fee snipping
DLC Funding Outputis of the form specified above
Global
- nLockTime
Inputs
- Input Spending(P2WSH(DLC Funding Output))
Outputs
- ToLocalOutput
- ToRemoteOutput
Where
-
ToLocalOutput's value is Local Payout + MutualClosingFeeDelta/2 -
ToRemoteOutput's value is Remote Payout + MutualClosingFeeDelta/2 -
MutualClosingFeeDelta = Computed CET Fee + Computed ToLocal Closing Fee - Computed MutualClosing Tx Fee (note that the Mutual Closing Transaction is smaller than any CET) -
ToLocalOutput's script is:OP_0 <Hash160(Local Mutual Closing Public Key)>Which is
P2WPKH(Local Mutual Closing Public Key) -
ToRemoteOutput's script is:OP_0 <Hash160(Remote Mutual Closing Public Key)>Which is
P2WPKH(Remote Mutual Closing Public Key)
Closing Transaction (Unilateral)
Known Values
- Local Unilateral Public Key:
ECPublicKey - nLockTime:
UInt32 - Local Payout:
CurrencyUnit - ToLocalOutput:
ScriptPubKey - Fee Rate:
FeeUnit
Where
ToLocalOutputis of the form specified abovenLockTimeis in the past (rather than just using 0)- for privacy purposes and also to prevent fee snipping
Global
- nLockTime
Inputs
- Input Spending(P2WSH(ToLocalOutput))
Outputs
- P2WPKH(Local Unilateral Public Key)
Where
P2WPKH(Local Unilateral Public Key)'s value isLocal Payout
Closing Transaction (Penalty)
Known Values
- Local Penalty Public Key:
ECPublicKey - nLockTime:
UInt32 - Remote's ToLocalOutput:
ScriptPubKey - Fee Rate:
FeeUnit
Where
Remote's ToLocalOutputis of the form specified abovenLockTimeis in the past (rather than just using 0)- for privacy purposes and also to prevent fee snipping
Global
- nLockTime
Inputs
- Input Spending(P2WSH(Remote's ToLocalOutput))
Outputs
- P2WPKH(Local Justice Public Key)
Where
P2WPKH(Local Penalty Public Key)'s value isP2WSH(Remote's ToLocalOutput).value - fee