From 68ac51f51d4a8db3fb9bccf17a2f0fd601418926 Mon Sep 17 00:00:00 2001 From: Alva Swanson Date: Mon, 2 Sep 2024 16:57:53 +0000 Subject: [PATCH 1/2] bitcoin-core-binaries: Download Bitcoin Core --- .../BitcoinCoreBinaryUrlProvider.kt | 20 +++++++++++++++++++ .../gradle/bitcoin_core/BitcoinCorePlugin.kt | 6 ++++++ 2 files changed, 26 insertions(+) create mode 100644 build-logic/bitcoin-core-binaries/src/main/kotlin/bisq/gradle/bitcoin_core/BitcoinCoreBinaryUrlProvider.kt diff --git a/build-logic/bitcoin-core-binaries/src/main/kotlin/bisq/gradle/bitcoin_core/BitcoinCoreBinaryUrlProvider.kt b/build-logic/bitcoin-core-binaries/src/main/kotlin/bisq/gradle/bitcoin_core/BitcoinCoreBinaryUrlProvider.kt new file mode 100644 index 0000000000..d675399557 --- /dev/null +++ b/build-logic/bitcoin-core-binaries/src/main/kotlin/bisq/gradle/bitcoin_core/BitcoinCoreBinaryUrlProvider.kt @@ -0,0 +1,20 @@ +package bisq.gradle.bitcoin_core + +import bisq.gradle.tasks.PerPlatformUrlProvider + +class BitcoinCoreBinaryUrlProvider(private val version: String) : PerPlatformUrlProvider { + override val urlPrefix: String + get() = "https://bitcoincore.org/bin/bitcoin-core-$version/bitcoin-$version-" + + override val LINUX_X86_64_URL: String + get() = "x86_64-linux-gnu.tar.gz" + + override val MACOS_X86_64_URL: String + get() = "x86_64-apple-darwin.tar.gz" + + override val MACOS_ARM_64_URL: String + get() = "arm64-apple-darwin.tar.gz" + + override val WIN_X86_64_URL: String + get() = "win64.zip" +} \ No newline at end of file diff --git a/build-logic/bitcoin-core-binaries/src/main/kotlin/bisq/gradle/bitcoin_core/BitcoinCorePlugin.kt b/build-logic/bitcoin-core-binaries/src/main/kotlin/bisq/gradle/bitcoin_core/BitcoinCorePlugin.kt index 958d35fd8c..1ef2612450 100644 --- a/build-logic/bitcoin-core-binaries/src/main/kotlin/bisq/gradle/bitcoin_core/BitcoinCorePlugin.kt +++ b/build-logic/bitcoin-core-binaries/src/main/kotlin/bisq/gradle/bitcoin_core/BitcoinCorePlugin.kt @@ -1,9 +1,11 @@ package bisq.gradle.bitcoin_core import bisq.gradle.tasks.PgpFingerprint +import bisq.gradle.tasks.download.DownloadTaskFactory import bisq.gradle.tasks.download.SignedBinaryDownloader import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.provider.Provider import org.gradle.kotlin.dsl.create @@ -58,6 +60,10 @@ class BitcoinCorePlugin : Plugin { ) ) hashFileDownloader.registerTasks() + + val binaryDownloadUrl: Provider = extension.version.map { BitcoinCoreBinaryUrlProvider(it).url } + val downloadTaskFactory = DownloadTaskFactory(project, DOWNLOADS_DIR) + downloadTaskFactory.registerDownloadTask("downloadBitcoinCore", binaryDownloadUrl) } private fun filenameAndFingerprint(filename: String, fingerprint: String) = From b5be65de33146f1a52b9557ab60a5fafc0dc5633 Mon Sep 17 00:00:00 2001 From: Alva Swanson Date: Mon, 2 Sep 2024 16:57:58 +0000 Subject: [PATCH 2/2] bitcoin-core-binaries: Support SHA256 hash verification The hash verification task looks up the expected hash and verifies that the provided file has that hash. To look up the expected hash, the Gradle task parses the input hash list file of the format ' filename.tar.gz' (per line). Most projects use this format. --- .../bitcoin-core-binaries/build.gradle.kts | 1 + .../bitcoin_core/HashVerificationTask.kt | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 build-logic/bitcoin-core-binaries/src/main/kotlin/bisq/gradle/bitcoin_core/HashVerificationTask.kt diff --git a/build-logic/bitcoin-core-binaries/build.gradle.kts b/build-logic/bitcoin-core-binaries/build.gradle.kts index 206037e269..0551f6241d 100644 --- a/build-logic/bitcoin-core-binaries/build.gradle.kts +++ b/build-logic/bitcoin-core-binaries/build.gradle.kts @@ -18,4 +18,5 @@ gradlePlugin { dependencies { implementation(project(":gradle-tasks")) + implementation(libs.google.guava) } \ No newline at end of file diff --git a/build-logic/bitcoin-core-binaries/src/main/kotlin/bisq/gradle/bitcoin_core/HashVerificationTask.kt b/build-logic/bitcoin-core-binaries/src/main/kotlin/bisq/gradle/bitcoin_core/HashVerificationTask.kt new file mode 100644 index 0000000000..43dcdfb557 --- /dev/null +++ b/build-logic/bitcoin-core-binaries/src/main/kotlin/bisq/gradle/bitcoin_core/HashVerificationTask.kt @@ -0,0 +1,50 @@ +package bisq.gradle.bitcoin_core + +import com.google.common.hash.Hashing +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.OutputFile +import org.gradle.api.tasks.TaskAction + +abstract class HashVerificationTask : DefaultTask() { + @get:InputFile + abstract val inputFile: RegularFileProperty + + @get:InputFile + abstract val sha256File: RegularFileProperty + + @get:OutputFile + abstract val resultFile: RegularFileProperty + + @TaskAction + fun verify() { + val input = inputFile.get().asFile.readBytes() + val hash: String = Hashing.sha256() + .hashBytes(input) + .toString() + + val expectedHash = getExpectedHash() + if (hash != expectedHash) { + throw GradleException( + "Hash verification failed for `${inputFile.get().asFile.absolutePath}`. " + + "Expected: `$expectedHash, Actual: `$hash`" + ) + } + + resultFile.get().asFile.writeText(hash) + } + + private fun getExpectedHash(): String { + val inputFileName = inputFile.get().asFile.name + for (line in sha256File.get().asFile.readLines()) { + if (line.endsWith(inputFileName)) { + // ' filename.tar.gz' + return line.split(" ").first() + } + } + + throw GradleException("Couldn't find expected hash for `$inputFile`.") + } +} \ No newline at end of file