2723ef6f5d
I though I had solved our logging problem: We want projects to pick up logging config in core, without it being published. The previous attempt was filtering out XML files from unmanagedResources. That caused the XML files to not get published, and when running tests through Bloop everything worked fine. However, when running them through sbt the config did not get picked up. I suspect this is because of a bug in how Bloop exports sbt builds. In this attempt we instead move the XML files to test resources in core, and then make the test projects depend on test sources in core, with the awkward syntax 'core % "test->test"'. |
||
---|---|---|
bench | ||
bitcoind-rpc | ||
bitcoind-rpc-test/src/test | ||
chain | ||
chain-test/src/test | ||
core | ||
core-test | ||
db-commons | ||
docs | ||
eclair-rpc | ||
eclair-rpc-test/src/test/scala/org/bitcoins/eclair | ||
node | ||
node-test/src/test/scala/org/bitcoins/node | ||
project | ||
secp256k1@2e16ac7d6c | ||
secp256k1jni | ||
testkit | ||
wallet | ||
wallet-test/src/test/scala/org/bitcoins/wallet | ||
website | ||
zmq | ||
.dockerignore | ||
.gitignore | ||
.gitmodules | ||
.jvmopts | ||
.scalafmt.conf | ||
build.sbt | ||
CONTRIBUTING.md | ||
docker-compose.yml | ||
Dockerfile | ||
inThisBuild.sbt | ||
LICENSE | ||
README.md | ||
try-bitcoin-s.sh |
Bitcoin-S
Design Principles
- Immutable data structures everywhere
- Algebraic Data Types to allow the compiler to check for exhaustiveness on match statements
- Using property based testing to test robustness of code
- Minimize dependencies to reduce attack surface
Projects
-
core
- this is where protocol data structures live, like Transactions, Blocks, or PrivateKeys. For more info readcore/README.md
-
core-test
- this is where all test cases for thecore
project live -
bitcoind-rpc
- this is a RPC client implementation forbitcoind
. For more info readbitcoind-rpc/README.md
-
bitcoind-rpc-test
- this is where all test cases for thebitcoind-rpc
project live -
eclair-rpc
- this is a RPC client implementation for Eclair, which is a Lightning Network implementation. For more information please readeclair-rpc/README.md
-
eclair-rpc-test
- this is where all test cases for theeclair-rpc
project live -
bench
- benchmarks for Bitcoin-S. For more information please readbench/README.md
-
testkit
- This is a useful testkit for testing Bitcoin related applications. You can spin up Bitcoin and Lightning nodes arbitrarily and set them in specific states. For more information please readtestkit/README.md
-
zmq
-bitcoind
has a setting that publishes information about the state of the network over ZMQ. This project implements a subscriber that allows you to read and parse that information. For more information seezmq/README.md
as well as the official Bitcoin Core ZMQ documentation -
secp256k1jni
- JNI (Java Native Interface) for secp256k1, a optimized C library for EC operations on curve secp256k1. It has support for a wide range of cryptographic operations used in the Bitcoin protocol. Fore more information please readsecp256k1jni/README.md
REPL
In any given sub project, it's possible to open a REPL session. This session has both main and test sources from Bitcoin-S available, as well as all dependencies for the given sub project. To do this:
// core project
$ sbt coreTest/test:run // we do coreTest instead of core to have all test sources available
// this works as well
$ sbt
> project coreTest
> amm
...
Loading...
Compiling (synthetic)/ammonite/predef/interpBridge.sc
Compiling (synthetic)/ammonite/predef/replBridge.sc
Compiling (synthetic)/ammonite/predef/DefaultPredef.sc
Welcome to the Ammonite Repl 1.6.2
(Scala 2.12.7 Java 1.8.0_191)
If you like Ammonite, please support our development at www.patreon.com/lihaoyi
@ import org.bitcoins.core.protocol.ln.currency.MilliSatoshis
import org.bitcoins.core.protocol.ln.currency.MilliSatoshis
@ MilliSatoshis(100)
res1: MilliSatoshis = MilliSatoshisImpl(100)
// Bitcoind RPC project
$ sbt bitcoindRpcTest/test:run
// this works as well
$ sbt
> project bitcoindRpcTest
> amm
// Similarly for other projects
Artifacts
You need to add the Bitcoin-S Bintray to your resolvers to be able to access published artifacts.
sbt
With sbt, this can be done like this:
resolvers += Resolver.bintrayRepo("bitcoin-s", "bitcoin-s-core"),
Now you should be able to add Bitcoin-S artifacts like this:
"org.bitcoins" % "bitcoin-s-secp256k1jni" % "0.0.4"
"org.bitcoins" %% "bitcoin-s-core" % "0.0.4" withSources() withJavadoc()
"org.bitcoins" %% "bitcoin-s-bitcoind-rpc" % "0.0.4" withSources() withJavadoc()
"org.bitcoins" %% "bitcoin-s-eclair-rpc" % "0.0.4" withSources() withJavadoc()
"org.bitcoins" %% "bitcoin-s-testkit" % "0.0.4" withSources() withJavadoc()
"org.bitcoins" %% "bitcoin-s-zmq" % "0.0.4" withSources() withJavadoc()
Ammonite
Ammonite is (among other things) a modernized Scala REPL with syntax highlighting, multi-line editing, the ability to load artifacts directly in the REPL, and many other quality-of-life improvements missing in the default Scala REPL.
Ammonite is a project by Li Haoyi, and you can get it at ammonite.io
With Ammonite, this can be done like this:
@ import coursier.MavenRepository
import coursier.MavenRepository
@ interp.repositories() ++= Seq(MavenRepository("https://dl.bintray.com/bitcoin-s/bitcoin-s-core"))
@ import $ivy.`org.bitcoins::bitcoin-s-core:0.0.4`
import $ivy.$
@ import org.bitcoins.core.currency.Bitcoins
import org.bitcoins.core.currency.Bitcoins
@ Bitcoins(10)
res0: Bitcoins = BitcoinsImpl(10) // 🎉
This is only necessary one time, Ammonite remembers your resolvers across sessions.
Published artifacts
Versioned artifacts are available online.
Snapshots (not necessarily stable, use for local development) are available at JFrog.
Tagged versions are available at Bintray.