Rand Protocol
لاسوندونه
د بېلګې پروګرامونه

یوه محرمه کریډټ پرېکړه

یو محرم پروګرام چې پر خصوصي غوښتونکي معلوماتو باندې یو خپور شوی د نمرو ورکولو ماډل چلوي او یوازې تصویب یا رد خپروي، د SHA-256 ژمنې سره چې معلومات له یوه تصدیقوونکي سره تړي - انټرفیس، د ثابت ټکي حساب، د Rust مېلمه، د کوربه سکرېپټ، او پروګرام په chain 18 کې ژوندی.

پور ورکوونکی خپل د امتیاز ورکولو ماډل خپروي. غوښتونکی دا ماډل د خپلو معلوماتو پر سر چلوي او پور ورکوونکي ته یو رسید ورکوي چې وايي “منظور” یا “رد”. پور ورکوونکی هېڅکله معلومات نه ویني، او غوښتونکی نه ماډل بدلولی شي او نه یې جعلي معلومات ورکولی شي.

دا د یوې محاسبې د ثابتولو تر ټولو کوچنۍ ګټوره بېلګه ده چې عامه پروګرام او عامه پارامترونه پر خصوصي ننوتو چلوي. ماډل دوه‌پوړیزه عصبي شبکه ده چې په بشپړو عددونو حساب کوي. همدا جوړښت هر هغه قاعدې ته برابر دی چې تنظیم کوونکی یا مقابل لوری یې لوستل غواړي: د بیې ټاکلو فورمول، د وړتیا ازموینه، یا د خطر حد.

بېلګه پروګرامونه هغه چمتووالی لري چې څلور واړه بېلګه پاڼې یې شریکوي.

1. څه ثابتوي

درې لوري:

  • پور ورکوونکی پروګرام د ماډل سره د هغه د عامه برخې په توګه ځای پر ځای کوي. د پروګرام پېژند همدا ماډل نوموي. هر څوک کولی شي وزنونه بېرته له زنځیر څخه ولولي.
  • تصدیقوونکی (د کریډیټ بیرو، بانک، یا کارګمارونکی) د غوښتونکي معلومات پېژني. غوښتونکي ته د ځانګړتیاوو ارزښتونه، یوه تصادفي ۱۶-بایټه مالګه، او د ژمنې SHA-256(salt ‖ features) پر سر خپل لاسلیک ورکوي.
  • غوښتونکی پروګرام د مالګې او ځانګړتیاوو سره د خصوصي ننوتو په توګه رابولي.

رابلل دا ثابتوي:

  1. هره ځانګړتیا د هغې حد دننه ده چې ماډل یې ورته اعلانوي؛
  2. پر همدې ځانګړتیاوو د ماډل امتیاز د حد سره برابر یا تر هغه لوړ دی (حالت 1) یا تر هغه ټیټ دی (حالت 2)؛
  3. خپره شوې ژمنه د مالګې او همدغو ځانګړتیاوو SHA-256 ده.

پور ورکوونکی د رسید د پروګرام پېژند، د هغه حالت، او دا ګوري چې ژمنه هغه ده چې تصدیقوونکي لاسلیک کړې. د غوښتونکي په اړه یوازې یو بیټ معلومات زده کوي.

خصوصي ننوتې پخپله د نړۍ په اړه هېڅ نه ثابتوي. پرته له ۳ ټکي، غوښتونکی کولی شي هر عدد ولیکي. ژمنه هغه څه ده چې په ثبوت کې عددونه هغو عددونو سره نښلوي چې چا یې تضمین کړی. لاسلیک پخپله پور ورکوونکی له زنځیر بهر ګوري: د Dilithium یا ECDSA تایید د یو رابللو په بودیجه کې نه ځایېږي، او د ثبوت دننه یې اړتیا هم نشته، ځکه چې ژمنه عامه ده.

2. انٹرفېس

هره عامه کلمه یو i32 دی چې د خپل دوه‌ګونې بشپړونې u32 په توګه ساتل کېږي.

