bisq-network / bisq-core Goto Github PK
View Code? Open in Web Editor NEW⚠️DEPRECATED. See https://github.com/bisq-network/bisq
License: GNU Affero General Public License v3.0
⚠️DEPRECATED. See https://github.com/bisq-network/bisq
License: GNU Affero General Public License v3.0
This will probably be a bit of a political issue, but I would really like to see bisq running without bitcoinj.
The topic was raised in Tech Session #4 and it seems important to address it properly. Please let me know if there a better place to have this discussion.
The two main reasons that make it very obvious to me are:
Another view on bitcoinj that might be useful: Petter Todd describing it as a possible attack vector (@cbeams you were in the room if I'm not mistaken ;).
java.lang.ExceptionInInitializerError
(No message provided)
com.sun.tools.javac.code.TypeTags
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':compileJava'.Open stacktrace
Caused by: java.lang.RuntimeException: java.lang.ExceptionInInitializerErrorOpen stacktrace
Caused by: java.lang.ExceptionInInitializerError: (No message provided)Open stacktrace
Caused by: java.lang.ClassNotFoundException: com.sun.tools.javac.code.TypeTagsClose stacktrace
at lombok.launch.ShadowClassLoader.loadClass(ShadowClassLoader.java:422)
at lombok.javac.JavacTreeMaker$SchroedingerType.getFieldCached(JavacTreeMaker.java:156)
at lombok.javac.JavacTreeMaker$TypeTag.typeTag(JavacTreeMaker.java:244)
at lombok.javac.Javac.(Javac.java:155)
at lombok.javac.handlers.HandleGetter.(HandleGetter.java:303)
at lombok.core.SpiLoadUtil$1$1.next(SpiLoadUtil.java:111)
at lombok.javac.HandlerLibrary.loadAnnotationHandlers(HandlerLibrary.java:171)
at lombok.javac.HandlerLibrary.load(HandlerLibrary.java:156)
at lombok.javac.JavacTransformer.(JavacTransformer.java:44)
at lombok.javac.apt.LombokProcessor.init(LombokProcessor.java:87)
at lombok.core.AnnotationProcessor$JavacDescriptor.want(AnnotationProcessor.java:87)
at lombok.core.AnnotationProcessor.init(AnnotationProcessor.java:140)
at lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init(AnnotationProcessor.java:69)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.(JavacProcessingEnvironment.java:674)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:771)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:866)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$2100(JavacProcessingEnvironment.java:110)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1202)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1311)
at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1250)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:928)
at com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:100)
at com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:142)
at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:96)
at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:90)
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:50)
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:37)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:98)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:51)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:37)
at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:35)
at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:25)
at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:156)
at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:141)
at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:114)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:50)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:124)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:113)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:95)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:73)
at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ResolveBuildCacheKeyExecuter.execute(ResolveBuildCacheKeyExecuter.java:66)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:256)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:249)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:238)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:663)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:597)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
If I currently start after a full re-build desktop/build/app/bin/bisq-desktop
the application throws following error:
Aug-20 16:17:34.221 [readFromResourcesThread] ERROR b.c.s.CommonSetup: Uncaught Exception from thread readFromResourcesThread
Aug-20 16:17:34.221 [readFromResourcesThread] ERROR b.c.s.CommonSetup: throwableMessage= bisq.core.dao.state.BsqState cannot be cast to bisq.core.trade.statistics.TradeStatistics2Store
Aug-20 16:17:34.222 [readFromResourcesThread] ERROR b.c.s.CommonSetup: throwableClass= class java.lang.ClassCastException
Aug-20 16:17:34.224 [readFromResourcesThread] ERROR b.c.s.CommonSetup: Stack trace:
java.lang.ClassCastException: bisq.core.dao.state.BsqState cannot be cast to bisq.core.trade.statistics.TradeStatistics2Store
at bisq.core.trade.statistics.TradeStatistics2StorageService.getMap(TradeStatistics2StorageService.java:63)
at bisq.network.p2p.storage.persistence.StoreService.putIfAbsent(StoreService.java:76)
at bisq.network.p2p.storage.persistence.AppendOnlyDataStoreService.lambda$put$3(AppendOnlyDataStoreService.java:81)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at bisq.network.p2p.storage.persistence.AppendOnlyDataStoreService.put(AppendOnlyDataStoreService.java:80)
at java.util.concurrent.ConcurrentHashMap.forEach(ConcurrentHashMap.java:1597)
at bisq.network.p2p.storage.persistence.AppendOnlyDataStoreService.transferDeprecatedDataStructure(AppendOnlyDataStoreService.java:66)
at bisq.network.p2p.storage.persistence.AppendOnlyDataStoreService.readFromResources(AppendOnlyDataStoreService.java:59)
at bisq.network.p2p.storage.P2PDataStorage.readFromResources(P2PDataStorage.java:155)
at bisq.core.app.SetupUtils.lambda$readFromResources$1(SetupUtils.java:98)
at java.lang.Thread.run(Thread.java:748)
java.lang.ClassCastException: bisq.core.dao.state.BsqState cannot be cast to bisq.core.trade.statistics.TradeStatistics2Store
at bisq.core.trade.statistics.TradeStatistics2StorageService.getMap(TradeStatistics2StorageService.java:63)
at bisq.network.p2p.storage.persistence.StoreService.putIfAbsent(StoreService.java:76)
at bisq.network.p2p.storage.persistence.AppendOnlyDataStoreService.lambda$put$3(AppendOnlyDataStoreService.java:81)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at bisq.network.p2p.storage.persistence.AppendOnlyDataStoreService.put(AppendOnlyDataStoreService.java:80)
at java.util.concurrent.ConcurrentHashMap.forEach(ConcurrentHashMap.java:1597)
at bisq.network.p2p.storage.persistence.AppendOnlyDataStoreService.transferDeprecatedDataStructure(AppendOnlyDataStoreService.java:66)
at bisq.network.p2p.storage.persistence.AppendOnlyDataStoreService.readFromResources(AppendOnlyDataStoreService.java:59)
at bisq.network.p2p.storage.P2PDataStorage.readFromResources(P2PDataStorage.java:155)
at bisq.core.app.SetupUtils.lambda$readFromResources$1(SetupUtils.java:98)
at java.lang.Thread.run(Thread.java:748)
Aug-20 16:17:50.235 [JavaFX Application Thread] ERROR b.n.p.n.TorNetworkNode: A timeout occurred at shutDown
Aug-20 16:18:05.235 [JavaFX Application Thread] WARN b.c.a.BisqExecutable: Timeout triggered resultHandler
It works if I start the current master from IntelliJ, but I run into this issue when building from command line.
Master the head commit is,
e2c6d00
mvn test
gives error,
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project bisq-core: Compilation failure
[ERROR] /E:/projects/wqking/bisq-core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java:[32,32] cannot find symbol
[ERROR] symbol: class PersistableNetworkPayloadCollection
[ERROR] location: package bisq.network.p2p.storage
There is no class PersistableNetworkPayloadCollection in package bisq-p2p snapshot, though I found it exists in another version.
This happens on both Ubuntu and Win10, JDK 8
I started all over again from scratch and created a new implementation of the Coin class, test class and added the new coin name to the meta-inf list and got the error below, still using MacOS high sierra with JDK 1.8.161
`./gradlew build
Task :compileJava FAILED
/Users/jared/bisq-core-new/src/main/java/bisq/core/dao/param/ParamChangeEventList.java:57: error: cannot find symbol
public static PersistableEnvelope fromProto(PB.ParamChangeEventList proto) {
^
symbol: class ParamChangeEventList
location: class PB
/Users/jared/bisq-core-new/src/main/java/bisq/core/dao/param/ParamChangeEvent.java:44: error: cannot find symbol
public PB.ParamChangeEvent toProtoMessage() {
^
symbol: class ParamChangeEvent
location: class PB
/Users/jared/bisq-core-new/src/main/java/bisq/core/dao/param/ParamChangeEvent.java:52: error: cannot find symbol
public static ParamChangeEvent fromProto(PB.ParamChangeEvent proto) {
^
symbol: class ParamChangeEvent
location: class PB
3 errors
FAILURE: Build failed with an exception.
Compilation failed; see the compiler error output for details.
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 10s
1 actionable task: 1 executed
`
We can create a deterministic jar file, create a Sha256 hash from it and upload that with the binaries to Github. Users who download the app with the in-app installer will download the hash of the jar to their local data directory name with the version nr. (e.g. Bisq-0.7.0.jar.txt).
EDITED:
After download and restart of the app we verify if the hash of the running jar is the same as the downloaded hash. That happens at startup before any relevant operations have been started.
This will add additional security to ensure the jar file in the binary is not manipulated and matches the code version of the release.
The deterministic jar can be reproduced by anyone from the release commit. Users who don't use the in-app downloader can do the verification manually by either downloading the hash of the jar and adding it to the data directory or by running the hash verification by themselves.
Deterministic builds for the binary itself is unfortunately more complex. Any dev experienced with that is highly welcome to help us to get last mile also solved.
UPDATE:
It does not make sense to verify from the running jar as if it was modified the jar check can have been removed so we do not gain any security by that.
There still might be possibilities to verify the jar inside the binary before starting it manually (at least on OSX it is rather trivial to open the .app file and do manually a check with 'shasum -a 256' with the jar file inside the Contents/Java/Bisq-{version}.jar). With .deb it should be possible as well. Not sure if that is possible/easy with exe files.
Build: Stable v0.6.7
Operating System: Windows 10, Ubuntu 17.10
Issue: Presently all "M" addresses for Litecoin post-Segwit fail the validation check when attempting to configure a Litecoin Altcoin account. The client still expects old "P2SH" addresses, and will readily accept converted or legacy addresses as normal.
As posted by @marco4444 in proposals bisq-network/proposals#17
In order to avoid that bisq-trades can be assigned to a person via time/amount analyses (on the fiat side), it is recommended to trade with full euro amounts (0 cents), as there are then on average 39 times as many transfers of exactly the same amount on the same day in the entire currency area (compared to the average of the frequencies of the other 99 possibilities .xy).
With the current crooked amounts, it is only a question of time when many of them can be assigned to a person after the fact, since the complete history of the amounts/times is public. The smaller a currency area is, the more important this is, since the same amounts occur less frequently on the same day than for dollars and euros. Unfavorable cents such as.74 and.93 are even 390 times less common than rounded amounts and there is a high risk to be the only person in the currency area using the same amount on the same day.
Is there any way to review the validation logic for XMR (Monero)? thanks!
I investigated the Amazon visa card potential as a payment method. Here are the findings:
(long link, not sure it will work)
list-asset.adoc
accordingly.mrconfig
and .gitignore
files accordingly.The handling of Sepa an Sepa instant accounts is not correct.
There are 2 bugs:
If the offer is SEPA and the the taker has a SEPA INSTANT account and takes that offer the cehck of the contract fails on the maker side and lead to lost taker fee on the takers side.
If a maker creates an offer with a SEPA INSTANT account a taker with a SEPA account can take it. This should not be allowed as the maker would expect an instant transfer but the taker has only a SEPA account.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.