Crates.io | groestlcoinconsensus |
lib.rs | groestlcoinconsensus |
version | 2.20.1-0.5.0 |
source | src |
created_at | 2020-07-05 17:22:42.993499 |
updated_at | 2022-08-12 17:01:58.563885 |
description | Groestlcoin's libgroestlcoinconsensus with Rust binding. |
homepage | https://github.com/Groestlcoin/rust-groestlcoinconsensus/ |
repository | https://github.com/Groestlcoin/rust-groestlcoinconsensus/ |
max_upload_size | |
id | 261670 |
size | 4,612,445 |
libgroestlcoinconsensus
with Rust bindingsThis project builds the libgroestlcoinconsensus
library from Groestlcoin's C++ sources using cargo and provides Rust bindings to its API.
libgroestlcoinconsensus
allows transaction verification using Groestlcoin's unique script engine.
Groestlcoin enabled applications SHOULD use the libgroestlcoinconsensus
library to avoid accepting transactions that the Groestlcoin network nodes would not accept.
This project simplifies a Rust developer's life by creating the libgroestlcoinconsensus
library with cargo.
No need to deal with the archaic C++ toolchain directly.
This also simplifies cross-compiling the consensus library e.g., for a mobile application.
libgroestlcoinconsensus
refers to code from another library secp256k1.
A snapshot of that library is also included in the Groestlcoin sources, therefore it could be baked into libgroestlcoinconsensus
.
A typical Groestlcoin enabled application will however want to access further secp256k1 functions.
The project rust-secp256k1 offers a cargo build and Rust bindings, therefore we depend on that instead of compiling the Groestlcoin embedded sources into libgroestlcoinconsensus
q.
This introduces a risk, since a difference between the two secp256k1 sources could break consensus with Groestlcoin.
We use [slightly abuse] semantic versioning. The first Major.Minor.Patch
number tracks the vendored Groestlcoin Core code (see below), the second Major.Minor.Patch
tracks this crate.
For example, if we upgrade the Groestlcoin Core code by a Patch
version we also bump our Patch
version.
One side effect of this is that crates.io
shows our release versions in yellow as if they were pre-release versions, this is due to us using a -
which, in semantic versioning, implies a pre-release version.
We use a git subtree to vendor the Groestlcoin Core code. This can be seen from the following commits that were created using git subtree add --prefix='depend/groestlcoin' https://github.com/groestlcoin/groestlcoin.git v2.19.1 --squash
.
0c8f8595b Squashed 'depend/groestlcoin/' content from commit 9b4017c7c
b96a589b0 Merge commit '0c8f8595b64fa28c5aedfa37d28ecda7e36e1dc5' as 'depend/groestlcoin'
To use a later version of Groestlcoin Core, for example, v2.20.1
git subtree pull --prefix='depend/groestlcoin' https://github.com/groestlcoin/groestlcoin.git v2.20.1 --squash
The MSRV of this crate is 1.41.1.
To assist devs in catching errors before running CI we provide some githooks. If you do not already have locally configured githooks you can use the ones in this repository by running, in the root directory of the repository:
git config --local core.hooksPath githooks/
Alternatively add symlinks in your .git/hooks
directory to any of the githooks we provide.
The API is very basic, exposing Groestlcoin's API as is. This is intentional to keep this project to a minimal footprint and add no further runtime dependencies. You will need another Rust library to serialize Groestlcoin transactions and scripts.
Verify a single spend (input) of a Groestlcoin transaction:
verify (spent_output_script: &[u8], amount: u64, spending_transaction: &[u8], input_index: usize) -> Result<(), Error>
Note that spent amount will only be checked for Segwit transactions. The above example is not segwit therefore verify will succeed with any amount.