عامه کلمهمعنا
0د ځانګړتیاوو شمېر n، له 1 تر 16
1د پټو واحدونو شمېر h، له 1 تر 16
2حد
3د کسري بیټونو شمېر، شفټ s، له 0 تر 31
بیا 2n کلمېد هرې ځانګړتیا اجازه شوی min او max
بیا h × n کلمېد لومړي پوړ وزنونه، قطار په قطار
بیا h کلمېد لومړي پوړ تعصبونه
بیا h کلمېد دوهم پوړ وزنونه
بیا 1 کلمهد دوهم پوړ تعصب
خصوصي کلمهمعنا
0 تر 3مالګه، 16 بایټه د څلورو big-endian کلمو په توګه
4 او وروستهn ځانګړتیاوې، هره یو i32
د وتنې ځایمعنا
0حالت: 1 منظور، 2 رد، 3 یوه ځانګړتیا له حد بهر ده، 4 خراب ماډل (یوه اندازه له حدودو بهر ده، یا حساب ډک شوی)
1نه کارېږي
2 تر 6د ژمنې لومړي 20 بایټه، د پنځو big-endian کلمو په توګه
7نه کارېږي؛ د Rust panic دلته 0xdeadbeef لیکي

ژمنه یوازې د 1 یا 2 حالت سره خپرېږي. له حد بهر ننوته مخکې له دې چې څه هش شي، درېږي.

3. حساب

ماډل یوازې بشپړ عددونه کاروي. ماشین شناور ټکی نه لري، او تاییدوونکی باید امتیاز دقیقاً بیا جوړ کړای شي، چې شناور ټکی یې په بېلابېلو ماشینونو کې ژمنه نه کوي.

hidden[j] = max( (b1[j] + Σ w1[j][i] · x[i]) >> s , 0 )      for each hidden unit j
score     = (b2 + Σ w2[j] · hidden[j]) >> s
approved  = score >= threshold

وزنونه د s کسري بیټونو سره ثابت ټکی دي: د s = 8 سره، د 256 وزن 1.0 معنا لري. مجموعې i64 دي، او هر ضرب او جمع ګوري، نو هغه ماډل چې وزنونه یې دومره لوی وي چې حساب ډک کړي، د غلط امتیاز پر ځای 4 حالت ورکوي. په Rust کې پر منفي i64 باندې >> د منفي بې‌نهایت پر لور ګردوي، او د Python >> هم همداسې کوي، او همدا دی چې د Python لس‌کرښیز فنکشن ته اجازه ورکوي چې مرجع وي.

د ښودنې ماډل اته ځانګړتیاوې او څلور پټ واحدونه لري. د دې وزنونه د همدې پاڼې لپاره په لاس لیکل شوي. دا روزل شوی ماډل نه دی او د کریډیټ په اړه هېڅ نه وايي.

{
  "shift": 8,
  "threshold": 600,
  "features": [
    {"name": "age_years", "min": 18, "max": 120},
    {"name": "income_thousands", "min": 0, "max": 100000},
    {"name": "debt_to_income_pct", "min": 0, "max": 1000},
    {"name": "on_time_payments_pct", "min": 0, "max": 100},
    {"name": "utilisation_pct", "min": 0, "max": 100},
    {"name": "history_years", "min": 0, "max": 100},
    {"name": "inquiries_12m", "min": 0, "max": 100},
    {"name": "delinquencies", "min": 0, "max": 100}
  ],
  "w1": [
    [  64,   96,  -512,  1536,  -640,  1024, -2048, -8192],
    [   0,  256, -1024,     0,     0,     0,     0,     0],
    [   0,    0,     0,  2560, -1280,     0, -4096, -16384],
    [ 128,    0,     0,     0,     0,  2048,     0,     0]
  ],
  "b1": [25600, 12800, -128000, 0],
  "w2": [160, 96, 224, 128],
  "b2": 76800
}

4. مېلمه

my-guests/score/src/main.rs، بشپړ:

#![no_std]
#![no_main]

use guest_sdk::{halt, read_input, read_public, sha256_compress, write_output};

const MAX_FEATURES: usize = 16;
const MAX_HIDDEN: usize = 16;

const APPROVED: u32 = 1;
const DECLINED: u32 = 2;
const OUT_OF_RANGE: u32 = 3;
const BAD_MODEL: u32 = 4;

