First, don’t take the following response as personal, it is only resource based, not opinions.
wilaam:
Sparrow supports deterministic builds, build process from source is trivial, instructions on github,
Sparrow supports deterministic builds
False.
opened 02:30AM - 08 Sep 21 UTC
Hi 👋. I am trying to build from source. As instructed here https://t.me/sparroww… allet/4640 I used these instructions https://adoptopenjdk.net/installation.html?variant=openjdk16&jvmVariant=hotspot#linux-pkg. The adoptopenjdk successfully installs.
Debian Stable (bullseye) amd64 install:
```sh
cd
sudo apt-get install -y wget apt-transport-https gnupg
wget https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
gpg --no-default-keyring --keyring ./adoptopenjdk-keyring.gpg --import public
gpg --no-default-keyring --keyring ./adoptopenjdk-keyring.gpg --export --output adoptopenjdk-archive-keyring.gpg
rm adoptopenjdk-keyring.gpg
sudo mv adoptopenjdk-archive-keyring.gpg /usr/share/keyrings
echo "deb [signed-by=/usr/share/keyrings/adoptopenjdk-archive-keyring.gpg] https://adoptopenjdk.jfrog.io/adoptopenjdk/deb $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/adoptopenjdk.list
sudo apt-get update -y
sudo apt-cache search adoptopenjdk
sudo apt-get install -y adoptopenjdk-16-hotspot
git clone --recursive git@github.com:sparrowwallet/sparrow.git
cd sparrow
```
Problem occurs here `./gradlew jpackage`.
```
sudo ./gradlew jpackage
Downloading https://services.gradle.org/distributions/gradle-7.1-bin.zip
..........10%...........20%...........30%..........40%...........50%...........60%..........70%...........80%...........90%...........100%
Welcome to Gradle 7.1!
Here are the highlights of this release:
- Faster incremental Java compilation
- Easier source set configuration in the Kotlin DSL
For more details see https://docs.gradle.org/7.1/release-notes.html
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :createDelegatingModules
/home/nyxnor/Documents/git/sparrow/build/jlinkbase/tmpjars/org.jdbi.v3.sqlobject/module-info.java:2: warning: [module] module name component v3 should avoid terminal digits
open module org.jdbi.v3.sqlobject {
^
1 warning
/home/nyxnor/Documents/git/sparrow/build/jlinkbase/tmpjars/org.apache.commons.lang3/module-info.java:2: warning: [module] module name component lang3 should avoid terminal digits
open module org.apache.commons.lang3 {
^
1 warning
/home/nyxnor/Documents/git/sparrow/build/jlinkbase/tmpjars/org.antlr.antlr4.runtime/module-info.java:2: warning: [module] module name component antlr4 should avoid terminal digits
open module org.antlr.antlr4.runtime {
^
1 warning
/home/nyxnor/Documents/git/sparrow/build/jlinkbase/tmpjars/org.jdbi.v3.core/module-info.java:2: warning: [module] module name component v3 should avoid terminal digits
open module org.jdbi.v3.core {
^
1 warning
/home/nyxnor/Documents/git/sparrow/build/jlinkbase/tmpjars/io.reactivex.rxjava2/module-info.java:2: warning: [module] module name component rxjava2 should avoid terminal digits
open module io.reactivex.rxjava2 {
^
1 warning
/home/nyxnor/Documents/git/sparrow/build/jlinkbase/tmpjars/de.mkammerer.argon2/module-info.java:2: warning: [module] module name component argon2 should avoid terminal digits
open module de.mkammerer.argon2 {
^
1 warning
> Task :jlink
WARNING: signed modular JAR /home/nyxnor/Documents/git/sparrow/build/jlinkbase/jlinkjars/bcprov-jdk15on-1.64.jar is currently not supported
> Task :jpackage FAILED
Error: Invalid or unsupported type: [rpm]
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':jpackage'.
> Process 'command '/usr/lib/jvm/adoptopenjdk-16-hotspot-amd64/bin/jpackage'' finished with non-zero exit value 1
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 5m 2s
19 actionable tasks: 19 executed
```
with `--info`
```
> Task :jpackage FAILED
Caching disabled for task ':jpackage' because:
Build cache is disabled
Task ':jpackage' is not up-to-date because:
Task has failed previously.
Watching 1047 directories to track changes
Watching 1012 directories to track changes
runtimeImageDir: /home/nyxnor/Documents/git/sparrow/build/image
taskData: org.beryx.jlink.data.JPackageTaskData(moduleName:com.sparrowwallet.sparrow, mainClass:com.sparrowwallet.sparrow.MainApp, customImageData:null, imageDir:/home/nyxnor/Documents/git/sparrow/build/extension 'jlink' property 'imageName', runtimeImageDir:/home/nyxnor/Documents/git/sparrow/build/image, jpackageData:org.beryx.jlink.data.JPackageData(jpackageHome:, outputDir:jpackage, imageOutputDir:/home/nyxnor/Documents/git/sparrow/build/jpackage, imageName:Sparrow, imageOptions:[--icon, src/main/deploy/package/linux/Sparrow.png, --resource-dir, src/main/deploy/package/linux/], resourceDir:null, targetPlatformName:null, skipInstaller:false, installerType:null, installerOutputDir:/home/nyxnor/Documents/git/sparrow/build/jpackage, installerName:Sparrow, appVersion:1.5.0, icon:null, installerOptions:[--file-associations, src/main/deploy/psbt.properties, --file-associations, src/main/deploy/txn.properties, --file-associations, src/main/deploy/bitcoin.properties, --file-associations, src/main/deploy/aopp.properties, --license-file, LICENSE, --resource-dir, src/main/deploy/package/linux/, --linux-shortcut, --linux-rpm-license-type, ASL 2.0], args:[], jvmArgs:[--add-opens=javafx.graphics/com.sun.javafx.css=org.controlsfx.controls, --add-opens=javafx.graphics/javafx.scene=org.controlsfx.controls, --add-opens=javafx.controls/com.sun.javafx.scene.control.behavior=org.controlsfx.controls, --add-opens=javafx.controls/com.sun.javafx.scene.control.inputmap=org.controlsfx.controls, --add-opens=javafx.graphics/com.sun.javafx.scene.traversal=org.controlsfx.controls, --add-opens=javafx.base/com.sun.javafx.event=org.controlsfx.controls, --add-opens=javafx.controls/javafx.scene.control.cell=com.sparrowwallet.sparrow, --add-opens=org.controlsfx.controls/impl.org.controlsfx.skin=com.sparrowwallet.sparrow, --add-opens=org.controlsfx.controls/impl.org.controlsfx.skin=javafx.fxml, --add-opens=javafx.graphics/com.sun.javafx.tk=centerdevice.nsmenufx, --add-opens=javafx.graphics/com.sun.javafx.tk.quantum=centerdevice.nsmenufx, --add-opens=javafx.graphics/com.sun.glass.ui=centerdevice.nsmenufx, --add-opens=javafx.controls/com.sun.javafx.scene.control=centerdevice.nsmenufx, --add-opens=javafx.graphics/com.sun.javafx.menu=centerdevice.nsmenufx, --add-opens=javafx.graphics/com.sun.glass.ui=com.sparrowwallet.sparrow, --add-opens=javafx.graphics/com.sun.javafx.application=com.sparrowwallet.sparrow, --add-opens=java.base/java.net=com.sparrowwallet.sparrow, --add-opens=java.base/java.io=com.google.gson, --add-reads=com.sparrowwallet.merged.module=java.desktop, --add-reads=com.sparrowwallet.merged.module=java.sql, --add-reads=com.sparrowwallet.merged.module=com.sparrowwallet.sparrow, --add-reads=com.sparrowwallet.merged.module=logback.classic, --add-reads=com.sparrowwallet.merged.module=com.fasterxml.jackson.databind, --add-reads=com.sparrowwallet.merged.module=com.fasterxml.jackson.annotation, --add-reads=com.sparrowwallet.merged.module=com.fasterxml.jackson.core], defaultJPackageHome:/usr/lib/jvm/adoptopenjdk-16-hotspot-amd64, secondaryLaunchers:[], launcherName:sparrow, JPackageHomeOrDefault:/usr/lib/jvm/adoptopenjdk-16-hotspot-amd64))
Starting process 'command '/usr/lib/jvm/adoptopenjdk-16-hotspot-amd64/bin/jpackage''. Working directory: /home/nyxnor/Documents/git/sparrow Command: /usr/lib/jvm/adoptopenjdk-16-hotspot-amd64/bin/jpackage --type rpm --dest /home/nyxnor/Documents/git/sparrow/build/jpackage --name Sparrow --app-version 1.5.0 --app-image /home/nyxnor/Documents/git/sparrow/build/jpackage/Sparrow --file-associations src/main/deploy/psbt.properties --file-associations src/main/deploy/txn.properties --file-associations src/main/deploy/bitcoin.properties --file-associations src/main/deploy/aopp.properties --license-file LICENSE --resource-dir src/main/deploy/package/linux/ --linux-shortcut --linux-rpm-license-type ASL 2.0
Successfully started process 'command '/usr/lib/jvm/adoptopenjdk-16-hotspot-amd64/bin/jpackage''
Error: Invalid or unsupported type: [rpm]
Watching 1042 directories to track changes
Watching 1076 directories to track changes
:jpackage (Thread[Execution worker for ':' Thread 2,5,main]) completed. Took 0.483 secs.
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':jpackage'.
> Process 'command '/usr/lib/jvm/adoptopenjdk-16-hotspot-amd64/bin/jpackage'' finished with non-zero exit value 1
* Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 2s
19 actionable tasks: 1 executed, 18 up-to-date
Watching 1075 directories to track changes
Watching 1075 directories to track changes
Watching 1074 directories to track changes
Watching 1073 directories to track changes
Watching 1072 directories to track changes
Watching 1071 directories to track changes
Watching 1070 directories to track changes
Watching 1069 directories to track changes
Watching 1068 directories to track changes
Watching 1067 directories to track changes
Watching 1066 directories to track changes
Watching 1066 directories to track changes
Watching 1066 directories to track changes
Watching 1065 directories to track changes
Watching 1064 directories to track changes
Watching 1063 directories to track changes
Watching 1063 directories to track changes
```
with `--stacktrace`
```
> Task :jpackage FAILED
Error: Invalid or unsupported type: [rpm]
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':jpackage'.
> Process 'command '/usr/lib/jvm/adoptopenjdk-16-hotspot-amd64/bin/jpackage'' finished with non-zero exit value 1
* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':jpackage'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:188)
at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:186)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:174)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79)
at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:408)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:395)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:388)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:374)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: org.gradle.process.internal.ExecException: Process 'command '/usr/lib/jvm/adoptopenjdk-16-hotspot-amd64/bin/jpackage'' finished with non-zero exit value 1
at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:414)
at org.gradle.process.ExecResult$assertNormalExitValue.call(Unknown Source)
at org.beryx.jlink.impl.JPackageTaskImpl$_execute_closure1.doCall(JPackageTaskImpl.groovy:106)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.beryx.jlink.impl.JPackageTaskImpl.execute(JPackageTaskImpl.groovy:70)
at org.beryx.jlink.JPackageTask.jpackageTaskAction(JPackageTask.groovy:80)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:506)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:74)
at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:74)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:491)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:474)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:106)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:271)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:249)
at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:83)
at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:37)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:47)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79)
at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:47)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:37)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:50)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:54)
at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:35)
at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60)
at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27)
at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:174)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:74)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:45)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:40)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:29)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:99)
at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:92)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:85)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:42)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:91)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:106)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:51)
at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:72)
at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:46)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:86)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:86)
at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:32)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:43)
at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:31)
at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution$2.withWorkspace(ExecuteActionsTaskExecuter.java:284)
at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33)
at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:185)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:174)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79)
at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:408)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:395)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:388)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:374)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
* Get more help at https://help.gradle.org
BUILD FAILED in 1s
19 actionable tasks: 1 executed, 18 up-to-date
```
opened 03:22PM - 10 Sep 21 UTC
The `SystemModulesPlugin` used by `jlink` builds two class files, `SystemModules… $all.class` and `SystemModules$default.class`. These class files encode and build the modules for the application. The `build` method takes an `int` as input, which is calculated by the `SystemModulesPlugin` as the result of `ModuleDescriptor.hashCode()`. The value of this hashcode is cached, and in some cases (it appears) set by a constructor.
These values can however differ when building on different machines, affecting build reproducibility. The following `diffoscope` output documents differences in 6 modules across the two classes for the same source built on different machines (both amd64/x86_64 Debian-based OS). It is not clear however why they differ, since `ModuleDescriptor.hashCode()` should be deterministic given the same module configuration.
```
diffoscope ~/sparrow/modules/build/modules-extracted/java.base/jdk/internal/module/SystemModules\$all.class ~/sparrow/modules/github-binaries/modules-extracted/java.base/jdk/internal/module/SystemModules\$all.class
```
```diff
builder87.opens(new ModuleDescriptor.Opens[0]);
builder87.uses(of20);
builder87.provides(new ModuleDescriptor.Provides[0]);
builder87.packages(Set.of("com.github.arteam.simplejsonrpc.client", "com.github.arteam.simplejsonrpc.client.builder", "com.github.arteam.simplejsonrpc.client.exception", "com.github.arteam.simplejsonrpc.client.generator", "com.github.arteam.simplejsonrpc.client.metadata"));
builder87.version("1.0");
- array[72] = builder87.build(1494625572);
+ array[72] = builder87.build(1683523855);
final Builder builder88 = new Builder("simple.json.rpc.server");
builder88.open(true);
builder88.requires(new ModuleDescriptor.Requires[] { Builder.newRequires(of12, "com.fasterxml.jackson.databind"), Builder.newRequires(of12, "com.google.common"), Builder.newRequires(of12, "java.base"), Builder.newRequires(of12, "org.slf4j"), Builder.newRequires(of12, "simple.json.rpc.core") });
builder88.exports(new ModuleDescriptor.Exports[] { Builder.newExports(of, "com.github.arteam.simplejsonrpc.server") });
builder88.opens(new ModuleDescriptor.Opens[0]);
builder88.uses(of20);
builder88.provides(new ModuleDescriptor.Provides[0]);
builder88.packages(Set.of("com.github.arteam.simplejsonrpc.server", "com.github.arteam.simplejsonrpc.server.metadata"));
builder88.version("1.0");
- array[73] = builder88.build(555683016);
+ array[73] = builder88.build(744581299);
final Builder builder89 = new Builder("tornadofx.controls");
builder89.open(true);
builder89.requires(new ModuleDescriptor.Requires[] { Builder.newRequires(of12, "java.base"), Builder.newRequires(of12, "javafx.controls") });
builder89.exports(new ModuleDescriptor.Exports[] { Builder.newExports(of, "tornadofx.control") });
builder89.opens(new ModuleDescriptor.Opens[0]);
builder89.uses(of20);
builder89.provides(new ModuleDescriptor.Provides[0]);
builder89.packages(Set.of("tornadofx.control", "tornadofx.control.skin", "tornadofx.converter", "tornadofx.property", "tornadofx.table"));
builder89.version("1.0.4");
- array[74] = builder89.build(1570093334);
+ array[74] = builder89.build(1758991617);
final Builder builder90 = new Builder("com.sparrowwallet.sparrow");
builder90.open(true);
```
```
diffoscope ~/sparrow/modules/build/modules-extracted/java.base/jdk/internal/module/SystemModules\$default.class ~/sparrow/modules/github-binaries/modules-extracted/java.base/jdk/internal/module/SystemModules\$default.class
```
```diff
--- /home/nyxnor/sparrow/modules/build/modules-extracted/java.base/jdk/internal/module/SystemModules$default.class
+++ /home/nyxnor/sparrow/modules/github-binaries/modules-extracted/java.base/jdk/internal/module/SystemModules$default.class
├── procyon -ec {}
@@ -449,55 +449,55 @@
builder20.requires(new ModuleDescriptor.Requires[] { Builder.newRequires(of12, "java.base"), Builder.newRequires(of12, "javafx.base"), Builder.newRequires(of12, "javafx.controls"), Builder.newRequires(of12, "javafx.graphics") });
builder20.exports(new ModuleDescriptor.Exports[] { Builder.newExports(of, "de.codecentric.centerdevice") });
builder20.opens(new ModuleDescriptor.Opens[0]);
builder20.uses(of20);
builder20.provides(new ModuleDescriptor.Provides[0]);
builder20.packages(Set.of("de.codecentric.centerdevice", "de.codecentric.centerdevice.dialogs.about", "de.codecentric.centerdevice.glass", "de.codecentric.centerdevice.icns", "de.codecentric.centerdevice.labels", "de.codecentric.centerdevice.listener", "de.codecentric.centerdevice.util"));
builder20.version("2.1.7");
- array[9] = builder20.build(-218088662);
+ array[9] = builder20.build(-29190379);
final Builder builder21 = new Builder("co.nstant.in.cbor");
builder21.open(true);
builder21.requires(new ModuleDescriptor.Requires[] { Builder.newRequires(of12, "java.base") });
builder21.exports(new ModuleDescriptor.Exports[] { Builder.newExports(of, "co.nstant.in.cbor") });
builder21.opens(new ModuleDescriptor.Opens[0]);
builder21.uses(of20);
builder21.provides(new ModuleDescriptor.Provides[0]);
builder21.packages(Set.of("co.nstant.in.cbor", "co.nstant.in.cbor.builder", "co.nstant.in.cbor.decoder", "co.nstant.in.cbor.encoder", "co.nstant.in.cbor.model"));
builder21.version("0.9");
- array[10] = builder21.build(-1386751763);
+ array[10] = builder21.build(-1197853480);
final Builder builder22 = new Builder("com.beust.jcommander");
builder22.open(true);
builder22.requires(new ModuleDescriptor.Requires[] { Builder.newRequires(of12, "java.base") });
builder22.exports(new ModuleDescriptor.Exports[] { Builder.newExports(of, "com.beust.jcommander") });
builder22.opens(new ModuleDescriptor.Opens[0]);
builder22.uses(of20);
builder22.provides(new ModuleDescriptor.Provides[0]);
builder22.packages(Set.of("com.beust.jcommander", "com.beust.jcommander.converters", "com.beust.jcommander.defaultprovider", "com.beust.jcommander.internal", "com.beust.jcommander.validators"));
builder22.version("1.81");
- array[11] = builder22.build(121114450);
+ array[11] = builder22.build(310012733);
final Builder builder23 = new Builder("com.fasterxml.jackson.core");
builder23.open(true);
builder23.requires(new ModuleDescriptor.Requires[] { Builder.newRequires(of12, "java.base") });
```
### Files
[diffoscope-all.class.txt](https://github.com/sparrowwallet/sparrow/files/7139923/diffoscope-all.class.txt)
[diffoscope-default.class.txt](https://github.com/sparrowwallet/sparrow/files/7139926/diffoscope-default.class.txt)
22 days ago the developer said to try again: SystemModulesPlugin sometimes breaks reproducibility by encoding different ModuleDescriptor hashCodes · Issue #197 · sparrowwallet/sparrow · GitHub
But really I am tired of compiling, java is resource hungry to build.
So the thing is, the developer said: “try again”
He didn’t say: “it is working, try again”
So if you videoclip your build and diff -R
the built directory and the release directory and the output is exactly 0
, let me know.
Also deterministic doesn’t mean that it is building deterministically only on the maintainer machine, but on all new debian installs.
build process from source is trivial,
False.
Reason 1 is java is resource hungry, try to build it and see how much ram and cpu it uses.
Reason 2: docs to build are incomplete, Reproducible doc by nyxnor · Pull Request #200 · sparrowwallet/sparrow · GitHub
Reason 3: the developer advertised it is a reproducible build before it being reproducible, and hasn’t removed it yet, because it is not.
Focused on privacy
Besides BIP47, the rest is using a centralized coinjoin server by samourai, the whirlpool.
Read the docs How-to: Use Electrum Bitcoin Wallet in Whonix ™
It is not to start with torsocks, it is to set its own socksport.
Electrum respects the proxy field.
wilaam:
Problems:
Impossibility of updating via apt, only self-assembly or installation of deb from github. Whonix developers will either have to build themselves and add whonix to the whonix repository, or install each whonix update as a deb package from github (cannot be updated via apt upgrade)
That is the main reason that it is not gonna happen.
I don’t disagreee that Sparrow is better than Electrum with UX and features, I’m just saying that it doesn’t meet 2 requirements: