https://github.com/jcnelson/z32check
z-base-32 encoding with 4-byte checksum
https://github.com/jcnelson/z32check
Last synced: 10 months ago
JSON representation
z-base-32 encoding with 4-byte checksum
- Host: GitHub
- URL: https://github.com/jcnelson/z32check
- Owner: jcnelson
- License: mit
- Created: 2018-06-25T21:20:38.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2018-06-29T03:52:05.000Z (about 8 years ago)
- Last Synced: 2025-01-15T14:41:31.814Z (over 1 year ago)
- Language: JavaScript
- Size: 13.7 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# z32check
[z-base-32](https://en.wikipedia.org/wiki/Base32#z-base-32) encoding library
with 4-byte checksum.
This library is meant for generating and decoding Stacks addresses on the
Blockstack blockchain.
## How it works
Each z32check string encodes a 1-byte version and a 4-byte checksum. When
decoded as a hex string, the wire format looks like this:
```
0 1 n+1 n+5
|------|-----------------------------|---------------|
version n-byte hex payload 4-byte hash
```
If `version` is the version byte (a 1-byte `number`) and `payload` is the raw
bytes (e.g. as a `string`), then the `checksum` is calculated as follows:
```
checksum = sha256(sha256(version + payload)).substring(0,4)
```
In other words, the checksum is the first four bytes of the
double-sha256 of the bytestring concatenation of the `version` and `payload`.
This is similar to base58check encoding, for example.
## z32 Addresses
Specific to Blockstack, the Stacks blockchain uses z32-encoded public key
hashes as addresses. Specifically, a **z32 address** is a z32-encoded
ripemd160 hash, where the first character is capitalized (note that the
z-base-32 alphabet does _not_ have capital letters).
# Examples
```
> z32 = require('z32check')
{ z32encode: [Function: z32encode],
z32decode: [Function: z32decode],
z32checkEncode: [Function: z32checkEncode],
z32checkDecode: [Function: z32checkDecode],
z32address: [Function: z32address],
z32addressDecode: [Function: z32addressDecode],
versions:
{ mainnet: { p2pkh: 22, p2sh: 11 },
testnet: { p2pkh: 17, p2sh: 2 } } }
```
## z32encode, z32decode
```
> z32check.z32encode(Buffer.from('hello world').toString('hex'))
'decisga53yq7zzr5dr'
> z32check.z32decode('decisga53yq7zzr5dr')
'68656c6c6f20776f726c64'
> Buffer.from('68656c6c6f20776f726c64', 'hex').toString()
'hello world'
```
## z32checkEncode, z32checkDecode
```
> version = 12
12
> z32check.z32checkEncode(version, Buffer.from('hello world').toString('hex'))
'cpb1sa5dxrb5s6huccoawk3ce'
> z32check.z32checkDecode('cpb1sa5dxrb5s6huccoawk3ce')
[ 12, '68656c6c6f20776f726c64' ]
> Buffer.from('68656c6c6f20776f726c64', 'hex').toString()
'hello world'
```
# z32address, z32addressDecode
**NOTE**: these methods only work on ripemd160 hashes
```
> hash160 = 'a46ff88886c2ef9762d970b4d2c63678835bd39d'
'a46ff88886c2ef9762d970b4d2c63678835bd39d'
> version = z32check.versions.mainnet.p2pkh
22
> z32check.z32address(version, hash160)
'Sn1g96reo5bq9f5n5famjwsgg3hegs6uuia5jq18'
> z32check.z32addressDecode('Sn1g96reo5bq9f5n5famjwsgg3hegs6uuia5jq18')
[ 22, 'a46ff88886c2ef9762d970b4d2c63678835bd39d' ]
```