A robust, production-ready Clarity smart contract for creating and managing a decentralized oracle network on the Stacks blockchain. This contract enables multiple oracles to submit off-chain data, aggregates their submissions, and provides reliable on-chain data feeds.
The Decentralized Oracle Network allows trusted oracles to submit real-world data to the blockchain, which is then aggregated and made available to other smart contracts and users. The system uses median and average calculations to ensure data integrity and reduce the impact of malicious or faulty oracles.
- Registration with Staking: Oracles must stake a minimum amount of STX tokens to participate
- Reputation Tracking: Monitors oracle performance and submission accuracy
- Stake Management: Oracles can increase their stake or deactivate and withdraw
- Activity Monitoring: Tracks total submissions and correct submissions per oracle
- Custom Feeds: Create specialized data feeds with unique identifiers
- Multiple Data Types: Support for various data types (price feeds, weather, sports scores, etc.)
- Round-based Updates: Organized submission rounds for structured data collection
- Feed Lifecycle: Activate, deactivate, and reactivate feeds as needed
- Median Calculation: Primary aggregation method to filter outliers
- Average Calculation: Secondary metric for data analysis
- Minimum Oracle Requirement: Ensures sufficient data sources before finalization
- Timestamp Tracking: Records block height and timestamp for each submission
- Feed Subscriptions: Users can subscribe to specific data feeds
- Access Tracking: Monitors when subscribers last accessed feed data
- Easy Management: Simple subscribe/unsubscribe functions
- Stake Requirements: Prevents spam and ensures oracle commitment
- Duplicate Prevention: Blocks multiple submissions from same oracle per round
- Authorization Checks: Validates oracle status and feed activity
- Owner Controls: Admin functions restricted to contract owner
register-oracle(stake-amount)- Register as an oracle with minimum stakedeactivate-oracle()- Deactivate oracle status and withdraw stakeincrease-stake(additional-stake)- Add more stake to increase reputation
create-feed(feed-id, name, data-type)- Create a new data feeddeactivate-feed(feed-id)- Deactivate a feed (admin only)reactivate-feed(feed-id)- Reactivate a feed (admin only)
submit-data(feed-id, value)- Submit data for current roundfinalize-round(feed-id, oracle-list)- Aggregate submissions and finalize round
subscribe-to-feed(feed-id)- Subscribe to a data feedunsubscribe-from-feed(feed-id)- Unsubscribe from a feed
update-min-stake(new-stake)- Update minimum stake requirementupdate-min-oracles(new-min)- Update minimum oracles per roundupdate-validity-blocks(new-blocks)- Update data validity period
get-latest-data(feed-id)- Retrieve most recent aggregated dataget-historical-data(feed-id, round)- Get data from specific roundget-oracle-info(oracle)- Query oracle details and statisticsget-feed-info(feed-id)- Get feed configuration and metadataget-current-round(feed-id)- Check current round numberget-oracle-submission(feed-id, oracle, round)- View specific submissionis-data-fresh(feed-id)- Check if feed data is within validity periodget-network-stats()- Get overall network statisticsis-subscriber(feed-id, subscriber)- Check subscription status
- Minimum Stake: 1,000,000 microSTX (1 STX)
- Minimum Oracles Required: 3 oracles per round
- Data Validity Period: 144 blocks (~24 hours)
These parameters can be adjusted by the contract owner to optimize network performance.
(contract-call? .oracle-network register-oracle u1000000)(contract-call? .oracle-network create-feed "BTC-USD" "Bitcoin Price Feed" "price")(contract-call? .oracle-network submit-data "BTC-USD" 4500000)(contract-call? .oracle-network finalize-round "BTC-USD"
(list 'SP1... 'SP2... 'SP3...))(contract-call? .oracle-network get-latest-data "BTC-USD")- Oracle Registration: Oracles stake tokens and register with the network
- Feed Creation: Contract owner or authorized users create data feeds
- Data Submission: Multiple oracles submit values for current round
- Aggregation: After minimum oracles submit, round is finalized
- Data Access: Consumers read aggregated median and average values
- New Round: System advances to next round for fresh data
u100- Owner-only function called by non-owneru101- Caller is not a registered oracleu102- Oracle already existsu103- Insufficient stake amountu104- No data availableu105- Data is staleu106- Invalid feed IDu107- Minimum oracles not metu108- Already submitted in current roundu109- Unauthorized action
- Stake Slashing: Current version returns full stake on deactivation. Consider implementing slashing for malicious behavior
- Oracle Reputation: Reputation system is tracked but not enforced. Implement reputation-based rewards
- Data Validation: Add range checks and sanity tests for submitted values
- Time Delays: Consider adding delay periods for withdrawals
- Governance: Implement decentralized governance for parameter updates
- Always maintain minimum oracle count for reliable data
- Set appropriate validity periods based on data update frequency
- Monitor oracle performance and reputation regularly
- Subscribe to feeds before consuming data in production
- Verify data freshness before making critical decisions
- Use median values for resilience against outliers
- Weighted averages based on oracle reputation
- Automatic stake slashing for incorrect submissions
- Multi-signature feed management
- Oracle rewards distribution system
- Cross-chain data bridging
- Historical data archiving
- Dynamic fee structures
Test the contract thoroughly before mainnet deployment:
- Register multiple test oracles
- Submit varied data points
- Test edge cases (minimum oracles, invalid feeds)
- Verify aggregation calculations
- Test all error conditions
- Monitor gas costs