
o1js/Mina zkApps और Noir सर्किट में zk सर्किट साउंडनेस बग्स के लिए डिपेंडेंसी-फ्री स्टैटिक एनालाइज़र
कम्युनिटी पैकेज:
o1js-scanआधिकारिक o1js Community Packages निर्देशिका में सूचीबद्ध है।
नवीनतम: 0.22.0 — एक लोकल MCP सर्वर Claude Code, Cursor और अन्य AI कोडिंग सहायकों को zkApp लिखते समय स्कैनर चलाने देता है:
pip install 'o1js-scan[mcp]'। यह आपकी मशीन पर stdio के माध्यम से चलता है और कुछ भी अपलोड नहीं करता। जिस स्कैन ने किसी फ़ाइल का विश्लेषण नहीं किया वह एक त्रुटि है, साफ़ परिणाम नहीं, और बिना किसी निष्कर्ष वाला परिणाम बताता है कि यह सुरक्षा की गारंटी नहीं है। मुख्य स्कैनर में अभी भी कोई निर्भरता नहीं है। देखें CHANGELOG।
इनमें zk सर्किट साउंडनेस बग्स के लिए एक तेज़, निर्भरता-मुक्त स्टैटिक एनालाइज़र:
.ts / .js) — @method बॉडीज़ से Kimchi सर्किट.nr) — Aztec का Rust-जैसा ZK DSL (aztec-nr-आकार के पैटर्न सहित)सुरक्षा-महत्वपूर्ण बग्स आमतौर पर प्रूविंग सिस्टम में नहीं होते — वे
एप्लिकेशन की अपनी बाधाओं में होते हैं: ऐसे विटनेस जिन्हें प्रूवर नियंत्रित
करता है लेकिन सर्किट उन्हें कभी बाइंड नहीं करता। o1js-scan Mina और Noir
पारिस्थितिक तंत्रों में Circom के समकक्षों के लिए अंडर-कंस्ट्रेंड-सिग्नल स्कैनर है।
यह भी देखें: gnark-safety (gnark सर्किट), vk-guard (वेरिफिकेशन-की रिग्रेशन)।
pip install o1js-scan
# or: pipx install o1js-scan
# or: npm install -D o1js-scan
o1js-scan path/to/zkapp # o1js + Noir (auto)
noir-scan path/to/circuits # same binary — Noir-friendly alias
noir-scan . --lang noir --fail-on high --sarif noir.sarif
एक vault दिया गया है जिसकी withdraw राशि एक prover-नियंत्रित witness है जो
कभी भी on-chain state से बंधी नहीं होती:
$ o1js-scan examples/vulnerable_vault.ts --include-examples
LOW O1JS_UNCONSTRAINED_RECIPIENT vulnerable_vault.ts:23 fn=withdraw Recipient `to` is prover-chosen in `withdraw`
HIGH O1JS_UNCONSTRAINED_WITNESS vulnerable_vault.ts:23 fn=withdraw Unconstrained witness `amount` flows to send_amount in `withdraw`
o1js-scan: 2 finding(s) [1 high, 1 low] in 1 of 1 file(s) — fails (--fail-on high)
$ echo $?
1
--include-examples की यहाँ आवश्यकता केवल इसलिए है क्योंकि डेमो फ़ाइल
examples/ के अंतर्गत है, जिसे पथ वर्गीकरणकर्ता डिफ़ॉल्ट रूप से डाउनग्रेड कर देता है ताकि किसी रेपो का
अपना नमूना कोड उसके बिल्ड को विफल न कर सके। आपके src/ में वही अनुबंध बिना किसी फ़्लैग के
HIGH रिपोर्ट करता है।
HIGH निष्कर्ष वह ड्रेन करने योग्य बग है। ठीक किया गया अनुबंध
(examples/safe_vault.ts) इसे हटा देता है और 0 के साथ बाहर निकल जाता है, केवल प्रोवर-चयनित प्राप्तकर्ता पर
सूचनात्मक LOW को बनाए रखते हुए:
$ o1js-scan examples/safe_vault.ts --include-examples
LOW O1JS_UNCONSTRAINED_RECIPIENT safe_vault.ts:23 fn=withdraw Recipient `to` is prover-chosen in `withdraw`
o1js-scan: 1 finding(s) [1 low] in 1 of 1 file(s) — passes (--fail-on high)
$ echo $?
0
o1js और Noir के कमजोर/ठीक किए गए जोड़ों के लिए examples/ देखें।
pip install o1js-scan
एक पृथक वैश्विक CLI इंस्टॉल के लिए, pipx का उपयोग करें:
pipx install o1js-scan
Node/npm-आधारित Noir, Aztec, या o1js ऐप रिपॉज़िटरी के लिए, npm wrapper इंस्टॉल करें:
npm install -D o1js-scan
npx noir-scan . --lang noir --fail-on high
npm पैकेज उसी Python विश्लेषक के चारों ओर एक पतला रैपर है और इसके लिए PATH (python3 या python) पर Python 3.8+ की आवश्यकता होती है। किसी विशिष्ट इंटरप्रेटर को चुनने के लिए O1JS_SCAN_PYTHON सेट करें।
या स्रोत से:
git clone https://github.com/auditinfra-io/o1js-scan
cd o1js-scan
pip install -e .
कोई तृतीय-पक्ष Python निर्भरता नहीं। Python 3.8+। noir-scan कंसोल स्क्रिप्ट
o1js-scan के साथ (समान एंट्री पॉइंट) इंस्टॉल होती है, जिसमें npm
रैपर के माध्यम से भी शामिल है।
# scan a directory (recursively; skips node_modules, target/, .git, …)
o1js-scan path/to/project
# Noir-only / o1js-only
noir-scan circuits --lang noir
o1js-scan src --lang o1js
# scan a single file
o1js-scan src/MyContract.ts
noir-scan src/main.nr
# machine-readable output for CI
o1js-scan src --json
# SARIF 2.1.0 for GitHub code scanning (writes o1js-scan.sarif by default)
o1js-scan src --sarif
noir-scan . --lang noir --sarif noir.sarif
# choose which severity fails CI (critical|high|medium|low|none; default high)
o1js-scan src --fail-on medium
# progressive/power-user gate (equivalent to --fail-on medium)
o1js-scan src --strict
# test code is excluded by default (both backends); opt back in
o1js-scan src --include-tests
# example code is downgraded to LOW by default; keep original severity
o1js-scan src --include-examples
# a path with no o1js / Noir source exits 2; opt out where that is expected
o1js-scan packages/ --allow-empty
o1js-scan --version
Exit code 1 होता है जब --fail-on स्तर (डिफ़ॉल्ट high) पर या उससे ऊपर कोई finding मौजूद हो और अन्यथा 0 — इसलिए आप इसे सीधे CI में डाल सकते हैं। डिफ़ॉल्ट के साथ, low/medium finding (नीचे दिए गए informational recipient नियम सहित) build को fail नहीं करता; केवल रिपोर्ट करने के लिए --fail-on none का उपयोग करें, या अधिक कड़ाई से gate करने के लिए --strict (जो --fail-on medium का shorthand है) का उपयोग करें, जबकि low-severity findings को advisory मानते हुए। दोनों विकल्प mutually exclusive हैं ताकि CI configuration अस्पष्ट न हो। अनुपस्थित scan path stderr पर error के साथ 2 exit करता है, इसलिए एक typo चुपचाप CI को clean run के रूप में पास नहीं कर सकता। ऐसा path भी जो मौजूद है लेकिन उसमें कोई o1js या Noir source नहीं है जिसे analyzer पढ़ सके (उदाहरण के लिए --lang noir जो o1js project पर point किया गया हो); जहाँ यह वैध हो वहाँ --allow-empty पास करें। प्रत्येक run stderr पर एक one-line summary (severity के अनुसार counts और gate verdict) print करता है।
Test code डिफ़ॉल्ट रूप से बाहर रखा जाता है — दोनों backends। Tests जानबूझकर invalid values और bad transactions बनाते हैं ताकि साबित हो सके कि asserts उन्हें reject करते हैं, इसलिए वहाँ finding test का उद्देश्य है, circuit bug नहीं। एक file test code मानी जाती है जब:
*.test.ts / *.spec.ts (और .js/.jsx/.tsx/.mjs/.cjs variants) से match करता हो, या *_test.nr / test_*.nr;test/, tests/, __tests__/, spec/ या __mocks__/ directory के अंतर्गत हो;#[test] / #[test(...)] attribute हो, या यह mod test { … } / mod tests { … } block के अंदर हो — block-scoped, इसलिए production file के अंत में स्थित test module बाकी file को silence नहीं करता।उन्हें रिपोर्ट करने के लिए --include-tests पास करें।