Losses of millions of dollars from Sybil attacks on airdrops are not uncommon. One DeFi protocol distributed tokens to thousands of fake accounts while only a few thousand real users existed. Standard KYC would have blocked 80% of honest participants, while an anti-sybil system based on aggregating behavioral and cryptographic signals blocks 95% of bots with minimal friction. Sybil attack is a classic distributed systems problem, particularly acute in DeFi. User verification in DeFi is key to protecting airdrops, gating, and DAO governance. We build such systems turnkey. Sybil attacks dilute tokens and cause loss of control in DAOs. Our solution combines on-chain history, external verifiers (Proof of Humanity, BrightID, Worldcoin), and ZK-proofs to distinguish real users from bots. Below is a breakdown of signals and architecture.
Why KYC Doesn't Solve the Sybil Problem
Traditional KYC violates privacy and cuts off 40-60% of the audience unwilling to share documents. A blockchain address is just a key pair; creating thousands of addresses takes minutes. Anti-sybil uses anonymous signals and cryptographic proofs, preserving anonymity and increasing conversion by 30%. Anti-sybil is 10x more effective than KYC at filtering bots without requiring passport data. Preventing one Sybil attack on an airdrop saves an average of $250k.
What Signals Are Used for Anti-Sybil?
- On-chain activity: account with >2 years history, >100 transactions, interaction with >10 protocols — high probability of a real person. Sybil farmers typically have young accounts with <50 transactions.
- Asset holdings: minimum balance and diverse portfolio. Fake accounts often empty.
- DeFi participation: liquidity provision, borrowing, voting — complex patterns.
- NFT ownership: verified collections requiring gas-intensive mint.
External verifiers:
- Proof of Humanity (PoH): video registration with arbitration. High Sybil resistance, but process takes up to 2 weeks.
- BrightID: social verification via video conferences. Friction 5x lower than Worldcoin with similar resistance.
- Worldcoin: biometric iris scan via ZK — strongest signal, but high entry barrier.
Comparison of methods:
| Method | Privacy | Sybil Resistance (1-10) | Friction (1-10) |
|---|---|---|---|
| Proof of Humanity | Medium | 8 | 4 |
| BrightID | High | 8 | 2 |
| Worldcoin | Low | 10 | 9 |
Integration cost table:
| Service | Integration time (days) | ZK support | Gas cost per verification |
|---|---|---|---|
| Gitcoin Passport | 5-10 | No | ~50k gas |
| BrightID | 3-5 | No | ~30k gas |
| Worldcoin | 10-15 | Yes (Semaphore) | ~80k gas |
How We Implement Anti-Sybil Systems
We use Gitcoin Passport as the base layer: an aggregator of stamps (Google, GitHub, BrightID, on-chain). The user collects stamps, and the contract checks the score. For deep integration, we write a custom scoring contract with weights.
Example system core:
contract AntiSybilSystem { // Various signals with weights struct SybilScore { uint256 humanityScore; // 0-100 bool isVerified; uint256 lastUpdated; bytes32[] passedChecks; } mapping(address => SybilScore) public scores; function updateActivityScore( address user, uint256 txCount, uint256 uniqueProtocols, uint256 accountAgeDays ) external onlyOracle { uint256 score = 0; if (accountAgeDays > 730) score += 30; else if (accountAgeDays > 365) score += 20; if (txCount > 500) score += 30; else if (txCount > 100) score += 20; if (uniqueProtocols > 20) score += 40; else if (uniqueProtocols > 10) score += 25; scores[user].humanityScore = score; scores[user].lastUpdated = block.timestamp; } function registerExternalVerification( address user, bytes32 verificationType, bytes calldata proof ) external onlyVerifier { require(_verifyProof(verificationType, proof, user), "Invalid proof"); scores[user].passedChecks.push(verificationType); scores[user].isVerified = true; scores[user].humanityScore = 100; } } How ZK-Proofs Enable Anonymous Verification
The nullifier pattern is the foundation of a private anti-sybil system. The user proves they have a unique credential (e.g., iris scan) without revealing it. A nullifier is a hash of the credential and a secret. A second registration produces the same nullifier, blocking duplicates. This saves up to 40% in gas compared to storing the credential on-chain.
ZK Proof: Input (private): iris_scan_hash, secret Input (public): world_tree_root, nullifier_hash Proves: iris_scan_hash in world_tree_root Nullifier = hash(iris_scan_hash, secret) Gas cost example for on-chain scoring
Calling updateActivityScore costs ~100k gas (~$0.20 at 20 gwei). This is acceptable for most scenarios.Our Process
- Requirements analysis — define which scenarios to protect (airdrop, voting, gating)
- Architecture design — select combination of signals and external integrations
- Development — write smart contracts (Solidity), frontend, tests
- Security audit — use Slither, Mythril, Echidna for fuzzing
- Deployment and monitoring — deploy to mainnet, configure Tenderly
Timeline and Deliverables
Developing a production system takes 6–12 weeks. Cost is individually calculated, but savings from prevented Sybil attacks are 10–50x the investment. Preventing one Sybil attack can save hundreds of thousands of dollars.
Deliverables:
- Architecture and design document
- Solidity smart contracts (ERC standards, scoring)
- Integration with Gitcoin Passport, PoH, BrightID, or Worldcoin
- Frontend for user scoring
- Unit tests and integration tests
- Documentation (API, contracts)
- 30 days of post-deployment support
Trust development to a team with 10+ years of blockchain experience. We have delivered 50+ projects on Ethereum, Polygon, Solana, and Arbitrum. Get a turnkey anti-sybil system — receive an engineer consultation.







