picofeed v8.0.5
_
_ . _ _|__ _ _|
|_)|(_(_)|(/_(/_(_| v8
|Space Efficient Chain of Blocks
- Flat memory layout / zero copy access
- Single dependency EdDSA
- Fast & compact
Curve25519+Ed25519signatures - Pure ES6 (+JSDoc Type annotations)
- ~450LOC / +41.3kB bundle size
- Test Coverage 💯
- Uint8Arrays (no node:buffer or bn.js)
Intro
( For those who are new to linked blocks )
Imagine git as a jar, then using pliers pull out a branch. That single detached branch is synonymous with one picofeed - a memorybuffer containing cryptographically signed blocks:
This package provides 2 primitves Feed
|------|------------------|----------------------|
| PiC0 | Block 0: "hello" | Block 1: "picoverse" |
|------|------------------|----------------------|and
Block
| SIG: 64B |
| SIZE: varint |
| DATA: buffer[SIZE] |minimal overhead, quite simple.
This library provides a high level API to append, slice and merge
such feeds - block contents is upto application.
We target user devices, picofeed is the basic building block for the frontend-block-engine picostack
Install
yarn add picofeed
# or
npm install picofeedUsage
import { Feed, toHex } from 'picofeed'
const { pk: publicKey, sk: secret } = Feed.signPair()
const feed = new Feed()
feed.append('Hello', secret) // => height 1
feed.blocks[0].body // => 'Hello'
feed.blocks[0].blockSize // => 71 bytes
const verifiableData = feed.buffer
// -- Share buffer anyhow --
const remoteFeed = Feed.from(verifiableData) // Verifies signatures
remoteFeed.blocks[0].body // => 'Hello'
toHex(remoteFeed.blocks[0].key) === alice.pk // trueChangelog
8.0.0
Reworked binary format, less overhead
- removed
fmtbyte - added Headers instead
5.0.1
phat-bit replaced withvarint- changed
secp256k1in favour ofEd25519 - fixed
merge()bug - removed
u8nutil
4.x
signPair()returnshexstringkeyssk.slice(32)no longer works, usegetPublicKey(sk)block.parentSigrenamed toblock.psigblock.isGenesisrenamed toblock.genesisfeed.get(n)renamed tofeed.block(n)feed.blocks()removed in favour offeed.blocksfeed.pickle()removed until further notice.feed.fromBlocksArray()incorporated intofeedFrom()/Feed.from()- Not backwards compatible with 3.x feeds
3.4.0
- updated
README.md - added Feed.fromBlocksArray(Block[]) to perform bulk-merge, 24x perf increase compared to Feed.merge(block)
- removed Feed subclassing/metaprogramming support, it was fun but footgun (don't solve problems by subclassing Feed).
3.3.0
- added Feed.first
- added Feed.get(-3) as equivalent of f.get(f.length - 3)
- added Block.isGenesis getter
- added static Feed.KEY_SIZE constant
- replaced hardcoded key-size lenghts with KEY_SIZE constant
3.2.2
- optimization feed._steal() also steals cache
3.2.1
- fixed bug feed._steal(other) causing cache corruption
- changed return value of feed.inspect() is now conditional
- fixed bug where A < B; A.merge(B, withCallback) did not merge
- fixed bug where keychain cache contained boatloads of duplicate keys
3.1.0
- added
feed.merge(block)support
3.0.0
- removed automatic encodings
- changed
feed.get(n)returns instance of BlockMapper. - changed
feed.slice(start, end) - added block cache to avoid redundant signature-verifications
- added BlockMapper now also contains public-key
- sodium-universal upgraded to 3.0.0
2.2.0
- Added feed.merge(other, opts, indexingCallback) that allows validation + abort merge interactively
- Added feed.last which returns the block-contents using provided encoding.
2.0.0
- Added feed slices and merge
License
2020-2023 🄯 Tony Ivanov
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago