1
0
Fork 0
mirror of https://github.com/ACINQ/eclair.git synced 2025-03-12 10:30:45 +01:00

Add a "chain hash" property to the bitcoin rpc client

This commit is contained in:
sstone 2025-02-27 17:45:21 +01:00
parent 0a2c6ec3eb
commit 6f7850d2bc
No known key found for this signature in database
GPG key ID: E04E48E72C205463
10 changed files with 20 additions and 10 deletions

View file

@ -24,6 +24,7 @@ import akka.pattern.after
import akka.util.Timeout
import fr.acinq.bitcoin.scalacompat.Crypto.PublicKey
import fr.acinq.bitcoin.scalacompat.{Block, BlockHash, BlockId, ByteVector32, Satoshi, Script, addressToPublicKeyScript}
import fr.acinq.eclair.NodeParams.hashFromChain
import fr.acinq.eclair.Setup.Seeds
import fr.acinq.eclair.balance.{BalanceActor, ChannelsListener}
import fr.acinq.eclair.blockchain._
@ -177,6 +178,7 @@ class Setup(val datadir: File,
}
val bitcoinClient = new BasicBitcoinJsonRPCClient(
chainHash = hashFromChain(chain),
rpcAuthMethod = rpcAuthMethod,
host = config.getString("bitcoind.host"),
port = config.getInt("bitcoind.rpcport"),

View file

@ -16,6 +16,7 @@
package fr.acinq.eclair.blockchain.bitcoind.rpc
import fr.acinq.bitcoin.scalacompat.BlockHash
import fr.acinq.eclair.KamonExt
import fr.acinq.eclair.blockchain.Monitoring.{Metrics, Tags}
import fr.acinq.eclair.json._
@ -32,7 +33,7 @@ import java.util.concurrent.atomic.AtomicReference
import scala.concurrent.{ExecutionContext, Future}
import scala.util.{Failure, Success, Try}
class BasicBitcoinJsonRPCClient(rpcAuthMethod: BitcoinJsonRPCAuthMethod, host: String = "127.0.0.1", port: Int = 8332, ssl: Boolean = false, override val wallet: Option[String] = None)(implicit sb: SttpBackend[Future, _]) extends BitcoinJsonRPCClient {
class BasicBitcoinJsonRPCClient(override val chainHash: BlockHash, rpcAuthMethod: BitcoinJsonRPCAuthMethod, host: String = "127.0.0.1", port: Int = 8332, ssl: Boolean = false, override val wallet: Option[String] = None)(implicit sb: SttpBackend[Future, _]) extends BitcoinJsonRPCClient {
implicit val formats: Formats = DefaultFormats.withBigDecimal +
ByteVector32Serializer + ByteVector32KmpSerializer +

View file

@ -19,6 +19,7 @@ package fr.acinq.eclair.blockchain.bitcoind.rpc
import akka.actor.{ActorSystem, Props}
import akka.pattern.ask
import akka.util.Timeout
import fr.acinq.bitcoin.scalacompat.BlockHash
import fr.acinq.eclair.KamonExt
import fr.acinq.eclair.blockchain.Monitoring.Metrics
import org.json4s.JsonAST
@ -27,6 +28,7 @@ import scala.concurrent.duration._
import scala.concurrent.{ExecutionContext, Future}
class BatchingBitcoinJsonRPCClient(rpcClient: BasicBitcoinJsonRPCClient)(implicit system: ActorSystem, ec: ExecutionContext) extends BitcoinJsonRPCClient {
override def chainHash: BlockHash = rpcClient.chainHash
override def wallet: Option[String] = rpcClient.wallet
implicit val timeout: Timeout = Timeout(1 hour)

View file

@ -16,12 +16,15 @@
package fr.acinq.eclair.blockchain.bitcoind.rpc
import fr.acinq.bitcoin.scalacompat.BlockHash
import org.json4s.JsonAST.JValue
import java.io.IOException
import scala.concurrent.{ExecutionContext, Future}
trait BitcoinJsonRPCClient {
def chainHash: BlockHash
def wallet: Option[String]
def invoke(method: String, params: Any*)(implicit ec: ExecutionContext): Future[JValue]

View file

@ -30,7 +30,7 @@ import scala.concurrent.{ExecutionContext, Future}
/**
* Created by PM on 26/04/2016.
*/
class TestBitcoinCoreClient()(implicit system: ActorSystem) extends BitcoinCoreClient(new BasicBitcoinJsonRPCClient(UserPassword("", ""), "", 0)(sb = null)) {
class TestBitcoinCoreClient()(implicit system: ActorSystem) extends BitcoinCoreClient(new BasicBitcoinJsonRPCClient(Block.RegtestGenesisBlock.hash, UserPassword("", ""), "", 0)(sb = null)) {
import scala.concurrent.ExecutionContext.Implicits.global

View file

@ -22,7 +22,7 @@ import akka.testkit.TestProbe
import fr.acinq.bitcoin
import fr.acinq.bitcoin.psbt.{Psbt, UpdateFailure}
import fr.acinq.bitcoin.scalacompat.Crypto.{PublicKey, der2compact}
import fr.acinq.bitcoin.scalacompat.{Block, BlockId, Btc, BtcDouble, Crypto, DeterministicWallet, KotlinUtils, MilliBtcDouble, MnemonicCode, OP_DROP, OP_PUSHDATA, OutPoint, Satoshi, SatoshiLong, Script, ScriptWitness, Transaction, TxId, TxIn, TxOut, addressFromPublicKeyScript, addressToPublicKeyScript, computeBIP84Address, computeP2PkhAddress, computeP2WpkhAddress}
import fr.acinq.bitcoin.scalacompat.{Block, BlockHash, BlockId, Btc, BtcDouble, Crypto, DeterministicWallet, KotlinUtils, MilliBtcDouble, MnemonicCode, OP_DROP, OP_PUSHDATA, OutPoint, Satoshi, SatoshiLong, Script, ScriptWitness, Transaction, TxId, TxIn, TxOut, addressFromPublicKeyScript, addressToPublicKeyScript, computeBIP84Address, computeP2PkhAddress, computeP2WpkhAddress}
import fr.acinq.bitcoin.{Bech32, SigHash, SigVersion}
import fr.acinq.eclair.TestUtils.randomTxId
import fr.acinq.eclair.blockchain.OnChainWallet.{FundTransactionResponse, MakeFundingTxResponse, OnChainBalance, ProcessPsbtResponse}
@ -199,6 +199,8 @@ class BitcoinCoreClientSpec extends TestKitBaseClass with BitcoindService with A
def makeEvilBitcoinClient(changePosMod: Int => Int, txMod: Transaction => Transaction): BitcoinCoreClient = {
val badRpcClient = new BitcoinJsonRPCClient {
override def chainHash: BlockHash = bitcoinClient.rpcClient.chainHash
override def wallet: Option[String] = if (useEclairSigner) Some("eclair") else None
override def invoke(method: String, params: Any*)(implicit ec: ExecutionContext): Future[JValue] = method match {
@ -389,7 +391,7 @@ class BitcoinCoreClientSpec extends TestKitBaseClass with BitcoindService with A
(0 to 9).foreach { satoshi =>
val apiAmount = JDecimal(BigDecimal(s"0.0000000$satoshi"))
val rpcClient = new BasicBitcoinJsonRPCClient(rpcAuthMethod = UserPassword("foo", "bar"), host = "localhost", port = 0) {
val rpcClient = new BasicBitcoinJsonRPCClient(Block.RegtestGenesisBlock.hash, rpcAuthMethod = UserPassword("foo", "bar"), host = "localhost", port = 0) {
override def invoke(method: String, params: Any*)(implicit ec: ExecutionContext): Future[JValue] = method match {
case "getbalances" => Future(JObject("mine" -> JObject("trusted" -> apiAmount, "untrusted_pending" -> apiAmount)))(ec)
case "getmempoolinfo" => Future(JObject("mempoolminfee" -> JDecimal(0.0002)))(ec)
@ -1775,7 +1777,7 @@ class BitcoinCoreClientWithEclairSignerSpec extends BitcoinCoreClientSpec {
private def createWallet(seed: ByteVector): (BitcoinCoreClient, LocalOnChainKeyManager) = {
val name = s"eclair_${seed.toHex.take(16)}"
val onChainKeyManager = new LocalOnChainKeyManager(name, seed, TimestampSecond.now(), Block.RegtestGenesisBlock.hash)
val jsonRpcClient = new BasicBitcoinJsonRPCClient(rpcAuthMethod = bitcoinrpcauthmethod, host = "localhost", port = bitcoindRpcPort, wallet = Some(name))
val jsonRpcClient = new BasicBitcoinJsonRPCClient(Block.RegtestGenesisBlock.hash, rpcAuthMethod = bitcoinrpcauthmethod, host = "localhost", port = bitcoindRpcPort, wallet = Some(name))
(new BitcoinCoreClient(jsonRpcClient, onChainKeyManager_opt = Some(onChainKeyManager)), onChainKeyManager)
}

View file

@ -123,7 +123,7 @@ trait BitcoindService extends Logging {
} else {
UserPassword("foo", "bar")
}
bitcoinrpcclient = new BasicBitcoinJsonRPCClient(rpcAuthMethod = bitcoinrpcauthmethod, host = "localhost", port = bitcoindRpcPort, wallet = Some(defaultWallet))
bitcoinrpcclient = new BasicBitcoinJsonRPCClient(Block.RegtestGenesisBlock.hash, rpcAuthMethod = bitcoinrpcauthmethod, host = "localhost", port = bitcoindRpcPort, wallet = Some(defaultWallet))
bitcoincli = system.actorOf(Props(new Actor {
override def receive: Receive = {
case BitcoinReq(method) => bitcoinrpcclient.invoke(method).pipeTo(sender())
@ -217,7 +217,7 @@ trait BitcoindService extends Logging {
def createWallet(walletName: String, sender: TestProbe = TestProbe()): BitcoinJsonRPCClient = {
sender.send(bitcoincli, BitcoinReq("createwallet", walletName))
sender.expectMsgType[JValue]
new BasicBitcoinJsonRPCClient(rpcAuthMethod = bitcoinrpcauthmethod, host = "localhost", port = bitcoindRpcPort, wallet = Some(walletName))
new BasicBitcoinJsonRPCClient(Block.RegtestGenesisBlock.hash, rpcAuthMethod = bitcoinrpcauthmethod, host = "localhost", port = bitcoindRpcPort, wallet = Some(walletName))
}
def getNewAddress(sender: TestProbe = TestProbe(), rpcClient: BitcoinJsonRPCClient = bitcoinrpcclient, addressType_opt: Option[String] = None): String = {

View file

@ -99,7 +99,7 @@ class BitcoinCoreFeeProviderSpec extends TestKitBaseClass with BitcoindService w
}
private def createMockBitcoinClient(fees: Map[Int, FeeratePerKB], mempoolMinFee: FeeratePerKB): BasicBitcoinJsonRPCClient = {
new BasicBitcoinJsonRPCClient(rpcAuthMethod = UserPassword("", ""), host = "localhost", port = 0) {
new BasicBitcoinJsonRPCClient(Block.RegtestGenesisBlock.hash, rpcAuthMethod = UserPassword("", ""), host = "localhost", port = 0) {
override def invoke(method: String, params: Any*)(implicit ec: ExecutionContext): Future[JValue] = method match {
case "estimatesmartfee" =>
val blocks = params(0).asInstanceOf[Int]

View file

@ -1842,7 +1842,7 @@ class ReplaceableTxPublisherWithEclairSignerSpec extends ReplaceableTxPublisherS
val entropy = ByteVector.fromValidHex("01" * 32)
val seed = MnemonicCode.toSeed(MnemonicCode.toMnemonics(entropy), walletName)
val keyManager = new LocalOnChainKeyManager(walletName, seed, TimestampSecond.now(), Block.RegtestGenesisBlock.hash)
val walletRpcClient = new BasicBitcoinJsonRPCClient(rpcAuthMethod = bitcoinrpcauthmethod, host = "localhost", port = bitcoindRpcPort, wallet = Some(walletName))
val walletRpcClient = new BasicBitcoinJsonRPCClient(Block.RegtestGenesisBlock.hash, rpcAuthMethod = bitcoinrpcauthmethod, host = "localhost", port = bitcoindRpcPort, wallet = Some(walletName))
val walletClient = new BitcoinCoreClient(walletRpcClient, onChainKeyManager_opt = Some(keyManager)) with OnchainPubkeyCache {
lazy val pubkey = {
getP2wpkhPubkey().pipeTo(probe.ref)

View file

@ -49,7 +49,7 @@ class AnnouncementsBatchValidationSpec extends AnyFunSuite {
implicit val system = ActorSystem("test")
implicit val sttpBackend = OkHttpFutureBackend()
val bitcoinClient = new BitcoinCoreClient(new BasicBitcoinJsonRPCClient(rpcAuthMethod = UserPassword("foo", "bar"), host = "localhost", port = 18332))
val bitcoinClient = new BitcoinCoreClient(new BasicBitcoinJsonRPCClient(Block.RegtestGenesisBlock.hash, rpcAuthMethod = UserPassword("foo", "bar"), host = "localhost", port = 18332))
val channels = for (i <- 0 until 50) yield {
// let's generate a block every 10 txs so that we can compute short ids