ElementsProject / libwally-core

Useful primitives for wallets
Other
284 stars 136 forks source link

libwally-core

Wally is a cross-platform, cross-language collection of useful primitives for cryptocurrency wallets.

Read the API documentation at https://wally.readthedocs.io.

Please see the CHANGES for change details (including ABI changes) when upgrading.

Please report bugs and submit patches to Our github repository. If you wish to report a security issue, please read Our security reporting guidelines.

Documentation Status

Platforms

Wally can currently be built for:

And can be used from:

Building

# Initialise the libsecp sources (Needs to be run only once)
$ git submodule init
$ git submodule sync --recursive
$ git submodule update --init --recursive

# Build
$ ./tools/autogen.sh
$ ./configure <options - see below>
$ make
$ make check

Building on macOS

Using homebrew,

$ brew install gnu-sed

If you wish to enable the SWIG interface, you will need install the Java JDK 8 or newer, and install SWIG:

$ brew install swig

configure options

Recommended development configure options

$ ./configure --enable-debug --enable-export-all --enable-swig-python --enable-swig-java --enable-coverage

Compiler options

Set CC=clang to use clang for building instead of gcc, when both are installed.

Python

For non-development use, you can install wally from PyPI with pip as follows:

pip install wallycore==1.3.1

For development, you can build and install wally using:

$ pip install .

If you wish to explicitly choose the python version to use, set the PYTHON_VERSION environment variable (to e.g. 3.9, 3.10 etc) before running pip or (when compiling manually) ./configure.

You can also install the binary wally releases using the released wheel files, for example if you don't wish to install from PyPI over the network:

pip install wallycore-<version_and_architecture>.whl

Each wally release includes a signed requirements.txt file. It is strongly suggested that you verify and use this file when installing, with:

pip install --require-hashes -r requirements.txt

Doing so ensures that the wheel you install is the version you expect and an official build. This will detect, for example, if PyPI is hacked and a malicious wallycore package uploaded.

Android

Android builds are currently supported for all Android binary targets using the Android NDK. The script tools/android_helpers.sh can be sourced from the shell or scripts to make it easier to produce builds:

$ export ANDROID_NDK=/opt/android-ndk-r26b # r22 is the minimum supported version
$ . ./tools/android_helpers.sh

$ android_get_arch_list
armeabi-v7a arm64-v8a x86 x86_64

# Prepare to build
$ ./tools/cleanup.sh
$ ./tools/autogen.sh

# See the comments in tools/android_helpers.sh for arguments
$ android_build_wally armeabi-v7a $ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64 19 "--enable-swig-java"

The script tools/build_android_libraries.sh builds the Android release files and can be used as an example for your own Android projects.

WebAssembly

WebAssembly is available as a preview feature. Users may want to avoid using wally compiled for wasm for signing or encryption/decryption as the transpiled code may not remain constant time.

Building wally as wasm requires following emsdk instructions for your platform and sourcing the emsdk_env.sh file:

# Set up the environment variables for the toolchain
$ source $HOME/emsdk/emsdk_env.sh

# Optionally set the list of wally functions to export to wasm (default: all)
$ export EXPORTED_FUNCTIONS="['_malloc','_free','_wally_init','_wally_cleanup',...]"

# Build
$ ./tools/build_wasm.sh [--disable-elements]

Note that emsdk v3.1.27 or later is required.

The script tools/build_wasm.sh builds the wallycore.html example as well as the required wallycore.js and wallycore.wasm files, which can be used as an example for your own WebAssembly projects.

Open wallycore.html in a browser via a webserver like nginx or python2 -m SimpleHTTPServer 8000 to run the example.

Cleaning

$ ./tools/cleanup.sh

Submitting patches

Please use pull requests on github to submit. Before producing your patch you should format your changes using uncrustify version 0.60 or later. The script ./tools/uncrustify will reformat all C sources in the library as needed, with the currently chosen uncrustify options.

To reformat a single source file, use e.g.:

$ ./tools/uncrustify src/transaction.c

Or to reformat all source files, pass no arguments:

$ ./tools/uncrustify

If you have added new API functions in your patch, run tools/update_generated.sh to update the auto-generated support code for various platforms. This requires Python and the jq binary.

You should also make sure the existing tests pass and if possible write tests covering any new functionality, following the existing style. You can run the tests via:

$ make check

Python ctypes tests (in ./src/test/) are strongly preferred, but you can add to the other test suites if your changes target a specific language or your tests need to be written at a higher level of abstraction.

Generating a coverage report

To generate an HTML coverage report, install lcov and use:

$ ./tools/cleanup.sh
$ ./tools/autogen.sh
$ ./configure --enable-debug --enable-export-all --enable-swig-python --enable-swig-java --enable-coverage
$ make
$ ./tools/coverage.sh clean
$ make check
$ ./tools/coverage.sh

For coverage with clang, you need to install llvm-cov, typically via the llvm-<version> package that corresponds to your clang version. Once installed, set the GCOV environment variable to the versioned llvm-cov binary name before running ./tools/coverage.sh, e.g:

$ GCOV=llvm-cov-11 ./tools/coverage.sh clean
$ make check
$ GCOV=llvm-cov-11 ./tools/coverage.sh

The coverage report can be viewed at ./src/lcov/src/index.html. Patches to increase the test coverage are welcome.

Users of libwally-core

Projects and products that are known to depend on or use libwally:

Please note that some of the listed projects may be experimental or superseded.