/// SHA-256's initial state (FIPS 180-4 §5.3.3).
const IV: [u32; 8] = [
    0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
];

/// SHA-256 of `words`, each word taken as four big-endian bytes. The message is whole words,
/// so the padding is whole words too: `0x80000000`, zeros, then the bit length in the last
/// word of a block (the length's high word is always zero here).
fn sha256_words(words: &[u32]) -> [u32; 8] {
    let mut buf = [0u32; 24];
    buf[16..].copy_from_slice(&IV);
    let mut fill = 0;
    for &w in words {
        buf[fill] = w;
        fill += 1;
        if fill == 16 {
            sha256_compress(&mut buf);
            fill = 0;
        }
    }
    buf[fill] = 0x8000_0000;
    fill += 1;
    if fill > 14 {
        buf[fill..16].fill(0);
        sha256_compress(&mut buf);
        fill = 0;
    }
    buf[fill..15].fill(0);
    buf[15] = 32 * words.len() as u32;
    sha256_compress(&mut buf);
    let mut out = [0u32; 8];
    out.copy_from_slice(&buf[16..]);
    out
}

/// `weight · x`, added to `acc`; `None` when it does not fit an i64.
fn mul_add(acc: i64, weight: u32, x: i64) -> Option<i64> {
    acc.checked_add((weight as i32 as i64).checked_mul(x)?)
}

/// Runs the model in the public segment over the private features.
fn score(features: &[i32], hidden: usize, shift: u32) -> Option<i64> {
    let n = features.len();
    // The public segment after the header and the feature ranges:
    // hidden × n first-layer weights, hidden biases, hidden second-layer weights, one bias.
    let w1 = 4 + 2 * n;
    let b1 = w1 + hidden * n;
    let w2 = b1 + hidden;
    let b2 = w2 + hidden;

    let mut out = read_public(b2 as u32) as i32 as i64;
    for j in 0..hidden {
        let mut acc = read_public((b1 + j) as u32) as i32 as i64;
        for (i, &x) in features.iter().enumerate() {
            acc = mul_add(acc, read_public((w1 + j * n + i) as u32), x as i64)?;
        }
        // Fixed point: drop the fractional bits, then ReLU.
        let h = (acc >> shift).max(0);
        out = mul_add(out, read_public((w2 + j) as u32), h)?;
    }
    Some(out >> shift)
}

/// Public segment, fixed at deploy (every value an i32):
///   [features n, hidden units, threshold, fractional bits,
///    n × (min, max), hidden × n weights, hidden biases, hidden weights, bias]
/// Private input: [salt (4 words), n features].
/// Outputs: [status, 0, commitment (first 5 words), 0], where
/// commitment = SHA-256(salt ‖ features), every word big-endian.
#[no_mangle]
pub extern "C" fn main() -> ! {
    let n = read_public(0) as usize;
    let hidden = read_public(1) as usize;
    let threshold = read_public(2) as i32 as i64;
    let shift = read_public(3);
    if n == 0 || n > MAX_FEATURES || hidden == 0 || hidden > MAX_HIDDEN || shift > 31 {
        write_output(0, BAD_MODEL);
        halt();
    }

    // The committed message: the salt, then the features, in input order.
    let mut message = [0u32; 4 + MAX_FEATURES];
    for (i, w) in message.iter_mut().enumerate().take(4 + n) {
        *w = read_input(i as u32);
    }
    let mut features = [0i32; MAX_FEATURES];
    let mut in_range = true;
    for i in 0..n {
        let x = message[4 + i] as i32;
        let min = read_public(4 + 2 * i as u32) as i32;
        let max = read_public(5 + 2 * i as u32) as i32;
        in_range &= min <= x && x <= max;
        features[i] = x;
    }
    if !in_range {
        write_output(0, OUT_OF_RANGE);
        halt();
    }

    let status = match score(&features[..n], hidden, shift) {
        Some(s) if s >= threshold => APPROVED,
        Some(_) => DECLINED,
        None => BAD_MODEL,
    };
    let commitment = sha256_words(&message[..4 + n]);

    write_output(0, status);
    for k in 0..5 {
        write_output(2 + k as u32, commitment[k]);
    }
    halt();
}

