SolidusIdentity

Seçici Açıklama Kanıtını Kendiniz Doğrulayın, Hemen Şimdi

BBS+ gerçekleştirimimiz denetlenmemiştir: bu sayfadaki en önemli olgu budur.

Bunu söyledikten sonra: doğrulayıcı kamuya açıktır, kimlik doğrulaması gerektirmez, ve onu yaklaşık bir dakikada uçtan uca çalıştırabilirsiniz. İşte tam olarak çalıştırdığımız şey.

Kendiniz yapın

$ mkdir /tmp/check && cd /tmp/check && npm init -y
$ npm i @solidus-network/[email protected]

Üç ileti imzalayın, sonra yalnızca üçüncüsünü açıklayan bir kanıt üretin:

import { BbsSecretKey, utf8 } from '@solidus-network/bbs'
const hex = (u) => Buffer.from(u).toString('hex')

const sk = await BbsSecretKey.generate()
const pk = await sk.publicKey()
const header = utf8('solidus-demo')
const msgs = ['name=Ada', 'birth_date=1815-12-10', 'country=UK'].map(utf8)
const sig = await sk.sign(header, msgs)

const proof = await sig.createProof({
  pk, header, presentationHeader: utf8('ph'), messages: msgs, disclosedIndices: [2],
})

const r = await fetch('https://identity.solidus.network/v1/bbs/verify-proof', {
  method: 'POST', headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    proofHex: hex(proof.toBytes()), pubkeyHex: hex(pk.toBytes()),
    headerHex: hex(header), phHex: hex(utf8('ph')),
    disclosedMessages: [{ index: 2, message: hex(msgs[2]) }],
    totalMessageCount: msgs.length,
  }),
})
console.log(r.status, await r.text())

2026-08-17'de her bayt konumunu yeniden çalıştırınca aldığımız sonuç:

local signature verifies                        → true
SERVER (valid proof)                            → 200 {"valid":true}
SERVER (byte 160, 200, 296 or 335 flipped)      → 200 {"valid":false}
SERVER (byte 0, 5, 10, 40, 80 or 120 flipped)   → 400 "proof could not be parsed:
                                                   invalid proof hex: invalid BBS+ proof"

Tek bir sonuç değil, iki sonuç var, ve hangisini aldığınız baytı nerede çevirdiğinize bağlı. Bir BBS+ kanıtı sıkıştırılmış eğri noktalarıyla başlıyor. Bunlardan birini bozarsanız eldeki baytlar artık bir kanıt değil, dolayısıyla doğrulanacak bir şey de yok ve yanıt 400 oluyor. Daha ileride bir skaleri bozarsanız kanıt yine ayrıştırılıyor, doğrulanıyor ve başarısız oluyor: {"valid":false}.

İkisi de geçer not değil, ve mesele tam olarak bu. Ama ikisi farklı şey söylüyor. 400, bunu kanıt olarak okuyamadık demek. {"valid":false} ise okuduk, denetledik ve yanlış çıktı demek. Ayrıştırılamayan baytlara {"valid":false} diyen bir uç nokta, hiç yapmadığı bir kriptografik denetimi yapmış gibi konuşurdu.

Hesap yok. API anahtarı yok. Başlık yok. Uç noktanın kimlik doğrulama adımı yok, ve rota bunu bir yabancıya yanıt vererek doğrudan kanıtlıyor.

Kurcalama kontrolünün neden önemli olan kısım olduğu

true döndüren bir doğrulayıcı, reddetmesi gerektiğinde reddetmedikçe değersizdir. Sonraki çalıştırmalar tek bir baytı çeviriyor ve her seferinde yukarıdaki iki biçimden biriyle ret alıyor. {"valid":false} görmek için 200. baytı, 400 görmek için 0. baytı çevirin.

Daha fazla kontrol, ki bir 400 işleyen bir denetimle karıştırılmasın:

POST /v1/bbs/verify-proof  {}                → 400  "proofHex: Required; pubkey…"   ← route RAN
POST /v1/bbs/verify-proof  {proofHex:"zz"…}  → 400  "proofHex must be valid low…"   ← validator works
POST /v1/bbs/zzz-not-a-route                 → 404  "Route POST:… not found"        ← route exists
GET  /v1/users/me/linked-accounts            → 401                                   ← auth DOES gate elsewhere

Sonuncusu insanların unuttuğudur. Onsuz, "kimlik doğrulama gerekmiyor" yalnızca "bu sunucuda hiçbir şey kimlik doğrulama gerektirmiyor" anlamına gelebilirdi. Gerektiriyor, dolayısıyla bu uç nokta bilinçli olarak kamuya açıktır.

Bunun kanıtlamadığı şey

1. Gerçekleştirimin güvenli olduğunu kanıtlamıyor. Denetlenmemiştir. Geçerli kanıtları kabul eden ve baytı çevrilmiş olanı reddeden bir doğrulayıcı, apaçık olan şeyi doğru yapıyor. Kanıtları onu kırmak için kuran bir hasma direnip direnmediği, tam olarak bir denetimin yanıtladığı sorudur, ve kimse onu sormadı.

2. Bağlantılandırılamazlığı kanıtlamıyor. İnsanların önemsediği mahremiyet özelliği (aynı kimlik bilgisinin iki sunumunun birbirine bağlanamaması) bu sınamanın çalıştırdığı şey değildir. Seçici açıklamanın mekanik olarak işlediğini gösteriyor. Bağlantılandırılamazlık iddiası denetlenmemiş kalıyor, ve özetin hâlâ neyi açığa vurduğu dürüst sınırdır.

3. Kimlik bilgisinin bir anlam taşıdığını kanıtlamıyor. Anahtarı kendimiz ürettik. Veren yok, güven kütüğü yok, güvence düzeyi yok, "country=UK" için kefil olan kimse yok. Uydurduğunuz bir anahtardan gelen doğrulanmış bir kanıt size matematiğin çalıştığını söylüyor, bir olgunun doğru olduğunu değil.

4. Bunu birinin kullandığını kanıtlamıyor.

Kendi paketimizin belgelediği tuzak, ki gömmektense yükseltmeyi tercih ederiz

Bir anahtarı girdi malzemesinden türetmek, iki gerçekleştirimimizde farklı anahtarlar veriyor. Rust kasası, anahtar üretimi belirtiminin JavaScript kütüphanesinden daha sonraki bir taslağını izliyor, dolayısıyla aynı girdi her birinde farklı gizli anahtarlar üretiyor. İmzalama, doğrulama ve kanıtlar bayt uyumlu kalıyor, yalnızca türetme ayrışıyor.

Onların tavsiyesi, paketin içinde: yeniden türetmek yerine anahtar baytlarını doğrudan iletin.

Buna işaret ediyoruz, çünkü kendi tuzaklarını belgelediler, ve kendi diller arası ayrışması hakkında sizi uyaran bir kütüphane, onu üretimde keşfetmenize izin verenden daha iyi davranıyor.

Aynı ruhta daha küçük bir not: kanıt çağrısındaki iki seçenek adı, tahmin edilmek yerine tür tanımlarından okunmak zorunda kaldı, ve ilk iki denememiz bu yüzden başarısız oldu. Bu sayfadaki kod, gerçekte çalışan koddur.

Okumaya devam edin

Seçici Açıklama Kanıtını Kendiniz Doğrulayın, Hemen Şimdi · Solidus — Solidus Identity