From ca1cf2b77a7493d2c7e3daec416e113691e5683c Mon Sep 17 00:00:00 2001 From: Paul Duncan Date: Mon, 9 Mar 2026 03:11:34 -0400 Subject: add content/posts/2026-03-08-pbech32-v0.1.0.md --- content/posts/2026-03-08-pbech32-v0.1.0.md | 126 +++++++++++++++++++++++++++++ content/projects/pbech32.md | 7 ++ 2 files changed, 133 insertions(+) create mode 100644 content/posts/2026-03-08-pbech32-v0.1.0.md create mode 100644 content/projects/pbech32.md (limited to 'content') diff --git a/content/posts/2026-03-08-pbech32-v0.1.0.md b/content/posts/2026-03-08-pbech32-v0.1.0.md new file mode 100644 index 0000000..7712d2f --- /dev/null +++ b/content/posts/2026-03-08-pbech32-v0.1.0.md @@ -0,0 +1,126 @@ +--- +slug: pbech32-v0.1.0 +title: "pbech32 v0.1.0" +date: "2026-03-08T02:50:28-04:00" +--- +I just released the first version of [pbech32][], a [Rust][] library for +encoding and decoding [Bech32][] strings. + +[Bech32][] is a fast and user-friendly [base 32][] encoding format +that includes a [namespace][] and [checksum][]. + +### Links + +- [pbech32 Git repository][git repository] +- [pbech32 package on crates.io][crates-io-pbech32] +- [pbech32 API Documentation on docs.rs][docs-rs-pbech32] + +### Library Features + +- [Bech32 (BIP173)][bip173] and [Bech32m (BIP350)][bip350] support. +- Idiomatic encoding and decoding via the [`Display`][display] and + [`FromStr`][fromstr] traits. +- Decode arbitrarily long strings. +- Streamed, allocation-free encoding to any [writer][]. +- No external dependencies. + +### Examples + +Decode from string: + +```rust +use pbech32::Bech32; + +let s = "a1qypqxpq9mqr2hj"; // bech32m-encoded string +let got: Bech32 = s.parse()?; // decode string + +assert_eq!(got.hrp.to_string(), "a"); // check human-readable part +assert_eq!(got.data, vec![1, 2, 3, 4, 5]); // check data +``` + +Encode to string: + +```rust +use pbech32::{Bech32, Hrp, Scheme}; + +let scheme = Scheme::Bech32m; // checksum scheme +let hrp: Hrp = "a".parse()?; // human-readable part +let data = vec![1, 2, 3, 4, 5]; // data +let got = Bech32 { scheme, hrp, data }.to_string(); // encode as string + +assert_eq!(got, "a1qypqxpq9mqr2hj"); // check result +``` + +Encode to a [writer][]: + +```rust +use std::io::Write; +use pbech32::{Encoder, Hrp, Scheme}; + +let mut vec: Vec = Vec::new(); // output vector +let hrp: Hrp = "hello".parse()?; // human readable part + +let mut encoder = Encoder::new(&mut vec, Scheme::Bech32m, hrp)?; // create encoder +encoder.write_all(b"folks")?; // write data +encoder.flush()?; // flush encoder (REQUIRED) + +let got = str::from_utf8(vec.as_ref())?; // convert output vector to string +assert_eq!(got, "hello1vehkc6mn27xpct"); // check result +``` + +[bech32]: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki + "Bech32 (BIP173)" +[bech32m]: https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki + "Bech32m (BIP350)" +[bip173]: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki + "BIP173 (Bech32)" +[bip350]: https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki + "BIP350 (Bech32m)" +[ascii]: https://en.wikipedia.org/wiki/ASCII + "ASCII (Wikipedia)" +[base 32]: https://en.wikipedia.org/wiki/Base32 + "Base 32 (Wikipedia)" +[checksum]: https://en.wikipedia.org/wiki/Checksum + "Checksum (Wikipedia)" +[namespace]: https://en.wikipedia.org/wiki/Namespace + "Namespace (Wikipedia)" +[bch code]: https://en.wikipedia.org/wiki/BCH_code + "BCH code (Wikipedia)" +[alphabet]: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32 + "BIP173: Specification: Bech32" +[writer]: https://doc.rust-lang.org/std/io/trait.Write.html + "writer" +[age encryption]: https://age-encryption.org/ + "age encryption" +[html]: https://en.wikipedia.org/wiki/HTML + "HyperText Markup Language" +[rust]: https://rust-lang.org/ + "Rust programming language." +[git repository]: https://github.com/pablotron/pbech32 + "pbech32 git repository" +[pbech32]: https://github.com/pablotron/pbech32 + "pbech32 Rust library" +[cargo]: https://doc.rust-lang.org/cargo/ + "Rust package manager" +[podman]: https://podman.io/ + "Podman container management tool" +[docker]: https://docker.com/ + "Docker container management tool" +[api]: https://en.wikipedia.org/wiki/API + "Application Programming Interface (API)" +[linter]: https://en.wikipedia.org/wiki/Lint_(software) + "Static code analysis tool to catch common mistakes" +[crates.io]: https://crates.io/ + "Rust package registry" +[docs-rs-pbech32]: https://docs.rs/pbech32 + "pbech32 API documentation on docs.rs" +[crates-io-pbech32]: https://crates.io/crates/pbech32 + "pbech32 on crates.io" +[examples]: examples/ + "pbech32 examples/ directory" +[cargo-tarpaulin]: https://crates.io/crates/cargo-tarpaulin + "Tarpaulin code coverage reporting tool." +[display]: https://doc.rust-lang.org/std/fmt/trait.Display.html + "std::fmt::Display trait" +[fromstr]: https://doc.rust-lang.org/std/str/trait.FromStr.html + "std::str::FromStr trait" diff --git a/content/projects/pbech32.md b/content/projects/pbech32.md new file mode 100644 index 0000000..a6590a2 --- /dev/null +++ b/content/projects/pbech32.md @@ -0,0 +1,7 @@ +--- +title: "pbech32" +slug: "pbech32" +active: true +repo: "https://github.com/pablotron/pbech32" +text: "Bech32 encoding and decoding library." +--- -- cgit v1.2.3