ماډل معلومات دي، نه کوډ. وزنونه د read_public په واسطه لوستل کېږي، نو یو ځای پر ځای شوی انځور هر ماډل ته خدمت کوي چې تر 16 ځانګړتیاوو او 16 پټو واحدونو پورې وي. د ماډل بدلول د همدې کوډ نوی ځای پر ځای کول دي د نوې عامه برخې او نوي پروګرام پېژند سره. پور ورکوونکی نشي کولی د غوښتونکي تر پښو لاندې وزنونه بدل کړي، او غوښتونکی نشي کولی نرم ماډل غوره کړي: رسید د پروګرام پېژند نوموي، او پېژند وزنونه تړي.

حدونه د ماډل برخه دي. پرته له دوی، غوښتونکی نشي کولی د یو ارزښت په اړه دروغ ووايي (ژمنه یې مخه نیسي) خو تصدیقوونکی کولی شي بې‌معنا شی لاسلیک کړي، لکه د −5 عمر، چې یو ماډل د منفي وزن سره به یې انعام ورکړي. دا کتنه حساب هم محدودوي.

مالګه دوه دندې لري. ژمنه د اټکل وړ نه ګرځوي: اته کوچني بشپړ عددونه لږ انټروپي لري، او پرته له مالګې هر څوک کولی شي احتمالي غوښتونکي هش او پرتله کړي. او 128 تصادفي بیټونه له محاسبې تېروي. مخکې له دې چې د محدودیتونو ۷م ټولګي د ثبوت د بس مجموعې پټې کړې، د یو څو کوچنیو خصوصي کلمو پر سر رابلل له ثبوت څخه پخپله په زور ماتېدلی شو، او د fullnode یادښتونو داسې پروګرامونو ته ویلي وو چې تصادفي کلمې ولولي. زنځیر 18 د محدودیتونو ۸م ټولګی چلوي، چې پکې دا ستونزه حل شوې، خو مالګه یوازې څلور ننوتې کلمې لګوي او پوښتنه له منځه وړي.

5. د کوربه اړخ

score.py یوازې د Python معیاري کتابتون کاروي:

score.py setup   <model.json>                            writes public.txt
score.py witness <model.json> <salt: 32 hex> <x0> <x1> …  prints the private words;
                                                        stderr: the score, the decision, the commitment
score.py commit  <salt: 32 hex> <x0> <x1> …              prints the commitment alone

مرجع امتیاز ورکوونکی او ژمنه، بشپړ:

def score(m, x):
    """The guest's arithmetic exactly: integers, a floor shift after each layer, ReLU between."""
    out = m["b2"]
    for row, b, w2 in zip(m["w1"], m["b1"], m["w2"]):
        h = max((b + sum(w * xi for w, xi in zip(row, x))) >> m["shift"], 0)
        out += w2 * h
    return out >> m["shift"]

def commitment(salt: bytes, x):
    return hashlib.sha256(salt + b"".join(struct.pack(">i", xi) for xi in x)).digest()
$ cd my-guests/score
$ python3 score.py setup model.json
wrote public.txt (61 words)
$ cat public.txt
8 4 600 8 18 120 0 100000 0 1000 0 100 0 100 0 100 0 100 0 100 64 96 4294966784 1536 4294966656 1024 4294965248 4294959104 0 256 4294966272 0 0 0 0 0 0 0 0 2560 4294966016 0 4294963200 4294950912 128 0 0 0 0 2048 0 0 25600 12800 4294839296 0 160 96 224 128 76800

لوی عددونه منفي وزنونه دي: 4294966784 یعنې −512.

مېلمه د دې مرجع په وړاندې پر 300 تصادفي غوښتونکو ازمویل شو، چې پرېکړه او د ژمنې ټولې پنځه کلمې پکې پرتله شوې، او پر هغو غوښتونکو هم چې امتیازونه یې 599 او 600 دي. په هر یو کې سره برابر دي.

6. جوړول او چلول

$ rand-guest build my-guests/score --max-words 65535
462 words against a cap of 65535 (fits); 0 ecall(s) with a non-static a7
OK
wrote my-guests/score/image.bin and its .sha256 (462 words, hc c63d7b15a165a11d007ce48bc37563b71f77fcc4991ffe0182c8cf4c77b6e7b5, program id ce8d234faf737c24bdd2826933ac843973c140c53e76fbb2cccaef3073da9818)

