Skip to content

Commit 2b39bf6

Browse files
authored
Update bitcoin-lib (#3179)
And simplify musig2 nonce using Scala classes.
1 parent d04ed3d commit 2b39bf6

20 files changed

+85
-95
lines changed

.mvn/checksums/checksums-central.sha256

Lines changed: 18 additions & 18 deletions
Large diffs are not rendered by default.

eclair-core/src/main/scala/fr/acinq/eclair/channel/Commitments.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package fr.acinq.eclair.channel
22

33
import akka.event.LoggingAdapter
4-
import fr.acinq.bitcoin.crypto.musig2.IndividualNonce
54
import fr.acinq.bitcoin.scalacompat.Crypto.{PrivateKey, PublicKey}
5+
import fr.acinq.bitcoin.scalacompat.Musig2.IndividualNonce
66
import fr.acinq.bitcoin.scalacompat.{ByteVector32, ByteVector64, Crypto, OutPoint, Satoshi, SatoshiLong, Transaction, TxId}
7-
import fr.acinq.eclair.blockchain.fee.{FeeratePerByte, FeeratePerKw, FeeratesPerKw, OnChainFeeConf}
7+
import fr.acinq.eclair.blockchain.fee.{FeeratePerKw, FeeratesPerKw, OnChainFeeConf}
88
import fr.acinq.eclair.channel.ChannelSpendSignature.{IndividualSignature, PartialSignatureWithNonce}
99
import fr.acinq.eclair.channel.Helpers.Closing
1010
import fr.acinq.eclair.channel.Monitoring.{Metrics, Tags}

eclair-core/src/main/scala/fr/acinq/eclair/channel/Helpers.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
package fr.acinq.eclair.channel
1818

1919
import akka.event.{DiagnosticLoggingAdapter, LoggingAdapter}
20-
import fr.acinq.bitcoin.crypto.musig2.IndividualNonce
2120
import fr.acinq.bitcoin.scalacompat.Crypto.{PrivateKey, PublicKey, sha256}
21+
import fr.acinq.bitcoin.scalacompat.Musig2.{IndividualNonce, LocalNonce}
2222
import fr.acinq.bitcoin.scalacompat._
2323
import fr.acinq.eclair._
2424
import fr.acinq.eclair.blockchain.OnChainPubkeyCache

eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/Channel.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import akka.actor.typed.scaladsl.Behaviors
2020
import akka.actor.typed.scaladsl.adapter.{ClassicActorContextOps, actorRefAdapter}
2121
import akka.actor.{Actor, ActorContext, ActorRef, FSM, OneForOneStrategy, PossiblyHarmful, Props, SupervisorStrategy, typed}
2222
import akka.event.Logging.MDC
23-
import fr.acinq.bitcoin.crypto.musig2.IndividualNonce
2423
import fr.acinq.bitcoin.scalacompat.Crypto.{PrivateKey, PublicKey}
24+
import fr.acinq.bitcoin.scalacompat.Musig2.{IndividualNonce, LocalNonce}
2525
import fr.acinq.bitcoin.scalacompat.{ByteVector32, Satoshi, SatoshiLong, Transaction, TxId}
2626
import fr.acinq.eclair.Logs.LogCategory
2727
import fr.acinq.eclair._

eclair-core/src/main/scala/fr/acinq/eclair/channel/fund/InteractiveTxBuilder.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import akka.actor.typed.scaladsl.{ActorContext, Behaviors, StashBuffer}
2222
import akka.actor.typed.{ActorRef, Behavior}
2323
import akka.event.LoggingAdapter
2424
import fr.acinq.bitcoin.ScriptFlags
25-
import fr.acinq.bitcoin.crypto.musig2.IndividualNonce
2625
import fr.acinq.bitcoin.psbt.Psbt
2726
import fr.acinq.bitcoin.scalacompat.Crypto.{PrivateKey, PublicKey}
27+
import fr.acinq.bitcoin.scalacompat.Musig2.{IndividualNonce, LocalNonce}
2828
import fr.acinq.bitcoin.scalacompat.{ByteVector32, LexicographicalOrdering, OutPoint, Satoshi, SatoshiLong, Script, ScriptWitness, Transaction, TxId, TxIn, TxOut}
2929
import fr.acinq.eclair.blockchain.OnChainChannelFunder
3030
import fr.acinq.eclair.blockchain.fee.FeeratePerKw

eclair-core/src/main/scala/fr/acinq/eclair/channel/fund/InteractiveTxFunder.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package fr.acinq.eclair.channel.fund
1919
import akka.actor.typed.scaladsl.{ActorContext, Behaviors}
2020
import akka.actor.typed.{ActorRef, Behavior}
2121
import fr.acinq.bitcoin.scalacompat.Crypto.PublicKey
22-
import fr.acinq.bitcoin.scalacompat.{KotlinUtils, OutPoint, Satoshi, SatoshiLong, Script, ScriptWitness, Transaction, TxIn, TxOut}
22+
import fr.acinq.bitcoin.scalacompat.{OutPoint, Satoshi, SatoshiLong, Script, ScriptWitness, Transaction, TxIn, TxOut}
2323
import fr.acinq.eclair.blockchain.OnChainChannelFunder
2424
import fr.acinq.eclair.blockchain.fee.FeeratePerKw
2525
import fr.acinq.eclair.channel.fund.InteractiveTxBuilder._
@@ -75,7 +75,7 @@ object InteractiveTxFunder {
7575
*/
7676
def computeSpliceContribution(isInitiator: Boolean, sharedInput: SharedFundingInput, spliceInAmount: Satoshi, spliceOut: Seq[TxOut], targetFeerate: FeeratePerKw): Satoshi = {
7777
val fees = if (spliceInAmount == 0.sat) {
78-
val spliceOutputsWeight = spliceOut.map(KotlinUtils.scala2kmp).map(_.weight()).sum
78+
val spliceOutputsWeight = spliceOut.map(_.weight()).sum
7979
val weight = if (isInitiator) {
8080
// The initiator must add the shared input, the shared output and pay for the fees of the common transaction fields.
8181
val dummyTx = Transaction(2, Nil, Seq(sharedInput.info.txOut), 0)

eclair-core/src/main/scala/fr/acinq/eclair/crypto/NonceGenerator.scala

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package fr.acinq.eclair.crypto
22

33
import fr.acinq.bitcoin.scalacompat.Crypto.{PrivateKey, PublicKey}
4+
import fr.acinq.bitcoin.scalacompat.Musig2.LocalNonce
45
import fr.acinq.bitcoin.scalacompat.{ByteVector32, Musig2, TxId}
56
import fr.acinq.eclair.randomBytes32
6-
import fr.acinq.eclair.transactions.Transactions.LocalNonce
77
import grizzled.slf4j.Logging
88

99
object NonceGenerator extends Logging {
@@ -17,17 +17,15 @@ object NonceGenerator extends Logging {
1717
* @return a deterministic nonce used to sign our local commit tx: its public part is sent to our peer.
1818
*/
1919
def verificationNonce(fundingTxId: TxId, fundingPrivKey: PrivateKey, remoteFundingPubKey: PublicKey, commitIndex: Long): LocalNonce = {
20-
val nonces = Musig2.generateNonceWithCounter(commitIndex, fundingPrivKey, Seq(fundingPrivKey.publicKey, remoteFundingPubKey), None, Some(fundingTxId.value))
21-
LocalNonce(nonces._1, nonces._2)
20+
Musig2.generateNonceWithCounter(commitIndex, fundingPrivKey, Seq(fundingPrivKey.publicKey, remoteFundingPubKey), None, Some(fundingTxId.value))
2221
}
2322

2423
/**
2524
* @return a random nonce used to sign our peer's commit tx.
2625
*/
2726
def signingNonce(localFundingPubKey: PublicKey, remoteFundingPubKey: PublicKey, fundingTxId: TxId): LocalNonce = {
2827
val sessionId = randomBytes32()
29-
val nonces = Musig2.generateNonce(sessionId, Right(localFundingPubKey), Seq(localFundingPubKey, remoteFundingPubKey), None, Some(fundingTxId.value))
30-
LocalNonce(nonces._1, nonces._2)
28+
Musig2.generateNonce(sessionId, Right(localFundingPubKey), Seq(localFundingPubKey, remoteFundingPubKey), None, Some(fundingTxId.value))
3129
}
3230

3331
}

eclair-core/src/main/scala/fr/acinq/eclair/crypto/keymanager/LocalOnChainKeyManager.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package fr.acinq.eclair.crypto.keymanager
1818

1919
import com.typesafe.config.ConfigFactory
20-
import fr.acinq.bitcoin.ScriptTree
2120
import fr.acinq.bitcoin.psbt.Psbt
2221
import fr.acinq.bitcoin.scalacompat.DeterministicWallet._
2322
import fr.acinq.bitcoin.scalacompat.{Block, BlockHash, ByteVector64, Crypto, DeterministicWallet, MnemonicCode, Satoshi, Script, computeBIP84Address}
@@ -295,8 +294,8 @@ class LocalOnChainKeyManager(override val walletName: String, seed: ByteVector,
295294
}
296295

297296
private def signPsbtInput86(psbt: Psbt, pos: Int): Psbt = {
297+
import fr.acinq.bitcoin.SigHash
298298
import fr.acinq.bitcoin.scalacompat.KotlinUtils._
299-
import fr.acinq.bitcoin.{Script, SigHash}
300299

301300
val input = psbt.getInput(pos)
302301
require(input != null, s"input $pos is missing from psbt: bitcoin core may be malicious")
@@ -307,7 +306,7 @@ class LocalOnChainKeyManager(override val walletName: String, seed: ByteVector,
307306
val (pub, keypath) = input.getTaprootDerivationPaths.asScala.toSeq.head
308307
val priv = fr.acinq.bitcoin.DeterministicWallet.derivePrivateKey(master.priv, keypath.keyPath).getPrivateKey
309308
require(priv.publicKey().xOnly() == pub, s"derived public key doesn't match (expected=$pub actual=${priv.publicKey().xOnly()}): bitcoin core may be malicious")
310-
val expectedScript = ByteVector(Script.write(Script.pay2tr(pub, null.asInstanceOf[ScriptTree])))
309+
val expectedScript = Script.write(Script.pay2tr(pub, None))
311310
require(kmp2scala(input.getWitnessUtxo.publicKeyScript) == expectedScript, s"script mismatch (expected=$expectedScript, actual=${input.getWitnessUtxo.publicKeyScript}): bitcoin core may be malicious")
312311

313312
// No need to update the input, we can directly sign and finalize.

eclair-core/src/main/scala/fr/acinq/eclair/json/JsonSerializers.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
package fr.acinq.eclair.json
1818

1919
import com.google.common.net.HostAndPort
20-
import fr.acinq.bitcoin.crypto.musig2.IndividualNonce
2120
import fr.acinq.bitcoin.scalacompat.Crypto.{PrivateKey, PublicKey}
2221
import fr.acinq.bitcoin.scalacompat.DeterministicWallet.KeyPath
22+
import fr.acinq.bitcoin.scalacompat.Musig2.IndividualNonce
2323
import fr.acinq.bitcoin.scalacompat.{BlockHash, BlockId, Btc, ByteVector32, ByteVector64, OutPoint, Satoshi, Transaction, TxId}
2424
import fr.acinq.eclair.balance.CheckBalance.{DetailedOnChainBalance, GlobalBalance, OffChainBalance}
2525
import fr.acinq.eclair.blockchain.fee.FeeratePerKw
@@ -153,7 +153,7 @@ object ByteVector64Serializer extends MinimalSerializer({
153153
})
154154

155155
object IndividualNonceSerializer extends MinimalSerializer({
156-
case x: IndividualNonce => JString(x.toString)
156+
case x: IndividualNonce => JString(x.data.toHex)
157157
})
158158

159159
object UInt64Serializer extends MinimalSerializer({

eclair-core/src/main/scala/fr/acinq/eclair/transactions/Scripts.scala

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package fr.acinq.eclair.transactions
1818

1919
import fr.acinq.bitcoin.Script.LOCKTIME_THRESHOLD
20-
import fr.acinq.bitcoin.ScriptTree
2120
import fr.acinq.bitcoin.SigHash._
2221
import fr.acinq.bitcoin.TxIn.{SEQUENCE_LOCKTIME_DISABLE_FLAG, SEQUENCE_LOCKTIME_MASK, SEQUENCE_LOCKTIME_TYPE_FLAG}
2322
import fr.acinq.bitcoin.scalacompat.Crypto.{PublicKey, XonlyPublicKey}
@@ -28,7 +27,6 @@ import fr.acinq.eclair.transactions.Transactions._
2827
import fr.acinq.eclair.{BlockHeight, CltvExpiry, CltvExpiryDelta}
2928
import scodec.bits.ByteVector
3029

31-
import scala.jdk.CollectionConverters.SeqHasAsJava
3230
import scala.util.{Success, Try}
3331

3432
/**
@@ -318,10 +316,6 @@ object Scripts {
318316
*/
319317
object Taproot {
320318

321-
import KotlinUtils._
322-
323-
implicit def scala2kmpscript(input: Seq[fr.acinq.bitcoin.scalacompat.ScriptElt]): java.util.List[fr.acinq.bitcoin.ScriptElt] = input.map(e => scala2kmp(e)).asJava
324-
325319
/**
326320
* Taproot signatures are usually 64 bytes, unless a non-default sighash is used, in which case it is appended.
327321
*/
@@ -347,7 +341,7 @@ object Scripts {
347341

348342
// miniscript: older(16)
349343
private val anchorScript: Seq[ScriptElt] = OP_16 :: OP_CHECKSEQUENCEVERIFY :: Nil
350-
val anchorScriptTree = new ScriptTree.Leaf(anchorScript)
344+
val anchorScriptTree = ScriptTree.Leaf(anchorScript)
351345

352346
/**
353347
* Script used for local or remote anchor outputs.
@@ -381,16 +375,16 @@ object Scripts {
381375
}
382376

383377
case class ToLocalScriptTree(localDelayed: ScriptTree.Leaf, revocation: ScriptTree.Leaf) {
384-
val scriptTree: ScriptTree.Branch = new ScriptTree.Branch(localDelayed, revocation)
378+
val scriptTree: ScriptTree.Branch = ScriptTree.Branch(localDelayed, revocation)
385379
}
386380

387381
/**
388382
* @return a script tree with two leaves (to self with delay, and to revocation key)
389383
*/
390384
def toLocalScriptTree(keys: CommitmentPublicKeys, toSelfDelay: CltvExpiryDelta): ToLocalScriptTree = {
391385
ToLocalScriptTree(
392-
new ScriptTree.Leaf(toLocalDelayed(keys, toSelfDelay)),
393-
new ScriptTree.Leaf(toRevocationKey(keys)),
386+
ScriptTree.Leaf(toLocalDelayed(keys, toSelfDelay)),
387+
ScriptTree.Leaf(toRevocationKey(keys)),
394388
)
395389
}
396390

@@ -419,7 +413,7 @@ object Scripts {
419413
* @return a script tree with a single leaf (to remote key, with a 1-block CSV delay)
420414
*/
421415
def toRemoteScriptTree(keys: CommitmentPublicKeys): ScriptTree.Leaf = {
422-
new ScriptTree.Leaf(toRemoteDelayed(keys))
416+
ScriptTree.Leaf(toRemoteDelayed(keys))
423417
}
424418

425419
/**
@@ -459,7 +453,7 @@ object Scripts {
459453
}
460454

461455
case class OfferedHtlcScriptTree(timeout: ScriptTree.Leaf, success: ScriptTree.Leaf) {
462-
val scriptTree: ScriptTree.Branch = new ScriptTree.Branch(timeout, success)
456+
val scriptTree: ScriptTree.Branch = ScriptTree.Branch(timeout, success)
463457

464458
def witnessTimeout(commitKeys: LocalCommitmentKeys, localSig: ByteVector64, remoteSig: ByteVector64): ScriptWitness = {
465459
Script.witnessScriptPathPay2tr(commitKeys.revocationPublicKey.xOnly, timeout, ScriptWitness(Seq(Taproot.encodeSig(remoteSig, htlcRemoteSighash(ZeroFeeHtlcTxSimpleTaprootChannelCommitmentFormat)), localSig)), scriptTree)
@@ -475,8 +469,8 @@ object Scripts {
475469
*/
476470
def offeredHtlcScriptTree(keys: CommitmentPublicKeys, paymentHash: ByteVector32): OfferedHtlcScriptTree = {
477471
OfferedHtlcScriptTree(
478-
new ScriptTree.Leaf(offeredHtlcTimeout(keys)),
479-
new ScriptTree.Leaf(offeredHtlcSuccess(keys, paymentHash)),
472+
ScriptTree.Leaf(offeredHtlcTimeout(keys)),
473+
ScriptTree.Leaf(offeredHtlcSuccess(keys, paymentHash)),
480474
)
481475
}
482476

@@ -510,7 +504,7 @@ object Scripts {
510504
}
511505

512506
case class ReceivedHtlcScriptTree(timeout: ScriptTree.Leaf, success: ScriptTree.Leaf) {
513-
val scriptTree = new ScriptTree.Branch(timeout, success)
507+
val scriptTree = ScriptTree.Branch(timeout, success)
514508

515509
def witnessSuccess(commitKeys: LocalCommitmentKeys, localSig: ByteVector64, remoteSig: ByteVector64, paymentPreimage: ByteVector32): ScriptWitness = {
516510
Script.witnessScriptPathPay2tr(commitKeys.revocationPublicKey.xOnly, success, ScriptWitness(Seq(Taproot.encodeSig(remoteSig, htlcRemoteSighash(ZeroFeeHtlcTxSimpleTaprootChannelCommitmentFormat)), localSig, paymentPreimage)), scriptTree)
@@ -526,16 +520,16 @@ object Scripts {
526520
*/
527521
def receivedHtlcScriptTree(keys: CommitmentPublicKeys, paymentHash: ByteVector32, expiry: CltvExpiry): ReceivedHtlcScriptTree = {
528522
ReceivedHtlcScriptTree(
529-
new ScriptTree.Leaf(receivedHtlcTimeout(keys, expiry)),
530-
new ScriptTree.Leaf(receivedHtlcSuccess(keys, paymentHash)),
523+
ScriptTree.Leaf(receivedHtlcTimeout(keys, expiry)),
524+
ScriptTree.Leaf(receivedHtlcSuccess(keys, paymentHash)),
531525
)
532526
}
533527

534528
/**
535529
* Script tree used for the output of pre-signed HTLC 2nd-stage transactions.
536530
*/
537531
def htlcDelayedScriptTree(keys: CommitmentPublicKeys, toSelfDelay: CltvExpiryDelta): ScriptTree.Leaf = {
538-
new ScriptTree.Leaf(toLocalDelayed(keys, toSelfDelay))
532+
ScriptTree.Leaf(toLocalDelayed(keys, toSelfDelay))
539533
}
540534

541535
/**

0 commit comments

Comments
 (0)