This library provides all tools required to write a client, node or even your
own protocol implementation for the [`p2panda`] network. It is shipped both as
a Rust crate [`p2panda-rs`] with WebAssembly bindings and a NPM package
[`p2panda-js`] with TypeScript definitions running in NodeJS or any modern web
browser.
> The core p2panda [`specification`] is fully functional but still under review
> so please be prepared for breaking API changes until we reach `v1.0`.
> Currently no p2panda implementation has recieved a security audit.
[`p2panda-js`]: https://github.com/p2panda/p2panda/tree/main/p2panda-js
[`p2panda-rs`]: https://github.com/p2panda/p2panda/tree/main/p2panda-rs
[`p2panda`]: https://p2panda.org
[`specification`]: https://p2panda.org/specification
## Installation
```bash
cargo add p2panda-rs
```
## Example
```rust
use p2panda_rs::entry::encode::encode_entry;
use p2panda_rs::entry::EntryBuilder;
use p2panda_rs::identity::KeyPair;
use p2panda_rs::operation::encode::encode_operation;
use p2panda_rs::operation::OperationBuilder;
// Id of the schema which describes the data we want to publish. This should
// already be known to the node we are publishing to.
pub const SCHEMA_ID: &str =
"profile_0020c65567ae37efea293e34a9c7d13f8f2bf23dbdc3b5c7b9ab46293111c48fc78b";
// Generate new Ed25519 key pair.
let key_pair = KeyPair::new();
// Add field data to "create" operation.
let operation = OperationBuilder::new(&SCHEMA_ID.parse()?)
.fields(&[("username", "panda".into())])
.build()?;
// Encode operation into bytes.
let encoded_operation = encode_operation(&operation)?;
// Create Bamboo entry (append-only log data type) with operation as payload.
let entry = EntryBuilder::new().sign(&encoded_operation, &key_pair)?;
// Encode entry into bytes.
let encoded_entry = encode_entry(&entry)?;
println!("{} {}", encoded_entry, encoded_operation);
```
Run this code from the `examples` folder:
```bash
cargo run --example=create_operation
```
## Development
You will need the following tools to start development:
- [Rust](https://www.rust-lang.org/learn/get-started)
- [wasm-pack](https://rustwasm.github.io/wasm-pack/installer/)
```bash
# Run tests
cargo test
# Run WebAssembly tests
wasm-pack test --headless --firefox
```
## License
GNU Affero General Public License v3.0 [`AGPL-3.0-or-later`](LICENSE)
## Supported by
*This project has received funding from the European Union’s Horizon 2020
research and innovation programme within the framework of the NGI-POINTER
Project funded under grant agreement No 871528 and NGI-ASSURE No 957073*