یو غوښتونکی چې 41 کلن دی، 85 زره عاید لري، 28% پور د عاید په تناسب، 97% تادیات یې پر وخت، 22% کارونه، 12 کاله تاریخچه، یوه پوښتنه او هېڅ ځنډېدلی تادیه نه لري:

$ python3 score.py witness model.json 00112233445566778899aabbccddeeff 41 85 28 97 22 12 1 0 > witness.txt
score 1075 approved
commitment 9430c3818f5966f8dd33f78e05a7d079355191e6
$ cat witness.txt
1122867 1146447479 2291772091 3437096703 41 85 28 97 22 12 1 0
$ rand-guest run image.bin --public $(cat public.txt) --input $(cat witness.txt) --tier 14
out[0] = 1
out[1] = 0
out[2] = 2486223745
out[3] = 2405000952
out[4] = 3711170446
out[5] = 94883961
out[6] = 894538214
out[7] = 0
cycles 1810
tier 12
tier 14: fits (cycles 1946 of 16383, Poseidon2 permutations 136 of 2048)

2486223745 یعنې 0x9430c381، د ژمنې لومړي څلور بایټه. امتیاز، 1075، په وتنو کې هېڅ ځای نه ښکاري.

دوهم غوښتونکی (23, 31, 55, 82, 91, 2, 6, 2، د بلې مالګې سره) 417 امتیاز اخلي او د خپلې ژمنې سره out[0] = 2 ورکوي، په همدې 1,810 سایکلونو کې. لومړی غوښتونکی چې عمر یې 17 ته بدل شي، out[0] = 3 ورکوي او هېڅ ژمنه نه ورکوي.

7. بودیجه

پروګرام462 کلمې
عامه برخه61 کلمې
خصوصي کلمې12
سایکلونه1,810
د SHA-256 فشارونه1 (48 بایټه پیغام په یوه بلاک کې ځایېږي)
کچه12

دا د څلورو پروګرامونو تر ټولو ارزانه دی. مخ ته تګ 36 ضربونه دي. هغه ماډل چې د پروګرام په حدونو کې وي، 16 ځانګړتیاوې او 16 پټ واحدونه، 272 ضربونه او 325-کلمیزه عامه برخه ده. په emulator کې 7,900 سایکلونه اندازه کېږي، د 14 کچې شاوخوا نیمایي.

چلول په معلوماتو پورې اړه نه لري: 200 تصادفي غوښتونکو، منظور او رد شوي یو شان، هر یو دقیقاً 1,810 سایکلونه واخیستل. د gas حد چې رابلل یې اعلانوي عامه دی او د چلولو له gas څخه ګردېږي، نو هغه پروګرام چې د سایکلونو شمېر یې د ننوتو پسې تللی، د هغو یوه اندازه به یې افشا کړې وای. دا پروګرام د دې لارې د افشا کولو لپاره هېڅ نه لري.

له زنځیر 18 راهیسې والټ د چلولو دقیق gas او هغه حد چاپوي چې اعلانوي یې:

gas: 2011 (declaring 2048, tier 12)

1,948 قطارونه هر یو په 1 gas، جمع 63 نور د یو فشار لپاره.

8. ځای پر ځای کول

د ماډل 61 کلمو پیسې د کوډ د کلمو په څېر ورکول کېږي: 0.001 + 0.0001 × (462 + 61) = 0.0533 RAND.

$ rand fee deploy 462 --public-words 61
0.0533 RAND
$ rand program deploy image.bin --public public.txt
program id: 7bbec14289f4446231b3a9a5ac18cb0613a373ca8a14fe4f046f3fde7ae6c73c (462 words, hc 157b3dc61da165a18be47c00b76375c3c4fc771f01fe1f994ccfc882b5e7b677, public input 61 words, digest a08a7c691c45babeb39e953930d4d7174662b7b8adcc2d0f4e6c193d362d6668)
proving the spend authorisation on this machine (tier 10; seconds)…
authorisation proved in 7.4s: tier 10, 1364940 bytes
proving the bundle (tier 14; about a minute and a half on a laptop)…
proved in 123.5s: tier 14, 1497319 bytes
submitted deploy d47a9323ea53bfafc3faa36d004416d374bf3c2a48971d87e346be426b0caf14
  0 RAND out, 59.7229 RAND change, fee 0.0533 RAND, anchored at height 98062, proved in 123.5s (bundle) + 7.4s (auth)

