| Crates.io | lllv-index |
| lib.rs | lllv-index |
| version | 0.1.1 |
| created_at | 2026-01-09 15:11:23.891735+00 |
| updated_at | 2026-01-10 16:05:54.260881+00 |
| description | LLLV — Index Pack + Merkle Evidence: verifiable Top-K for vector search. |
| homepage | https://logline.foundation |
| repository | https://github.com/LogLine-Foundation/lllv-index |
| max_upload_size | |
| id | 2032232 |
| size | 48,173 |
LLLV Index empacota vetores com Merkle Evidence para buscas Top-K verificáveis. O verificador recomputa o Merkle root com domain separation:
H("leaf" || id || cid)H("node" || left || right)Irmão:
lllv-core(cápsulas assinadas).
[dependencies]
lllv-index = "0.1.0"
lllv-core = "0.1.0"
ed25519-dalek = { version = "2.1", features = ["pkcs8"] }
hex = "0.4"
use ed25519_dalek::SigningKey;
use lllv_core::{Capsule, CapsuleFlags};
use lllv_index::{IndexPackBuilder, QueryRequest};
fn f32_to_bytes(v: &[f32]) -> Vec<u8> {
v.iter().flat_map(|x| x.to_le_bytes()).collect()
}
fn main() {
// Dimensão
let dim = 3u16;
let sk = SigningKey::from_bytes(&[7u8; 32]);
// 3 vetores ortogonais
let a = Capsule::create(dim, &f32_to_bytes(&[1.0, 0.0, 0.0]), CapsuleFlags::NONE, &sk).unwrap();
let b = Capsule::create(dim, &f32_to_bytes(&[0.0, 1.0, 0.0]), CapsuleFlags::NONE, &sk).unwrap();
let c = Capsule::create(dim, &f32_to_bytes(&[0.0, 0.0, 1.0]), CapsuleFlags::NONE, &sk).unwrap();
// monta o pack
let mut builder = IndexPackBuilder::new(dim);
builder.add_capsule("a".into(), a).unwrap();
builder.add_capsule("b".into(), b).unwrap();
builder.add_capsule("c".into(), c).unwrap();
let pack = builder.build(None).unwrap();
// consulta e verifica a evidência
let ev = pack.query(&QueryRequest::from_vec(&[1.0, 0.0, 0.0]), 2).unwrap();
pack.verify(&ev).unwrap();
println!("✅ verificado: root={}", ev.index_pack_cid);
}
{
"index_pack_cid": "a3c2…",
"dim": 3,
"results": [
{
"id": "a",
"score": 1.0,
"leaf_hex": "…32bytes…",
"path": [
{ "sibling_hex": "…", "sibling_is_right": true },
{ "sibling_hex": "…", "sibling_is_right": false }
]
}
]
}
Merkle root com domain separation: "leaf" e "node".lllv-core (cápsulas assinadas).cargo-audit, cargo-deny e SBOM (CycloneDX).no_std / allocdefault = ["std", "manifest"]alloc disponível (parcial) para ambientes sem std.MIT © LogLine Foundation