ArbiPic ๐ธ
On-Chain Verifiable Photo Capture System using Stylus and Arbitrum Orbit L3
A decentralized application that combats AI-generated fake images by enabling users to capture photos via webcam and cryptographically verify them on-chain. Using Arbitrum's Stylus (Rust smart contracts) and Orbit L3, each photo is hashed, stored on IPFS, and verified on the blockchain with ZK-style ownership proofs.
๐ Features
| Feature | Description |
|---|---|
| ๐ธ Webcam Capture | Real-time photo capture using react-webcam |
| ๐ On-Chain Verification | SHA-256 hash stored immutably on Arbitrum |
| โก Stylus Contracts | Rust/WASM for ~10x gas savings vs Solidity |
| ๐ IPFS Storage | Decentralized image storage via Pinata |
| ๐ ZK Commitments | keccak256-based ownership proofs |
| ๐ฃ Orbit L3 | Custom L3 chain for ultra-low cost verification |
| ๐ฆ Social Sharing | Tweet verification proofs directly |
| ๐ Verification Page | Anyone can verify authenticity by uploading an image |
| ๐ Network Switching | Seamlessly switch between Sepolia and L3 |
| ๐ท๏ธ Watermarked Badges | Download verified images with proof overlay |
๐๏ธ Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ FRONTEND โ
โ React 18 + TypeScript + Vite + Tailwind + Wagmi v2 โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ PhotoCaptureโ โ VerifyPage โ โ NetworkSwitcher โ โ
โ โ Enhanced โ โ โ โ (Sepolia โ Orbit L3) โ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโ
โผ โผ โผ
โโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ
โ IPFS โ โ Arbitrum โ โ Orbit L3 โ
โ (Pinata) โ โ Sepolia โ โ (Local/Custom) โ
โ โ โ Chain: 421614 โ โ Chain: 333333 โ
โ Images + โ โ โ โ โ
โ Metadata โ โ โโโโโโโโโโโโ โ โ โโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโ โ โ Stylus โ โ โ โ Stylus โ โ
โ โ Contract โ โ โ โ Contract โ โ
โ โ (Rust) โ โ โ โ (Rust) โ โ
โ โโโโโโโโโโโโ โ โ โโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ
๐ฆ Multi-Network Deployment
| Network | Contract Address | Chain ID | RPC |
|---|---|---|---|
| Arbitrum Sepolia | 0xeb246817d2440f82f4b4c04c2c120afefe1e5ec4 | 421614 | https://sepolia-rollup.arbitrum.io/rpc |
| Orbit L3 (Local) | 0x1294b86822ff4976bfe136cb06cf43ec7fcf2574 | 333333 | http://127.0.0.1:3347 |
๐ Quick Start
Prerequisites
- Node.js 18+ and npm
- Rust toolchain:
rustup install stable - Cargo Stylus CLI:
cargo install cargo-stylus --locked - Docker (for Orbit L3 local development)
- MetaMask wallet
- Testnet ETH: Get from Sepolia Faucet
1. Clone & Install
git clone https://github.com/yourusername/ArbiPic.git
cd ArbiPic
# Install frontend dependencies
cd frontend && npm install
# Build Rust contract
cd ../contracts && cargo build --release
2. Configure Environment
Create frontend/.env:
VITE_PINATA_JWT=your_pinata_jwt_token
VITE_PINATA_GATEWAY=your-gateway.mypinata.cloud
VITE_APP_URL=http://localhost:5173
3. Run Frontend
cd frontend
npm run dev
Visit http://localhost:5173
๐ฃ Orbit L3 Deployment
For ultra-low cost verification on your own L3 chain:
Start Local L3
# Clone nitro-testnode
git clone --recurse-submodules https://github.com/OffchainLabs/nitro-testnode.git
cd nitro-testnode
# Start L1 โ L2 โ L3 chain
yes | ./test-node.bash --init --l3node --detach
Deploy Contract to L3
cd ArbiPic/contracts
cargo stylus deploy \
--endpoint http://127.0.0.1:3347 \
--private-key 0xb6b15c8cb491557369f3c7d2c287b053eb229daa9c22138887752191c9520659
Add L3 to MetaMask
| Field | Value |
|---|---|
| Network Name | ArbiPic L3 (Orbit) |
| RPC URL | http://127.0.0.1:3347 |
| Chain ID | 333333 |
| Currency Symbol | ETH |
Pre-funded test account:
- Address:
0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E - Private Key:
0xb6b15c8cb491557369f3c7d2c287b053eb229daa9c22138887752191c9520659
See docs/ORBIT_L3_DEPLOYMENT.md for detailed guide.
๐ Usage Guide
Capture & Verify a Photo
- Connect Wallet: Click "Connect Wallet" and connect MetaMask
- Select Network: Use the network switcher (๐ต Sepolia or ๐ฃ Orbit L3)
- Capture Photo: Click "๐ธ Capture Photo"
- Verify On-Chain: Click "๐ Verify On-Chain" to submit
- View Results: Get IPFS link, transaction hash, and verification ID
- Share: Tweet your verified photo or copy the verification link
Verify Someone Else's Photo
- Go to
/verifypage - Upload the image or paste the verification ID
- System checks on-chain if the photo was verified
- See owner address, timestamp, and ZK proof status
Prove Ownership (ZK Proof)
If you verified a photo, you can prove ownership without revealing the image:
- Click "๐ Prove Ownership"
- Your locally-stored secret is used to verify against on-chain commitment
- Cryptographic proof confirms you're the original owner
๐ Smart Contract API
Stylus Contract (Rust)
fn verify_photo(photo_hash: U256, zk_commitment: U256) -> U256
fn get_attestation(photo_hash: U256) -> (U256, Address, U256)
fn is_verified(photo_hash: U256) -> bool
fn verify_zk_proof(photo_hash: U256, secret: U256) -> bool
fn get_owner_of(photo_hash: U256) -> Address
fn get_photo_count() -> U256
ABI (Solidity-compatible)
function verifyPhoto(uint256 photoHash, uint256 zkCommitment) returns (uint256)
function getAttestation(uint256 photoHash) view returns (uint256, address, uint256)
function isVerified(uint256 photoHash) view returns (bool)
function verifyZkProof(uint256 photoHash, uint256 secret) view returns (bool)
function getOwnerOf(uint256 photoHash) view returns (address)
function getPhotoCount() view returns (uint256)
๐ Gas Benchmarks
| Operation | Stylus (Rust) | Solidity | Savings |
|---|---|---|---|
| verifyPhoto | ~45,000 gas | ~120,000 gas | ~63% |
| getAttestation | ~8,000 gas | ~25,000 gas | ~68% |
| verifyZkProof | ~12,000 gas | ~35,000 gas | ~66% |
See docs/GAS_BENCHMARKS.md for detailed benchmarks.
๐ Project Structure
ArbiPic/
โโโ contracts/ # Rust Stylus smart contract
โ โโโ src/
โ โ โโโ lib.rs # Main contract code
โ โ โโโ main.rs # ABI export
โ โโโ solidity/
โ โ โโโ PhotoVerifierSolidity.sol
โ โโโ Cargo.toml
โ โโโ Stylus.toml
โโโ frontend/ # React frontend
โ โโโ src/
โ โ โโโ components/
โ โ โ โโโ Header.tsx
โ โ โ โโโ NetworkSwitcher.tsx
โ โ โ โโโ PhotoCaptureEnhanced.tsx
โ โ โ โโโ VerifyPage.tsx
โ โ โโโ utils/
โ โ โ โโโ zkProof.ts
โ โ โ โโโ ipfs.ts
โ โ โ โโโ verification.ts
โ โ โ โโโ eas.ts
โ โ โโโ config.ts
โ โ โโโ App.tsx
โ โโโ package.json
โ โโโ vite.config.ts
โโโ docs/
โ โโโ GAS_BENCHMARKS.md
โ โโโ ORBIT_L3_DEPLOYMENT.md
โโโ scripts/
โ โโโ deploy.sh
โ โโโ benchmark.sh
โโโ README.md
๐ ๏ธ Development
Contract Development
cd contracts
cargo stylus check
cargo build --release --target wasm32-unknown-unknown
cargo stylus deploy --endpoint https://sepolia-rollup.arbitrum.io/rpc --private-key $KEY
Frontend Development
cd frontend
npm run dev # Start dev server
npm run build # Build for production
npm run preview # Preview production build
๐ก Why Stylus?
| Benefit | Description |
|---|---|
| โก 10x Gas Savings | WASM execution is more efficient than EVM bytecode |
| ๐ฆ Rust Safety | Memory safety, no null pointers, no buffer overflows |
| ๐ง Modern Tooling | Cargo, rustfmt, clippy, rust-analyzer support |
| ๐ EVM Compatible | Full interoperability with Solidity contracts |
| ๐ฆ Rich Ecosystem | Access to all Rust crates (with no_std support) |
๐ฏ What we have Achieved
| Category | Implementation |
|---|---|
| โ Stylus | Rust smart contract with keccak256 ZK proofs |
| โ Orbit L3 | Custom chain deployment with nitro-testnode |
| โ Gas Efficiency | 60-70% savings vs Solidity |
| โ IPFS | Decentralized storage via Pinata |
| โ ZK Proofs | Privacy-preserving ownership verification |
| โ Multi-Chain | Network switcher (Sepolia + L3) |
| โ Social Proof | Twitter sharing integration |
| โ Modern UX | React 18 + Wagmi v2 + Tailwind |
๐ฎ Future Roadmap
- Production Orbit Chain - Deploy on mainnet L3
- Full ZK Proofs - Implement SNARKs/STARKs for complete privacy
- Batch Verification - Verify multiple photos in one transaction
- AI Detection - Integrate deepfake detection algorithms
- Mobile App - React Native version
- Cross-Chain Bridge - Verify proofs across L2/L3
๐ Resources
Built with โค๏ธ ๐
Fighting AI fakes with blockchain technology

