Walletwasabi: Ensure Linux arm64 is working properly

Created on 26 Jul 2020  路  36Comments  路  Source: zkSNACKs/WalletWasabi

Is your feature request related to a problem? Please describe.

With the rise of Linux arm devices, including the Librem5 and PinePhone, there is a need for a Bitcoin wallet that can run on arm64.

Describe the solution you'd like

Arm64 build for Linux. An additional enhancement would be to make the UI adaptive, so it can work on mobile screen sizes.

Describe alternatives you've considered

There are currently NO Bitcoin wallets that meet these criteria.

featurenhancement

Most helpful comment

@nolim1t iv been informed the next version of avalonia coming in days... works on arm out the box...

you could try this branch for an easier solution.

https://github.com/zkSNACKs/WalletWasabi/pull/3925

All 36 comments

ping @jmacato

Now you can unofficially build Wasabi to ARM/ARM64.. I personally use it most of the time (because x86 is a hot mess, with AMD PSP and Intel ME crap in it + spectre BS) but it misses the bitcoin full node and HWI functionality.

Can you explain how? I see .NET as a dependency, and the issue yahiheb linked to above says that isn't available for arm. How can I build it the way you do?

@joshbowyer

Can you explain how? I see .NET as a dependency, and the issue yahiheb linked to above says that isn't available for arm. How can I build it the way you do?

I believe you will have to do some research on your side. I would start with this:

# Clone the repo
git clone https://github.com/zkSNACKs/WalletWasabi.git
cd WalletWasabi
# Attemp to publish for linux-arm64 in `dist` folder.
dotnet publish --configuration Release --force --output "./dist" --self-contained true --runtime "linux-arm64" -fl /p:VersionPrefix=1.1.20 --disable-parallel --no-cache /p:DebugType=none /p:DebugSymbols=false /p:ErrorReport=none /p:DocumentationFile=\"\" /p:Deterministic=True;

List of Linux RIDs is here: https://docs.microsoft.com/en-us/dotnet/core/rid-catalog#linux-rids

