This is a library that uses the bitcoin-core
optimized secp256k1 elliptic
curve signatures library for nostr
schnorr signatures.
If you need to build it without libsecp256k1
C library, you must disable cgo:
export CGO_ENABLED='0'
This enables the fallback btcec
pure Go library to be used in its place. This
CGO setting is not default for Go, so it must be set in order to disable this.
The standard libsecp256k1-0
and libsecp256k1-dev
available through the
ubuntu dpkg repositories do not include support for the BIP-340 schnorr
signatures or the ECDH X-only shared secret generation algorithm, so you must
follow the following instructions to get the benefits of using this library. It
is 4x faster at signing and generating shared secrets so it is a must if your
intention is to use it for high throughput systems like a network transport.
The easy way to install it, if you have ubuntu/debian, is the script ../ubuntu_install_libsecp256k1.sh, it handles the dependencies and runs the build all in one step for you. Note that it
For ubuntu, you need these:
sudo apt -y install build-essential autoconf libtool
For other linux distributions, the process is the same but the dependencies are likely different. The main thing is it requires make, gcc/++, autoconf and libtool to run. The most important thing to point out is that you must enable the schnorr signatures feature, and ECDH.
The directory p256k/secp256k1
needs to be initialized, built and installed,
like so:
cd secp256k1
git submodule init
git submodule update
Then to build, you can refer to the instructions or just use the default autotools:
./autogen.sh
./configure --enable-module-schnorrsig --enable-module-ecdh --prefix=/usr
make
sudo make install
On WSL2 you may have to attend to various things to make this work, setting up
your basic locale (uncomment one or more in /etc/locale.gen
, and run
locale-gen
), installing the basic build tools (build-essential or base-devel)
and of course git, curl, wget, libtool and
autoconf.
TODO: Currently the use of the libsecp256k1 library for ECDH, used in nip-04 and
nip-44 encryption is not enabled, because the default version uses the Y
coordinate and this is incorrect for nostr. It will be enabled soon... for now
it is done with the btcec
fallback version. This is slower, however previous
tests have shown that this ECDH library is fast enough to enable 8mb/s
throughput per CPU thread when used to generate a distinct secret for TCP
packets. The C library will likely raise this to 20mb/s or more.