9. رابلل

$ rand call 7bbec14289f4446231b3a9a5ac18cb0613a373ca8a14fe4f046f3fde7ae6c73c \
    $(sed 's/[0-9][0-9]*/--input &/g' witness.txt)
proving the call locally (12 inputs stay private, over the program's 61-word public input)…
gas: 2011 (declaring 2048, tier 12)
fee 0.005673037 RAND (incl. two price steps of headroom)
proved in 30.6s: tier 12, 1838256 bytes, outputs [1, 0, 2486223745, 2405000952, 3711170446, 94883961, 894538214, 0]
proving the spend authorisation on this machine (tier 10; seconds)…
authorisation proved in 6.8s: tier 10, 1369611 bytes
proving the bundle (tier 14; about a minute and a half on a laptop)…
proved in 124.3s: tier 14, 1499112 bytes
submitted call 454c1b9eb1e159e682d4ff26b71f77d8a950b813533d91a89293dd432fdcf6f7
  0 RAND out, 59.696058627 RAND change, fee 0.005673037 RAND, anchored at height 98832, proved in 124.3s (bundle) + 6.8s (auth)
{
  "h_in": "ef80c744a8cdea62b56e334baaf7372e4a2e6c8282d37aa8ae96b4f039ec1a22",
  "h_pub": "a08a7c691c45babeb39e953930d4d7174662b7b8adcc2d0f4e6c193d362d6668",
  "height": 98993,
  "index": 0,
  "outputs": [
    1,
    0,
    2486223745,
    2405000952,
    3711170446,
    94883961,
    894538214,
    0
  ],
  "program": "7bbec14289f4446231b3a9a5ac18cb0613a373ca8a14fe4f046f3fde7ae6c73c",
  "tier": 12,
  "tx": "454c1b9eb1e159e682d4ff26b71f77d8a950b813533d91a89293dd432fdcf6f7"
}
input transcript published; open it with `rand open-call 454c1b9eb1e159e682d4ff26b71f77d8a950b813533d91a89293dd432fdcf6f7`

حالت 1 او ژمنه 9430c381 8f5966f8 dd33f78e 05a7d079 355191e6 په hex کې. h_pub د ماډل د 61 کلمو ډایجسټ دی. ځانګړتیاوې، مالګه او امتیاز په معامله کې نشته.

رابلل د Apple Silicon پر لپ‌ټاپ له درېیو دقیقو یو څه زیات ونیول: 31 s د رابللو ثبوت لپاره، 7 s د لګښت د اجازې لپاره او 124 s د بنډل لپاره، د 6.2 GB لوړې کچې سره. ثبوت 1,838,256 بایټه دی.

10. پخپله یې وګورئ

د پور ورکوونکي اړخ، یوازې د رسید او د تصدیقوونکي د لاسلیک شوې ژمنې سره:

  1. ماډل. پر پروګرام پېژند باندې rand_getProgramPublic 61 کلمې راګرځوي. د خپاره شوي model.json سره یې پرتله کړئ (score.py setup یې بیا جوړوي).
  2. کوډ. my-guests/score د سرکټونو په همدې commit بیا جوړ کړئ او hc د پروګرام د code_hash سره پرتله کړئ.
  3. رسید. program د ماډل پېژند دی، 0 وتنه 1 ده، 7 ځای 3735928559 نه دی.
  4. ژمنه. له 2 تر 6 وتنې، چې د hex په توګه چاپ شي، د هغې ژمنې لومړي 20 بایټه دي چې تصدیقوونکي لاسلیک کړې:
$ python3 score.py commit 00112233445566778899aabbccddeeff 41 85 28 97 22 12 1 0
9430c3818f5966f8dd33f78e05a7d079355191e6

رد هم رسید دی. د دوهم غوښتونکي غوښتنه، 119e7834…1b3b په زنځیر 18 کې (چې په زنځیر 20 کې د c8a60183…9f73 په توګه تکرار شوه او هغه هم ردوي)، په همدې ډول ثابته او ژمن شوه:

$ python3 score.py witness model.json 0f1e2d3c4b5a69788796a5b4c3d2e1f0 23 31 55 82 91 2 6 2 > witness.txt
score 417 declined
commitment 0313ea462178574c49a10fe7ea1d84207652e1a3
$ rand call 7bbec14289f4446231b3a9a5ac18cb0613a373ca8a14fe4f046f3fde7ae6c73c \
    $(sed 's/[0-9][0-9]*/--input &/g' witness.txt)
…
gas: 2011 (declaring 2048, tier 12)
proved in 26.1s: tier 12, 1836624 bytes, outputs [2, 0, 51636806, 561534796, 1235292135, 3927802912, 1985143203, 0]
…
submitted call 119e7834033edd19bba8e10c1a764e8bdbc0b1c8415a42f041faa392c6411b3b

حالت 2 دی، او 51636806 د 0x0313ea46 سره برابر دی. ګاز، اعلان شوې حد او پوړ د منظورې شوې غوښتنې سره یو شان دي، نو دا دوه غوښتنې په زنځیر کې یوازې د حالت په کلمه او ژمنه کې سره توپیر لري او په بل هېڅ ځای کې نه. غوښتونکی د رد د خپرولو لپاره هېڅ دلیل نه لري، خو پور ورکوونکی په هر حالت کې رسید غوښتلی شي، او رد شوی غوښتونکی منظور شوی رسید نشي وړاندې کولی.

هغه څه چې ثبوت یې تاسو ته نه درکوي

  • رښتیني معلومات. ثبوت ښيي چې ماډل د ژمن شویو ارزښتونو پر سر چلېدلی دی. دا چې ارزښتونه رښتیني دي که نه، د تصدیق کوونکي خبره ده، او پور ورکوونکی باید په دې برخه کې د تصدیق کوونکي پر لاسلیک باور وکړي.
  • نه تړل کېدونکی غوښتونکی. ژمنه یو ثابت پېژندونکی دی: تصدیق کوونکی یې پېژندلی شي، او دوه رسیدونه چې یوه ژمنه ولري، یو غوښتونکی او یو شان معلومات دي. د هرې غوښتنې لپاره د تصدیق کوونکي له خوا نوې مالګه دوهمه ستونزه حل کوي، نه لومړۍ.
  • پټ ماډل. وزنونه عامه دي. د هغه قاعدې لپاره چې خلک یې باید لوستلی شي، همدا موخه ده، او د هغه پور ورکوونکي لپاره چې خپل ماډل سوداګریز راز ګڼي، دا یوه نیمګړتیا ده. غوښتونکی کولی شي هغه ننوتې هم ولټوي چې تېرېږي، خو د تصدیق کوونکي له لاسلیک پرته یې نشي کارولی.
  • د بې‌صداقته تصدیق کوونکي له لټون څخه ساتنه. هر څوک چې ځانګړتیاوې پېژني، عامه ماډل پخپله چلولی شي. دلته محرمیت د پور ورکوونکي او عامو خلکو پر وړاندې د غوښتونکي دی، نه د هغه اړخ پر وړاندې چې معلومات یې برابر کړي دي.
  • لوی ماډل. شپاړس ځانګړتیاوې او شپاړس پټ واحدونه د نمرو کارت دی، نه ژوره شبکه. یوه غوښتنه تر پوړ 14 پورې محدوده ده، چې شاوخوا شپاړس زره دورې کېږي.

وروستی ځل د 2026-09-30 په نېټه د fullnode د 48dc04b کمېټ (زنځیره 18) پر وړاندې تایید شوی، او circuits `aeacf31` (`guest-sdk/src/lib.rs`, `rand-guest`), the commit fullnode v0.6.7 vendors; every `rand-guest`, `python3` and `rand` output on this page was produced on 2026-09-30, the deploy and the call on chain 18. چېرې چې کوډ او دا پاڼه سره توپیر ولري، کوډ سم دی؛ موږ ته خبر راکړئ.