(From https://github.com/zkSNACKs/WalletWasabi/pull/3950#issuecomment-664631923)

But given that I don't have linux-arm64 I can't test it. So as said here https://github.com/zkSNACKs/WalletWasabi/issues/2189#issuecomment-603225061, it's not officially supported and you are on your own in this.

Now you can unofficially build Wasabi to ARM/ARM64.. I personally use it most of the time (because x86 is a hot mess, with AMD PSP and Intel ME crap in it + spectre BS) but it misses the bitcoin full node and HWI functionality.

Off topic - HWI functionality is available on ARM systems. I've gotten my hardware wallets working with ARM (you can refer to this project which I'm maintaining which bundles specter desktop in a cross platform docker container .

No issues running a full node too.

Though I'd love to see arm64 support so I can use this on my pinebook

Can you explain how? I see .NET as a dependency, and the issue yahiheb linked to above says that isn't available for arm. How can I build it the way you do?

I believe you will have to do some research on your side. I would start with this:

# Clone the repo
git clone https://github.com/zkSNACKs/WalletWasabi.git
cd WalletWasabi
# Attemp to publish for linux-arm64 in `dist` folder.
dotnet publish --configuration Release --force --output "./dist" --self-contained true --runtime "linux-arm64" -fl /p:VersionPrefix=1.1.20 --disable-parallel --no-cache /p:DebugType=none /p:DebugSymbols=false /p:ErrorReport=none /p:DocumentationFile=\"\" /p:Deterministic=True;

List of Linux RIDs is here: https://docs.microsoft.com/en-us/dotnet/core/rid-catalog#linux-rids

(From #3950 (comment))

But given that I don't have linux-arm64 I can't test it. So as said here #2189 (comment), it's not officially supported and you are on your own in this.

you'd have to also change the following

--- a/WalletWasabi.Backend/WalletWasabi.Backend.csproj
+++ b/WalletWasabi.Backend/WalletWasabi.Backend.csproj
@@ -1,7 +1,7 @@
 <EF><BB><BF><Project Sdk="Microsoft.NET.Sdk.Web">

   <PropertyGroup>
-    <PlatformTarget>x64</PlatformTarget>
+    <PlatformTarget>arm64</PlatformTarget>

diff --git a/WalletWasabi.Gui/WalletWasabi.Gui.csproj b/WalletWasabi.Gui/WalletWasabi.Gui.csproj
index f616a4e88..f1150b4c5 100644
--- a/WalletWasabi.Gui/WalletWasabi.Gui.csproj
+++ b/WalletWasabi.Gui/WalletWasabi.Gui.csproj
   <PropertyGroup>
-    <PlatformTarget>x64</PlatformTarget>
+    <PlatformTarget>arm64</PlatformTarget>

It does build, however this is now the error when you try to run it (don't have much dotnet experience here). But appears that the liblibSkiaSharp library is missing. Could be my install but any hints on this would be nice

2020-09-05 17:13:19 INFO        Global (86)     .ctor finished in 13 milliseconds.
2020-09-05 17:13:19 INFO        Program (51)    Wasabi GUI started (f4da2c7f-1333-4f70-bd8b-4116a320e712).
2020-09-05 17:13:20 CRITICAL    Program (58)    System.DllNotFoundException: Unable to load shared library 'libSkiaSharp' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibSkiaSharp: cannot open shared object file: No such file or directory
   at SkiaSharp.SkiaApi.gr_glinterface_assemble_gl_interface(IntPtr ctx, IntPtr get)
   at SkiaSharp.GRGlInterface.AssembleGlInterface(Object context, GRGlGetProcDelegate get)
   at SkiaSharp.GRGlInterface.AssembleGlInterface(GRGlGetProcDelegate get)
   at Avalonia.Skia.PlatformRenderInterface..ctor(ICustomSkiaGpu customSkiaGpu)
   at Avalonia.Skia.SkiaPlatform.Initialize(SkiaOptions options)
   at Avalonia.SkiaApplicationExtensions.<>c__0`1.<UseSkia>b__0_0()
   at Avalonia.Controls.AppBuilderBase`1.Setup()
   at Avalonia.Controls.AppBuilderBase`1.SetupWithLifetime(IApplicationLifetime lifetime)
   at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime[T](T builder, String[] args, ShutdownMode shutdownMode)
   at AvalonStudio.Shell.Shell.StartShellApp[TAppBuilder](TAppBuilder builder, String appName, ShellAppMainDelegate main, String[] args, IFactory layoutFactory)
   at WalletWasabi.Gui.Program.Main(String[] args) in WalletWasabi.Gui/Program.cs:line 53
2020-09-05 17:13:20 WARNING     Program (162)   System.DllNotFoundException: Unable to load shared library 'libSkiaSharp' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibSkiaSharp: cannot open shared object file: No such file or directory
   at SkiaSharp.SkiaApi.gr_glinterface_assemble_gl_interface(IntPtr ctx, IntPtr get)
   at SkiaSharp.GRGlInterface.AssembleGlInterface(Object context, GRGlGetProcDelegate get)
   at SkiaSharp.GRGlInterface.AssembleGlInterface(GRGlGetProcDelegate get)
   at Avalonia.Skia.PlatformRenderInterface..ctor(ICustomSkiaGpu customSkiaGpu)
   at Avalonia.Skia.SkiaPlatform.Initialize(SkiaOptions options)
   at Avalonia.SkiaApplicationExtensions.<>c__0`1.<UseSkia>b__0_0()
   at Avalonia.Controls.AppBuilderBase`1.Setup()
   at Avalonia.Controls.AppBuilderBase`1.SetupWithLifetime(IApplicationLifetime lifetime)
   at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime[T](T builder, String[] args, ShutdownMode shutdownMode)
   at AvalonStudio.Shell.Shell.StartShellApp[TAppBuilder](TAppBuilder builder, String appName, ShellAppMainDelegate main, String[] args, IFactory layoutFactory)
   at WalletWasabi.Gui.Program.Main(String[] args) in WalletWasabi.Gui/Program.cs:line 53
Unhandled exception. System.DllNotFoundException: Unable to load shared library 'libSkiaSharp' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibSkiaSharp: cannot open shared object file: No such file or directory
   at SkiaSharp.SkiaApi.gr_glinterface_assemble_gl_interface(IntPtr ctx, IntPtr get)
   at SkiaSharp.GRGlInterface.AssembleGlInterface(Object context, GRGlGetProcDelegate get)
   at SkiaSharp.GRGlInterface.AssembleGlInterface(GRGlGetProcDelegate get)
   at Avalonia.Skia.PlatformRenderInterface..ctor(ICustomSkiaGpu customSkiaGpu)
   at Avalonia.Skia.SkiaPlatform.Initialize(SkiaOptions options)
   at Avalonia.SkiaApplicationExtensions.<>c__0`1.<UseSkia>b__0_0()
   at Avalonia.Controls.AppBuilderBase`1.Setup()
   at Avalonia.Controls.AppBuilderBase`1.SetupWithLifetime(IApplicationLifetime lifetime)
   at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime[T](T builder, String[] args, ShutdownMode shutdownMode)
   at AvalonStudio.Shell.Shell.StartShellApp[TAppBuilder](TAppBuilder builder, String appName, ShellAppMainDelegate main, String[] args, IFactory layoutFactory)
   at WalletWasabi.Gui.Program.Main(String[] args) in WalletWasabi.Gui/Program.cs:line 53

@nolim1t you need an arm compatible version of libSkiaSharp... @jmacato I think has one.

@nolim1t iv been informed the next version of avalonia coming in days... works on arm out the box...

you could try this branch for an easier solution.

https://github.com/zkSNACKs/WalletWasabi/pull/3925

@nopara73 I think arm is becoming way more important... we need to look into supporting ARM on OSX, and Linux, id imagine in 12 months time... Windows on ARM may start to become popular enough to warrant it also.

@nolim1t iv been informed the next version of avalonia coming in days... works on arm out the box...

you could try this branch for an easier solution.

3925

Thanks I'll try this out too

Looks like theres an issue with fonts on that branch

020-09-05 19:21:52 CRITICAL    Program (58)    System.InvalidOperationException: Default font family name can't be null or empty.                                                                                    
   at Avalonia.Media.FontManager..ctor(IFontManagerImpl platformImpl)                                      
   at Avalonia.Media.FontManager.get_Current()                                                             
   at Avalonia.Rendering.RendererBase..ctor(Boolean useManualFpsCounting)                                  
   at Avalonia.Rendering.DeferredRenderer..ctor(IRenderRoot root, IRenderLoop renderLoop, ISceneBuilder sceneBuilder, IDispatcher dispatcher, IDeferredRendererLock rendererLock)                                     
   at Avalonia.X11.X11Window.CreateRenderer(IRenderRoot root)                                              
   at Avalonia.Controls.TopLevel..ctor(ITopLevelImpl impl, IAvaloniaDependencyResolver dependencyResolver) 
   at Avalonia.Controls.WindowBase..ctor(IWindowBaseImpl impl, IAvaloniaDependencyResolver dependencyResolver)                                                                                                        
   at Avalonia.Controls.WindowBase..ctor(IWindowBaseImpl impl)                                             
   at Avalonia.Controls.Window..ctor(IWindowImpl impl)                                                     
   at Avalonia.Controls.Window..ctor()                                                                     
   at AvalonStudio.Shell.Controls.MetroWindow..ctor()                                                      
   at WalletWasabi.Gui.MainWindow..ctor()                                                                  
   at WalletWasabi.Gui.App.OnFrameworkInitializationCompleted()                                            
   at Avalonia.Controls.AppBuilderBase`1.Setup()                                                           
   at Avalonia.Controls.AppBuilderBase`1.SetupWithLifetime(IApplicationLifetime lifetime)                  
   at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime[T](T builder, String[] args, ShutdownMode shutdownMode)
   at AvalonStudio.Shell.Shell.StartShellApp[TAppBuilder](TAppBuilder builder, String appName, ShellAppMainDelegate main, String[] args, IFactory layoutFactor

I think with Apple recently announcing their complete migration to arm64, and the new boom in Linux for arm64, that arm64 should be strongly considered now. Will Wasabi 2.0 be based on the same foundation (.Net, etc) or will it be entirely different?

ACK, I added this to the WW2 board, but I have no idea what's needed here and what it entails. @danwalmsley, would @jmacato have time to deal with this for WW2 as he's already done something before it may be the most reasonable to task him.

Talked with @danwalmsley and @jmacato :

  • Linux should be easy and is necessary.
  • Mac should be hard, thus why @danwalmsley is tasked with this, but it's necessary.
  • Windows isn't necessary for now.

@nolim1t, according to @jmacato Linux ARM64 is already working with the new Fluent project. May I ask you to confirm it? (Must dotnet run from WalletWasabi.Fluent.Desktop directory.

From master branch ?

Yes.

@nolim1t sorry I made a mistake, it's not the WalletWasabi.Fluent, but WalletWasabi.Fluent.Desktop directory.

Current status of ARM64 support:

  • [x] Wasabi: should be working on both Linux and OSX.
  • [ ] Avalonia: should be working on Linux, but not on OSX. @danwalmsley is on it.
  • [ ] Tor: Doesn't work neither on Linux, nor OSX. May I ask @molnard from you to make a PR with adding an ARM64 Tor binary and @jmacato will be able to test it.
  • [ ] HWI: Doesn't work neither on Linux, nor OSX. I'll ask @achow101 if he'll be up for a project work on this. Tracking issue: https://github.com/bitcoin-core/HWI/issues/345
  • [ ] Bitcoin Knots: should not work with current shipped binaries, but it has an ARM version: https://bitcoinknots.org/ @molnard may I ask you to add make a PR with that, similar to the Tor binaries?

I might be missing something but there is no .NET SDK 5.0 for arm64 in the Microsoft repo, only x86_64, so how did you get it running on arm64?

I didn't. @jmacato did. @jmacato ?

i havent run .net5.0 for arm64 just yet. Only on .net 3.1

Here is the compatibility list of .NET 5. For now, ARM M1 macOS is not supported, yet.

Plan:
Support .NET 6.0 with both Rosetta 2 and native architecture (M1).

So according to this, next November.

Here is the roadmap: https://github.com/dotnet/runtime/issues/43313

https://github.com/dotnet/core/blob/master/release-notes/5.0/5.0-supported-os.md

Seems we should be able to run on Rosetta + M1 within a few weeks.

With native support... possible before .net 6... but depending on what msft decide... they seem not to have made any final descisions yet.

Still getting issues about the fonts on linux

Unhandled exception. System.InvalidOperationException: Default font family name can't be null or empty.
   at Avalonia.Media.FontManager..ctor(IFontManagerImpl platformImpl)
   at Avalonia.Media.FontManager.get_Current()

built and running from /WalletWasabi/WalletWasabi.Fluent.Desktop

is there any environment variables I need to set?

I missed the part that old software will work just fine on OSX. In this case I wouldn't even bother adding a new OSX download section to the website, let alone with the development unless there's a very good reason to do so. We'll get a testing OSX ARM64 machine though just to be sure. So we only need to prepare a Linux ARM release for now.

Current status of LINUX ARM64 support:

Hi @nolim1t ! I just tested it with my PBP and all seems to be working. Just wondering if you can push your full system details (via screenfetch) so I can know what's going on?

I'm using a PBP to build it too. Manjaro Linux.

Happy to do a neofetch if you need

neofetch is good, please post it here

Similar issue in avalonia repo: https://github.com/AvaloniaUI/Avalonia/issues/4427

neofetch

鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   nolim1t@nlpbp 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   --------------- 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   OS: Manjaro ARM Linux aarch64 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   Host: Pine64 Pinebook Pro 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅            鈻堚枅鈻堚枅鈻堚枅鈻堚枅   Kernel: 5.9.11-2-MANJARO-ARM 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   Uptime: 12 mins 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   Packages: 807 (pacman) 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   Shell: bash 5.0.18 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   Resolution: 1920x1080 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   DE: Plasma 5.20.3 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   WM: KWin 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   WM Theme: plastik 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   Theme: Breeze Dark [Plasma], Breeze [GTK2], Br 
鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅  鈻堚枅鈻堚枅鈻堚枅鈻堚枅   Icons: breeze-dark [Plasma], breeze-dark [GTK2 
                               Terminal: konsole 
                               Terminal Font: Hack 13 
                               CPU: (6) @ 1.416GHz 
                               Memory: 2149MiB / 3795MiB 




@nolim1t can you try installing ttf-ms-fonts package from pacman/paman and then run fc-cache --force

cool that worked.

Should mention this in the docs for the next release too

@nolim1t yeah i think we should... but srlsy.. arch distros are weird lol

Was this page helpful?
0 / 5 - 0 ratings

Related issues

yahiheb picture yahiheb  路  3Comments

nopara73 picture nopara73  路  3Comments

yahiheb picture yahiheb  路  3Comments

yahiheb picture yahiheb  路  3Comments

MaxHillebrand picture MaxHillebrand  路  3Comments