<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: rayQu</title>
    <description>The latest articles on Forem by rayQu (@rollingindo).</description>
    <link>https://forem.com/rollingindo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2700932%2Ff08a1667-4508-436f-82f9-75f307242ab5.png</url>
      <title>Forem: rayQu</title>
      <link>https://forem.com/rollingindo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/rollingindo"/>
    <language>en</language>
    <item>
      <title>Building a Confidential Sealed-Bid NFT Auction on Oasis Sapphire</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Fri, 20 Mar 2026 10:36:48 +0000</pubDate>
      <link>https://forem.com/rollingindo/building-a-confidential-sealed-bid-nft-auction-on-oasis-sapphire-j1m</link>
      <guid>https://forem.com/rollingindo/building-a-confidential-sealed-bid-nft-auction-on-oasis-sapphire-j1m</guid>
      <description>&lt;p&gt;Ever wanted to run a blockchain auction without revealing bids until the end?&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll build a sealed-bid NFT auction on Oasis Sapphire, where bids are fully encrypted, events are private, and the winner is publicly verifiable, perfect for NFT drops, private DeFi auctions, or confidential governance.&lt;/p&gt;

&lt;p&gt;We’ll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why Sapphire for privacy-first auctions&lt;/li&gt;
&lt;li&gt;Smart contract design for sealed-bid auctions&lt;/li&gt;
&lt;li&gt;Off-chain bid commitment and encryption&lt;/li&gt;
&lt;li&gt;Encrypted events on Sapphire&lt;/li&gt;
&lt;li&gt;React + ethers.js frontend integration&lt;/li&gt;
&lt;li&gt;Testing, deployment, and advanced tips&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end, you’ll have a production-ready privacy-preserving auction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: Why Privacy Matters on Blockchain Auctions
&lt;/h2&gt;

&lt;p&gt;Traditional Ethereum-style auctions expose bids as soon as they hit the blockchain. This causes issues like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Front-running attacks: Bots see your bid and immediately outbid you&lt;/li&gt;
&lt;li&gt;Loss of privacy: High-value bids are visible to competitors&lt;/li&gt;
&lt;li&gt;Manipulation risk: Public bids allow strategic manipulation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oasis Sapphire solves this by offering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confidential calldata: Input values are encrypted&lt;/li&gt;
&lt;li&gt;Encrypted events: Logs can be private but verifiable&lt;/li&gt;
&lt;li&gt;EVM compatibility: Solidity contracts work with minimal changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the result: You can build auctions where nobody knows your bid until reveal, yet the outcome is fully trustless.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐        submitBid(commitment)       ┌───────────────┐
│   Bidder A  │ ────────────────────────────────&amp;gt;  │  SealedAuction│
└─────────────┘                                    │ (encrypted)   │
┌─────────────┐        submitBid(commitment)       │               │
│   Bidder B  │ ────────────────────────────────&amp;gt;  │               │
└─────────────┘                                    └─────┬─────────┘
                                                      │
                                                      ▼
                                        ┌───────────────────────┐
                                        │ Reveal Phase          │
                                        │ - submit value+salt   │
                                        │ - verify commitment   │
                                        │ - determine winner    │
                                        └─────────┬─────────────┘
                                                  │
                                                  ▼
                                       ┌─────────────────────────┐
                                       │ Winner + Final Price    │
                                       │ (publicly verifiable)   │
                                       └─────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 2: Project Setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create Hardhat Project
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;sapphire-nft-auction
&lt;span class="nb"&gt;cd &lt;/span&gt;sapphire-nft-auction
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; hardhat @nomiclabs/hardhat-ethers ethereum-waffle chai
npm &lt;span class="nb"&gt;install&lt;/span&gt; @oasisprotocol/sapphire-paratime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Configure Hardhat for Sapphire Testnet
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@nomiclabs/hardhat-ethers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@oasisprotocol/sapphire-paratime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;solidity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.8.20&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;sapphire_testnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://testnet.sapphire.oasis.io&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23295&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PRIVATE_KEY&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// your testnet wallet&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure you fund your testnet wallet with some ROSE test tokens (&lt;a href="https://faucet.testnet.oasis.dev/" rel="noopener noreferrer"&gt;Testnet Faucet&lt;/a&gt;)&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 3: Smart Contract Architecture
&lt;/h2&gt;

&lt;p&gt;We’ll implement a sealed-bid auction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;submitBid&lt;/strong&gt;: Accepts encrypted bid commitments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reveal&lt;/strong&gt;: Checks commitments, reveals bids, determines winner&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;events&lt;/strong&gt;: Logs encrypted bid submissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create &lt;strong&gt;contracts/SealedAuction.sol&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;SPDX&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;License&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MIT&lt;/span&gt;
&lt;span class="n"&gt;pragma&lt;/span&gt; &lt;span class="n"&gt;solidity&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;contract&lt;/span&gt; &lt;span class="n"&gt;SealedAuction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Bid&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;bytes32&lt;/span&gt; &lt;span class="n"&gt;commitment&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;revealed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;winner&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;finalPrice&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Bid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;bids&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;biddingEnd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;revealEnd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="n"&gt;BidEncrypted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="n"&gt;indexed&lt;/span&gt; &lt;span class="n"&gt;bidder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bytes32&lt;/span&gt; &lt;span class="k"&gt;encrypted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="n"&gt;Revealed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="n"&gt;indexed&lt;/span&gt; &lt;span class="n"&gt;bidder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;_biddingTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;_revealTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;biddingEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;_biddingTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;revealEnd&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;biddingEnd&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;_revealTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;submitBid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes32&lt;/span&gt; &lt;span class="n"&gt;commitment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;external&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;biddingEnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"Bidding closed"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;bids&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Bid&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;commitment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;commitment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;revealed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;emit&lt;/span&gt; &lt;span class="n"&gt;BidEncrypted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;commitment&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;reveal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bytes32&lt;/span&gt; &lt;span class="n"&gt;salt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;external&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;biddingEnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"Reveal not started"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;revealEnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"Reveal ended"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;Bid&lt;/span&gt; &lt;span class="k"&gt;storage&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bids&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;commitment&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;keccak256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encodePacked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salt&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="nv"&gt;"Bad reveal"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;revealed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"Already revealed"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;revealed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;emit&lt;/span&gt; &lt;span class="n"&gt;Revealed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;finalPrice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;finalPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;winner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key points to keep in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only the hash of the bid is stored on-chain, not the bid itself.&lt;/li&gt;
&lt;li&gt;Bids remain private until reveal().&lt;/li&gt;
&lt;li&gt;Events can optionally be encrypted for extra confidentiality.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Part 4: Off-Chain Bid Commitment
&lt;/h2&gt;

&lt;p&gt;Before submitting a bid, you generate a commitment hash off-chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ethers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createCommitment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bidValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;salt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hexlify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;commitment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keccak256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultAbiCoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;uint256&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bytes32&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;bidValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;salt&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;commitment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;salt&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Example&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createCommitment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Commitment:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;commitment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Salt:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;salt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Salt prevents brute-force attacks on commitments&lt;/li&gt;
&lt;li&gt;The commitment hash is sent on-chain using submitBid()
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bidder Client
+-----------------+
| bidValue + salt |
+--------+--------+
         |
         | keccak256 -&amp;gt; commitment
         v
+-----------------+     encrypted calldata    +------------------------+
| submitBid()     | ------------------------&amp;gt; | SealedAuction Contract |
| (commitment)    |                           | stores only commitment |
+-----------------+                           |                        |
                                              +-----------+------------+
                                                          |
                                               encrypted event emitted
                                                          |
                                                          v
                                               Off-chain listener/frontend
                                               (decrypts if authorized)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 5: Submitting &amp;amp; Revealing Bids
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auctionContract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submitBid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;commitment&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Wait until bidding period ends&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auctionContract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reveal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bidValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;salt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Sapphire, you can use encrypted calldata so even miners/validators don’t see the bid during submission.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 6: Adding NFT Rewards
&lt;/h2&gt;

&lt;p&gt;Let’s take it a step further: the winner receives an NFT. Add this to your contract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;interface&lt;/span&gt; &lt;span class="n"&gt;IERC721&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;safeMint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;external&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;IERC721&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;rewardNFT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="n"&gt;_nft&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;rewardNFT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IERC721&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_nft&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="k"&gt;After&lt;/span&gt; &lt;span class="n"&gt;reveal&lt;/span&gt; &lt;span class="n"&gt;ends&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;distributeNFT&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;external&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;revealEnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"Reveal not ended"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;winner&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;"No winner yet"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;rewardNFT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;safeMint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;winner&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 7: Encrypted Events on Sapphire (Advanced)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="n"&gt;EncryptedBid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="n"&gt;indexed&lt;/span&gt; &lt;span class="n"&gt;bidder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bytes32&lt;/span&gt; &lt;span class="n"&gt;encryptedData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="n"&gt;ciphertext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Sapphire&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encodePacked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bidValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salt&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;emit&lt;/span&gt; &lt;span class="n"&gt;EncryptedBid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ciphertext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Only the bidder can decrypt the event off-chain&lt;/li&gt;
&lt;li&gt;Useful for building off-chain bid monitoring tools without revealing bids publicly&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Part 8: Frontend Integration (React + ethers.js)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Generate bid commitment in React form&lt;/li&gt;
&lt;li&gt;Call submitBid(commitment) on click&lt;/li&gt;
&lt;li&gt;Reveal after auction ends&lt;/li&gt;
&lt;li&gt;Optional: use encrypted events to show notifications without revealing bid amounts
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createCommitment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auctionContract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submitBid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;commitment&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add a timer for bidding and reveal periods&lt;/li&gt;
&lt;li&gt;Use ethers.js and MetaMask for transactions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Part 9: Hardhat Testing
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;chai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SealedAuction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;accepts bids and picks winner correctly&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSigners&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Auction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContractFactory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SealedAuction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;auction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Auction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bidA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1001salt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bidB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2002salt2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submitBid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bidA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submitBid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bidB&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;evm_increaseTime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reveal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;formatBytes32String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;salt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reveal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;formatBytes32String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;salt2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;winner&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;finalPrice&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2002&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 10: Deploying to Sapphire Testnet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx hardhat run scripts/deploy.js &lt;span class="nt"&gt;--network&lt;/span&gt; sapphire_testnet

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Auction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContractFactory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SealedAuction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;auction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Auction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;auction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deployed&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Auction deployed at&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;auction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 11: Next-Level Ideas you could implement
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Build a full frontend auction dApp&lt;/li&gt;
&lt;li&gt;Integrate off-chain listeners for encrypted events&lt;/li&gt;
&lt;li&gt;Add ZK proofs for bid fairness without revealing bids&lt;/li&gt;
&lt;li&gt;Support multi-item auctions or batch NFT rewards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You now have a fully functional, privacy-preserving NFT auction on Oasis Sapphire. Bids are private, events can be private, and the winner is verifiable. Perfect for real-world confidential DeFi and NFT applications!&lt;/p&gt;

</description>
      <category>nft</category>
      <category>privacy</category>
      <category>tutorial</category>
      <category>web3</category>
    </item>
    <item>
      <title>Building a Privacy-Preserving AI Oracle on Oasis Sapphire</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Fri, 13 Mar 2026 08:41:00 +0000</pubDate>
      <link>https://forem.com/rollingindo/building-a-privacy-preserving-ai-oracle-on-oasis-sapphire-1ibd</link>
      <guid>https://forem.com/rollingindo/building-a-privacy-preserving-ai-oracle-on-oasis-sapphire-1ibd</guid>
      <description>&lt;p&gt;Recently, I built a &lt;a href="https://dev.to/rollingindo/building-a-cross-chain-confidential-trust-score-oracle-with-oasis-sapphire-opl-rofl-39n8"&gt;cross-chain confidential Trust Score Oracle using Sapphire ParaTime&lt;/a&gt;, Oasis Privacy Layer, and ROFL on the Oasis Network. That project focused on computing a reputation score across multiple blockchains while keeping the scoring logic private.&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll explore a different but related use case: building a privacy-preserving AI inference oracle.&lt;/p&gt;

&lt;p&gt;Instead of calculating a trust score from on-chain activity, we will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run an AI model privately&lt;/li&gt;
&lt;li&gt;process sensitive user data&lt;/li&gt;
&lt;li&gt;return verifiable results on-chain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern is extremely useful for applications like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;private credit scoring&lt;/li&gt;
&lt;li&gt;confidential trading signals&lt;/li&gt;
&lt;li&gt;healthcare ML analytics&lt;/li&gt;
&lt;li&gt;AI-powered DeFi risk models&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Privacy Matters for AI on Blockchain
&lt;/h2&gt;

&lt;p&gt;Most blockchains are fully transparent. Every transaction and input is publicly visible.&lt;/p&gt;

&lt;p&gt;That creates a major problem for AI applications.&lt;/p&gt;

&lt;p&gt;Example: a credit scoring system.&lt;/p&gt;

&lt;p&gt;Inputs might include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;income&lt;/li&gt;
&lt;li&gt;transaction history&lt;/li&gt;
&lt;li&gt;loan repayment data&lt;/li&gt;
&lt;li&gt;identity attributes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this can safely be published on a public blockchain.&lt;/p&gt;

&lt;p&gt;This is where the confidential compute model of Oasis Network becomes powerful.&lt;/p&gt;

&lt;p&gt;It allows smart contracts to execute encrypted computations inside secure enclaves.&lt;/p&gt;




&lt;h2&gt;
  
  
  Oasis Network Architecture
&lt;/h2&gt;

&lt;p&gt;The Oasis architecture separates consensus from computation, which allows specialized runtimes for different workloads.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------------------------------------+
|                 Applications                   |
+------------------------------------------------+
|                ParaTime Layer                  |
|------------------------------------------------|
|  Sapphire (Confidential EVM)                   |
|  Emerald (EVM Compatible)                      |
|  Custom Runtimes                               |
+------------------------------------------------+
|              Consensus Layer                   |
|           Proof-of-Stake Validators            |
+------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this tutorial we use Sapphire ParaTime, which provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EVM compatibility&lt;/li&gt;
&lt;li&gt;encrypted state&lt;/li&gt;
&lt;li&gt;confidential smart contracts&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What We Will Build
&lt;/h2&gt;

&lt;p&gt;We will build a Confidential AI Oracle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Confidential AI Oracle System

       +-------------------+
       |   User Wallet     |
       | (encrypted data)  |
       +---------+---------+
                 |
                 v
        +---------------------+
        | Sapphire Smart      |
        | Contract            |
        | (confidential EVM)  |
        +---------+-----------+
                  |
                  v
        +---------------------+
        | ROFL Oracle Worker  |
        |---------------------|
        | Secure Enclave      |
        | AI Model Inference  |
        +---------+-----------+
                  |
                  v
        +---------------------+
        | Signed Result       |
        | returned on-chain   |
        +---------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Receive encrypted user data&lt;/li&gt;
&lt;li&gt;Run an AI model inside a secure environment&lt;/li&gt;
&lt;li&gt;Produce a prediction&lt;/li&gt;
&lt;li&gt;Store only the result on-chain&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  High-Level Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Wallet
     |
     v
Encrypted Data
     |
     v
Sapphire Smart Contract
     |
     v
ROFL Worker
     |
     v
AI Model Inference
     |
     v
Signed Result
     |
     v
Smart Contract Storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Real Use Case: Private Credit Scoring
&lt;/h2&gt;

&lt;p&gt;Imagine a DeFi lending protocol.&lt;/p&gt;

&lt;p&gt;It wants to compute a credit score before issuing a loan.&lt;/p&gt;

&lt;p&gt;But the borrower’s financial data must remain private.&lt;/p&gt;

&lt;p&gt;Traditional blockchain flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User -&amp;gt; Smart Contract -&amp;gt; Public Data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everyone can see the input.&lt;/p&gt;

&lt;p&gt;With confidential computation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Data (encrypted)
        |
        v
Confidential Runtime
        |
        v
AI Model
        |
        v
Credit Score Result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only the result is visible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project Repository Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;oasis-private-ai-oracle/

contracts/
  CreditOracle.sol

oracle/
  worker.py
  model.py
  enclave_runner.py

scripts/
  deploy.js

frontend/
  submit-data.ts

README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Smart Contract (Sapphire)
&lt;/h2&gt;

&lt;p&gt;Example confidential oracle contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// SPDX-License-Identifier: MIT&lt;/span&gt;
&lt;span class="nx"&gt;pragma&lt;/span&gt; &lt;span class="nx"&gt;solidity&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;contract&lt;/span&gt; &lt;span class="nx"&gt;CreditOracle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;oracle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;struct&lt;/span&gt; &lt;span class="nx"&gt;ScoreRecord&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ScoreRecord&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="nc"&gt;ScoreUpdated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="nx"&gt;indexed&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="nx"&gt;_oracle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;oracle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_oracle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;submitScore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;bytes&lt;/span&gt; &lt;span class="nx"&gt;calldata&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;external&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;invalid signature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nx"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ScoreRecord&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="nx"&gt;emit&lt;/span&gt; &lt;span class="nc"&gt;ScoreUpdated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;uint256&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;bytes&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;internal&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nf"&gt;returns &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="nx"&gt;bytes32&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;keccak256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nx"&gt;abi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encodePacked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nx"&gt;bytes32&lt;/span&gt; &lt;span class="nx"&gt;ethSigned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;keccak256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nx"&gt;abi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encodePacked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;x19Ethereum Signed Message:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;32&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nx"&gt;message&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bytes32&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bytes32&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uint8&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;splitSignature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="nx"&gt;recovered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ecrecover&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ethSigned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;recovered&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;oracle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;splitSignature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bytes&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt; &lt;span class="nx"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nx"&gt;internal&lt;/span&gt;
        &lt;span class="nx"&gt;pure&lt;/span&gt;
        &lt;span class="nf"&gt;returns &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bytes32&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bytes32&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uint8&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;invalid signature length&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nx"&gt;assembly&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nl"&gt;r&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;mload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;96&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;verifies oracle signatures&lt;/li&gt;
&lt;li&gt;prevents tampering&lt;/li&gt;
&lt;li&gt;stores final scores&lt;/li&gt;
&lt;li&gt;event logging&lt;/li&gt;
&lt;li&gt;timestamped scores&lt;/li&gt;
&lt;li&gt;full signature verification&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Oracle Worker
&lt;/h2&gt;

&lt;p&gt;The oracle runs the AI model and signs the result.&lt;/p&gt;

&lt;p&gt;Example Python worker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;web3&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Web3&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;predict_score&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;eth_account&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;

&lt;span class="n"&gt;RPC_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://sapphire.oasis.io&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;PRIVATE_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_ORACLE_PRIVATE_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;contract_address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DEPLOYED_CONTRACT_ADDRESS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;contract_abi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CreditOracleABI.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;w3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Web3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Web3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;HTTPProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RPC_URL&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PRIVATE_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;contract&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;w3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;contract_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;abi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;contract_abi&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_oracle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;predict_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Web3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;solidity_keccak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;address&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uint256&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;user_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;signed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Web3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_hash_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;functions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submitScore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;user_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;signed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;build_transaction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nonce&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;w3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_transaction_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="n"&gt;signed_tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;w3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign_transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PRIVATE_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;tx_hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;w3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_raw_transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signed_tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rawTransaction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tx_hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a real deployment this worker would run inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a secure enclave&lt;/li&gt;
&lt;li&gt;confidential compute environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;computes the AI score&lt;/li&gt;
&lt;li&gt;signs it&lt;/li&gt;
&lt;li&gt;sends a transaction on-chain&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Example AI Model
&lt;/h2&gt;

&lt;p&gt;A simplified scoring function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;max_value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;predict_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;income&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;income&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;debt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;debt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;history&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;income&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;debt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;
        &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It does some real feature normalization and gives realistic scoring output&lt;/p&gt;

&lt;p&gt;In production you could replace this with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;XGBoost&lt;/li&gt;
&lt;li&gt;LightGBM&lt;/li&gt;
&lt;li&gt;neural networks&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;p&gt;Install development tools&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; hardhat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure Sapphire network&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;sapphire&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://sapphire.oasis.io&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23294&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy contract&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx hardhat run scripts/deploy.js &lt;span class="nt"&gt;--network&lt;/span&gt; sapphire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  End-to-End Flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User submits encrypted data
        |
        v
Oracle decrypts inside secure compute
        |
        v
AI model runs prediction
        |
        v
Oracle signs result
        |
        v
Smart contract stores score
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why This Architecture Is Powerful
&lt;/h2&gt;

&lt;p&gt;Without privacy infrastructure, AI + blockchain rarely works because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;training data is private&lt;/li&gt;
&lt;li&gt;models are proprietary&lt;/li&gt;
&lt;li&gt;inputs contain sensitive information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using confidential runtimes on Oasis Network enables a new class of applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;private DeFi analytics&lt;/li&gt;
&lt;li&gt;confidential AI marketplaces&lt;/li&gt;
&lt;li&gt;encrypted healthcare ML&lt;/li&gt;
&lt;li&gt;secure financial scoring&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Possible next additions
&lt;/h2&gt;

&lt;p&gt;Possible extensions to this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add zero-knowledge proofs for inference&lt;/li&gt;
&lt;li&gt;build a data marketplace&lt;/li&gt;
&lt;li&gt;enable federated learning&lt;/li&gt;
&lt;li&gt;create private trading signals&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The combination of blockchain verification and confidential computation unlocks entirely new types of applications.&lt;/p&gt;

&lt;p&gt;With runtimes like Sapphire ParaTime on the Oasis Network, developers can build systems where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data remains private&lt;/li&gt;
&lt;li&gt;computation is verifiable&lt;/li&gt;
&lt;li&gt;results are trustless&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This opens the door to privacy-first AI in Web3.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>privacy</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building a Cross-Chain Confidential "Trust Score Oracle" with Oasis Sapphire + OPL + ROFL</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Sun, 22 Feb 2026 08:15:46 +0000</pubDate>
      <link>https://forem.com/rollingindo/building-a-cross-chain-confidential-trust-score-oracle-with-oasis-sapphire-opl-rofl-39n8</link>
      <guid>https://forem.com/rollingindo/building-a-cross-chain-confidential-trust-score-oracle-with-oasis-sapphire-opl-rofl-39n8</guid>
      <description>&lt;p&gt;This tutorial shows how to add privacy + verifiable off-chain compute to any EVM dApp by combining:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sapphire: Oasis’ confidential EVM (encrypted calldata + confidential contract state).&lt;/li&gt;
&lt;li&gt;OPL (Oasis Privacy Layer): message bridge pattern to “bolt privacy onto” existing EVM apps by offloading sensitive logic to Sapphire.&lt;/li&gt;
&lt;li&gt;ROFL (Runtime Off-Chain Logic): a TEE-managed app runtime (containers or single binaries) with secrets stored via built-in KMS and on-chain management through Sapphire.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real use case
&lt;/h2&gt;

&lt;p&gt;You run a lending/access-control dApp on a Home chain (Ethereum/L2). You want a wallet "Trust Score" derived from sensitive signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;private allowlists (KYC provider, internal risk flags),&lt;/li&gt;
&lt;li&gt;off-chain identity reputation (GitHub activity, paid subscription, enterprise customer),&lt;/li&gt;
&lt;li&gt;model inference results (fraud classifier).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t want to leak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;raw signals,&lt;/li&gt;
&lt;li&gt;model features,&lt;/li&gt;
&lt;li&gt;user identity mappings,&lt;/li&gt;
&lt;li&gt;or scoring logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Design goal:&lt;br&gt;
Home chain contract gets a public, verifiable decision (e.g., score bucket/allow/deny/rate tier) while sensitive scoring happens privately and verifiably.&lt;/p&gt;
&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;High-level diagram&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzrg6fopnb48s2t90ccej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzrg6fopnb48s2t90ccej.png" alt=" " width="800" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What each piece does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Home chain contract&lt;/strong&gt;: minimal "public" state, accepts final decision and enforces it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sapphire contract&lt;/strong&gt; (the enclave): holds private state (scores, salts, user-to-signal mappings), verifies authorized sources, emits public commitments only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ROFL app&lt;/strong&gt;: runs your scoring code in a TEE; keeps API keys/model weights/feature rules in ROFL secrets; posts updates on-chain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ROFL apps are explicitly designed to run in TEEs and be managed via Sapphire, with built-in secrets support.&lt;/p&gt;
&lt;h2&gt;
  
  
  Repo blueprint
&lt;/h2&gt;

&lt;p&gt;Monorepo layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;oasis-trustscore-oracle/
  README.md
  .env.example

  contracts/
    hardhat.config.ts
    package.json
    contracts/
      HomeHost.sol
      SapphireEnclave.sol
    scripts/
      deploy-home.ts
      deploy-sapphire.ts
      link-endpoints.ts
    tasks/
      send-opl-message.ts

  rofl/
    compose.yaml
    rofl.yaml
    app/
      Dockerfile
      requirements.txt
      main.py
      scorer.py
      signals.py

  diagrams/
    architecture.mmd
    sequence.mmd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Networks &amp;amp; prerequisites
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sapphire Testnet settings (for dev)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From Oasis docs, Sapphire Testnet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RPC: &lt;a href="https://testnet.sapphire.oasis.io" rel="noopener noreferrer"&gt;https://testnet.sapphire.oasis.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Chain ID (decimal): 23295&lt;/li&gt;
&lt;li&gt;WSS: wss://testnet.sapphire.oasis.io/ws&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll also want the Sapphire wrapper for encrypted transactions (TS wrapper / ethers v6 wrapper).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ROFL prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ROFL quickstart expects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a containerized app (OCI image),&lt;/li&gt;
&lt;li&gt;Oasis CLI (latest),&lt;/li&gt;
&lt;li&gt;testnet tokens from the faucet&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1 - Smart contracts: Home chain + Sapphire enclave
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1A) SapphireEnclave.sol (runs confidentially)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This contract runs on Sapphire and receives cross-chain requests via OPL. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stores scores privately,&lt;/li&gt;
&lt;li&gt;accepts updates from ROFL,&lt;/li&gt;
&lt;li&gt;sends a public decision back to Home chain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Minimal skeleton based on the official OPL SDK pattern (Enclave + endpoints)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// contracts/contracts/SapphireEnclave.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import {Enclave, Result, autoswitch} from "@oasisprotocol/sapphire-contracts/contracts/OPL.sol";

contract SapphireEnclave is Enclave {
    // Private by design on Sapphire: state + calldata are confidential.
    mapping(address =&amp;gt; uint256) private score; // example: 0..100

    // Optional: authorize a ROFL app address (or a set of them).
    address public roflUpdater;

    constructor(address homeContract, string memory homeChain)
        Enclave(homeContract, autoswitch(homeChain))
    {
        registerEndpoint("requestScore", onRequestScore);
    }

    function setRoflUpdater(address _rofl) external {
        // replace with proper access control for real deployments
        roflUpdater = _rofl;
    }

    // ROFL posts score updates (confidential write).
    function updateScore(address user, uint256 newScore) external returns (bool) {
        require(msg.sender == roflUpdater, "not authorized");
        score[user] = newScore;
        return true;
    }

    // OPL endpoint: called when Home chain requests a score decision.
    function onRequestScore(bytes calldata args) internal returns (Result) {
        address user = abi.decode(args, (address));

        uint256 s = score[user];

        // Only return a coarse bucket publicly (avoid leaking exact score).
        uint8 bucket =
            s &amp;gt;= 80 ? 3 :
            s &amp;gt;= 50 ? 2 :
            s &amp;gt;= 20 ? 1 : 0;

        // Send decision back to Home chain (publicly observable).
        postMessage("scoreDecision", abi.encode(user, bucket));
        return Result.Success;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sapphire is an EVM ParaTime built for confidential computation.&lt;/li&gt;
&lt;li&gt;OPL uses message bridges so your Home chain can trigger private computation on Sapphire.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;1B) HomeHost.sol (your existing dApp stays here)&lt;/strong&gt;&lt;br&gt;
Based on official OPL Host pattern.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// contracts/contracts/HomeHost.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import {Host, Result} from "@oasisprotocol/sapphire-contracts/contracts/OPL.sol";

contract HomeHost is Host {
    mapping(address =&amp;gt; uint8) public lastBucket;

    constructor(address sapphireContract) Host(sapphireContract) {
        registerEndpoint("scoreDecision", onScoreDecision);
    }

    // User or app requests a score check.
    function requestScore(address user) external payable {
        postMessage("requestScore", abi.encode(user));
    }

    // Called by OPL bridge after Sapphire computed the decision.
    function onScoreDecision(bytes calldata args) internal returns (Result) {
        (address user, uint8 bucket) = abi.decode(args, (address, uint8));
        lastBucket[user] = bucket;
        return Result.Success;
    }

    function canBorrow(address user) external view returns (bool) {
        return lastBucket[user] &amp;gt;= 2;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2 - Hardhat setup (with Sapphire encryption)
&lt;/h2&gt;

&lt;p&gt;Install the OPL/Sapphire contracts library and Sapphire tooling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OPL SDK lives in @oasisprotocol/sapphire-contracts.&lt;/li&gt;
&lt;li&gt;Sapphire wrapper guidance (TypeScript wrapper / ethers wrapper).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your &lt;strong&gt;hardhat.config.ts&lt;/strong&gt; should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Home chain network (your choice),&lt;/li&gt;
&lt;li&gt;Sapphire testnet using the official RPC and chain id&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example network params:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// contracts/hardhat.config.ts (snippet)
networks: {
  sapphire_testnet: {
    url: "https://testnet.sapphire.oasis.io",
    chainId: 23295,
    accounts: [process.env.PRIVATE_KEY!],
  },
  // home: { ... } // e.g. sepolia/arbitrum etc.
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 - Link OPL endpoints (the "wiring")
&lt;/h2&gt;

&lt;p&gt;OPL requires that each side knows the other side and which endpoints exist (1–1 paired contracts).&lt;/p&gt;

&lt;p&gt;In your scripts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deploy SapphireEnclave on Sapphire&lt;/li&gt;
&lt;li&gt;deploy HomeHost on Home chain&lt;/li&gt;
&lt;li&gt;set each other’s address + register endpoints appropriately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Exactly how you do step (3) depends on your preferred OPL bridge route; the docs list multiple integration methods, including OPL SDK wrapper around Celer IM.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 - ROFL app: compute score inside a TEE and push to Sapphire
&lt;/h2&gt;

&lt;p&gt;ROFL gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TEE execution (SGX/TDX)&lt;/li&gt;
&lt;li&gt;app lifecycle managed via Oasis&lt;/li&gt;
&lt;li&gt;built-in secrets stored on-chain and injected securely&lt;/li&gt;
&lt;li&gt;ability to sign and submit special transactions back to Sapphire&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ROFL gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TEE execution (SGX/TDX)&lt;/li&gt;
&lt;li&gt;app lifecycle managed via Oasis&lt;/li&gt;
&lt;li&gt;built-in secrets stored on-chain and injected securely&lt;/li&gt;
&lt;li&gt;ability to sign and submit special transactions back to Sapphire&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4A) ROFL app code (Python example)&lt;/strong&gt;&lt;br&gt;
rofl/app/main.py:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;loads secrets (API keys)&lt;/li&gt;
&lt;li&gt;fetches signals&lt;/li&gt;
&lt;li&gt;runs scoring&lt;/li&gt;
&lt;li&gt;calls updateScore(user, score) on Sapphire
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# rofl/app/main.py
import os
import time
from web3 import Web3

SAPPHIRE_RPC = os.environ["SAPPHIRE_RPC"]
ENCLAVE_ADDR = Web3.to_checksum_address(os.environ["ENCLAVE_ADDR"])
ROFL_SIGNER_KEY = os.environ["ROFL_SIGNER_KEY"]  # stored as ROFL secret

ABI = [...]  # contract ABI for updateScore

w3 = Web3(Web3.HTTPProvider(SAPPHIRE_RPC))
acct = w3.eth.account.from_key(ROFL_SIGNER_KEY)
enclave = w3.eth.contract(address=ENCLAVE_ADDR, abi=ABI)

def compute_score(user: str) -&amp;gt; int:
    # pull private signals using secrets (tokens), then score
    # keep it deterministic if you want auditability
    return 82

def submit_score(user: str, s: int):
    tx = enclave.functions.updateScore(Web3.to_checksum_address(user), s).build_transaction({
        "from": acct.address,
        "nonce": w3.eth.get_transaction_count(acct.address),
        "gas": 500_000,
    })
    signed = acct.sign_transaction(tx)
    return w3.eth.send_raw_transaction(signed.rawTransaction)

def main():
    users = os.environ["USERS"].split(",")
    while True:
        for u in users:
            s = compute_score(u)
            txh = submit_score(u, s)
            print("updated", u, s, txh.hex())
        time.sleep(60)

if __name__ == "__main__":
    main()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;4B) Containerize + ROFLize&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ROFL quickstart is literally the flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;oasis rofl init&lt;/li&gt;
&lt;li&gt;oasis rofl create --network testnet&lt;/li&gt;
&lt;li&gt;oasis rofl build &lt;/li&gt;
&lt;li&gt;oasis rofl secret set ...&lt;/li&gt;
&lt;li&gt;oasis rofl update&lt;/li&gt;
&lt;li&gt;oasis rofl deploy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example secrets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# inside rofl/
echo -n "0xYOUR_SIGNER_KEY" | oasis rofl secret set ROFL_SIGNER_KEY -
echo -n "https://testnet.sapphire.oasis.io" | oasis rofl secret set SAPPHIRE_RPC -
echo -n "0xYourEnclaveAddress" | oasis rofl secret set ENCLAVE_ADDR -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ROFL secrets are explicitly supported and meant for sensitive env vars like API keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sequence diagram (end-to-end)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frv67pfn3fo40rlsbioam.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frv67pfn3fo40rlsbioam.png" alt=" " width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the core pattern: public app stays on its chain, sensitive logic runs confidentially, and you only export a minimal decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Threat model notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Don’t export raw scores: export buckets, booleans, or commitments.&lt;/li&gt;
&lt;li&gt;Secrets: keep API keys/model access tokens in ROFL secrets (not in Docker image).&lt;/li&gt;
&lt;li&gt;RPC trust: Oasis docs explicitly warn RPC endpoints are a trust point (rate limits, censorship, MITM); run your own if your security bar is high.&lt;/li&gt;
&lt;li&gt;Testnet disclaimer: Sapphire testnet confidentiality is not guaranteed and state may be wiped; treat it as public.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io/build/sapphire/" rel="noopener noreferrer"&gt;Sapphire overview + dev entrypoint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io/build/sapphire/network/" rel="noopener noreferrer"&gt;Sapphire network info (RPC + chain IDs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io/build/opl/" rel="noopener noreferrer"&gt;OPL overview + message bridge options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io/build/opl/opl-sdk/" rel="noopener noreferrer"&gt;OPL SDK contract examples (Enclave/Host, endpoints, postMessage)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io/build/rofl/" rel="noopener noreferrer"&gt;ROFL overview + quickstart steps + workflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>blockchain</category>
      <category>confidentiality</category>
      <category>privacy</category>
      <category>web3</category>
    </item>
    <item>
      <title>Building a Confidential Web3 Application with Oasis</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Thu, 19 Feb 2026 09:17:40 +0000</pubDate>
      <link>https://forem.com/rollingindo/building-a-confidential-web3-application-with-oasis-5c27</link>
      <guid>https://forem.com/rollingindo/building-a-confidential-web3-application-with-oasis-5c27</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Web3 applications increasingly need reputation, risk scoring, and trust signals.&lt;/p&gt;

&lt;p&gt;However, current solutions have a major issue:&lt;/p&gt;

&lt;p&gt;• Reputation systems expose user data publicly&lt;br&gt;
• Credit/risk models require sending sensitive data to centralized servers&lt;br&gt;
• Wallet analytics often reveal full transaction history&lt;br&gt;
• AI scoring pipelines break user privacy&lt;/p&gt;

&lt;p&gt;This creates a trade-off between &lt;strong&gt;useful intelligence&lt;/strong&gt; and &lt;strong&gt;data confidentiality&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal of this project was to remove that trade-off.&lt;/p&gt;




&lt;h2&gt;
  
  
  PrivateAI Oracle
&lt;/h2&gt;

&lt;p&gt;A privacy-preserving trust scoring system that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Collects wallet or activity signals&lt;/li&gt;
&lt;li&gt;Runs an AI-based trust evaluation off-chain&lt;/li&gt;
&lt;li&gt;Produces a verifiable score&lt;/li&gt;
&lt;li&gt;Stores proof/commitment on Oasis confidential smart contracts&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The system allows applications to query a user's trust score &lt;strong&gt;without revealing the underlying private data used to compute it&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Oasis Network
&lt;/h2&gt;

&lt;p&gt;This architecture relies on Oasis confidential computing features.&lt;/p&gt;

&lt;p&gt;Using &lt;strong&gt;Sapphire (confidential EVM runtime)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sensitive inputs remain encrypted&lt;/li&gt;
&lt;li&gt;Smart contract state is confidential when required&lt;/li&gt;
&lt;li&gt;Only final outputs are selectively revealed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes Oasis ideal for AI + blockchain workflows involving private datasets.&lt;/p&gt;

&lt;p&gt;Traditional public chains would expose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model inputs&lt;/li&gt;
&lt;li&gt;intermediate scoring logic&lt;/li&gt;
&lt;li&gt;sensitive user metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oasis prevents this.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The system consists of three main components:&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Collection Layer
&lt;/h3&gt;

&lt;p&gt;Collects public or permissioned signals such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wallet activity patterns&lt;/li&gt;
&lt;li&gt;GitHub contribution signals&lt;/li&gt;
&lt;li&gt;behavioral indicators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only necessary features are extracted.&lt;/p&gt;




&lt;h3&gt;
  
  
  Off-Chain AI Inference Engine
&lt;/h3&gt;

&lt;p&gt;A machine learning model computes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a normalized trust score&lt;/li&gt;
&lt;li&gt;optional confidence level&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The raw feature data never needs to be publicly stored on-chain.&lt;/p&gt;




&lt;h3&gt;
  
  
  Oasis Confidential Smart Contract
&lt;/h3&gt;

&lt;p&gt;The contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;receives a signed result&lt;/li&gt;
&lt;li&gt;records a commitment hash&lt;/li&gt;
&lt;li&gt;allows verification of authenticity&lt;/li&gt;
&lt;li&gt;exposes only the final trust score&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This preserves verifiability while protecting user privacy.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Enables
&lt;/h2&gt;

&lt;p&gt;PrivateAI Oracle can be used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DeFi borrower trust scoring without exposing full history&lt;/li&gt;
&lt;li&gt;DAO contributor reputation without revealing private activity&lt;/li&gt;
&lt;li&gt;sybil-resistant onboarding systems&lt;/li&gt;
&lt;li&gt;Privacy-preserving AI reputation layers&lt;/li&gt;
&lt;li&gt;Secure Web3 identity primitives&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Technical Takeaways
&lt;/h2&gt;

&lt;p&gt;During development, several important lessons emerged:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confidential smart contracts change how data pipelines must be designed&lt;/li&gt;
&lt;li&gt;AI outputs should be treated as attestations, not raw datasets&lt;/li&gt;
&lt;li&gt;Privacy must be built into architecture, not added later&lt;/li&gt;
&lt;li&gt;Hybrid off-chain compute + on-chain proof is extremely powerful&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;The final prototype demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;End-to-end confidential trust scoring&lt;/li&gt;
&lt;li&gt;AI inference integrated with Oasis smart contracts&lt;/li&gt;
&lt;li&gt;Selective transparency (score visible, data hidden)&lt;/li&gt;
&lt;li&gt;Practical architecture for privacy-preserving Web3 intelligence&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Future Implementations that could help
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Zero-knowledge proof integration for stronger verification&lt;/li&gt;
&lt;li&gt;Multi-model scoring pipelines&lt;/li&gt;
&lt;li&gt;public demo UI&lt;/li&gt;
&lt;li&gt;Integration with lending or DAO onboarding flows&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Web3 does not just need decentralization.&lt;/p&gt;

&lt;p&gt;It needs &lt;strong&gt;private, verifiable intelligence&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;PrivateAI Oracle explores how Oasis confidential computing can enable exactly that.&lt;/p&gt;

</description>
      <category>ethics</category>
      <category>networksec</category>
      <category>news</category>
      <category>tools</category>
    </item>
    <item>
      <title>Confidential Smart Contracts with Oasis Sapphire</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Mon, 16 Feb 2026 08:01:37 +0000</pubDate>
      <link>https://forem.com/rollingindo/confidential-smart-contracts-with-oasis-sapphire-4nk2</link>
      <guid>https://forem.com/rollingindo/confidential-smart-contracts-with-oasis-sapphire-4nk2</guid>
      <description>&lt;p&gt;Many Web3 apps still face the same structural problem. Public blockchains are transparent by default, which is great for verification but terrible for anything that requires secrecy, protected data, or private logic. Auctions leak bids, games leak strategy, AI agents leak prompts, and business workflows leak sensitive inputs.&lt;/p&gt;

&lt;p&gt;Oasis Network addresses this by adding a confidential execution layer to the familiar EVM model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Oasis does differently
&lt;/h2&gt;

&lt;p&gt;Oasis separates consensus from execution and allows specialized runtimes called ParaTimes. One of these runtimes, Sapphire, is a confidential EVM designed for privacy preserving smart contracts.&lt;/p&gt;

&lt;p&gt;Developers still write Solidity. They still use &lt;strong&gt;Hardhat **or **Foundry&lt;/strong&gt;. Deployment feels like any other EVM chain.&lt;/p&gt;

&lt;p&gt;The key difference is that contract state, calldata, and execution are encrypted and processed inside trusted execution environments. Validators cannot read plaintext inputs or storage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5sppwizoy4avqpp3z09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg5sppwizoy4avqpp3z09.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This turns privacy from an application level workaround into a native runtime feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters in practice
&lt;/h2&gt;

&lt;p&gt;Confidential execution unlocks use cases that are fragile or impossible on fully public chains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sealed bid auctions where bids stay hidden until reveal&lt;/li&gt;
&lt;li&gt;Onchain games with hidden state&lt;/li&gt;
&lt;li&gt;Private DAO voting with verifiable results&lt;/li&gt;
&lt;li&gt;AI agents whose strategies and prompts must remain secret&lt;/li&gt;
&lt;li&gt;Enterprise workflows that need verifiable execution without exposing documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of trying to hide data offchain and only posting final results, the sensitive logic itself can run onchain while remaining confidential.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dev experience
&lt;/h2&gt;

&lt;p&gt;One of the strongest points is that Sapphire does not require learning a new programming language or cryptographic framework.&lt;/p&gt;

&lt;p&gt;A normal Solidity contract like a counter or registry becomes confidential automatically when deployed to Sapphire. Private variables are not just compiler hints. Storage and transaction inputs are encrypted at runtime.&lt;/p&gt;

&lt;p&gt;A typical workflow looks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure Sapphire RPC in MetaMask&lt;/li&gt;
&lt;li&gt;Fund wallet via the testnet faucet&lt;/li&gt;
&lt;li&gt;Create a standard Hardhat project&lt;/li&gt;
&lt;li&gt;Install the Sapphire helper plugin&lt;/li&gt;
&lt;li&gt;Deploy Solidity contracts normally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From there, transaction calldata is encrypted locally and only decrypted inside the runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Positioning in the ecosystem
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://oasisprotocol.org/blog" rel="noopener noreferrer"&gt;Oasis&lt;/a&gt; works well as a confidential coprocessor rather than a replacement chain.&lt;/p&gt;

&lt;p&gt;Public settlement, liquidity, and composability can remain on Ethereum or L2s. Sensitive computation, private registries, hidden metadata, or sealed commitments can run on Sapphire. Results can then be bridged or proven back to public chains.&lt;/p&gt;

&lt;p&gt;This hybrid model lets builders keep transparency where they want it and add privacy where they need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current direction
&lt;/h2&gt;

&lt;p&gt;The Oasis ecosystem is increasingly focused on privacy for AI, data marketplaces, and confidential DeFi. Sapphire is already live and usable today, which makes it one of the few production confidential EVM environments rather than a research concept.&lt;/p&gt;

&lt;p&gt;For developers who already know Solidity, the barrier to testing confidential smart contracts is extremely low.&lt;/p&gt;

&lt;p&gt;Curious to hear from builders here. have you actually ran into situations where onchain transparency broke your design? And what would you build first if private execution was available by default?&lt;/p&gt;

</description>
      <category>confidentiality</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Attestation Is Not Enough: Why TEEs Need On-Chain Trust</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Sun, 18 Jan 2026 12:07:45 +0000</pubDate>
      <link>https://forem.com/rollingindo/attestation-is-not-enough-why-tees-need-on-chain-trust-2k48</link>
      <guid>https://forem.com/rollingindo/attestation-is-not-enough-why-tees-need-on-chain-trust-2k48</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv14bop2zxn2hdu6l14h4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv14bop2zxn2hdu6l14h4.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trusted Execution Environments (TEEs) are getting a lot of hype in Web3, and for good reason. They enable &lt;strong&gt;confidential smart contracts&lt;/strong&gt;, &lt;strong&gt;private off-chain agents&lt;/strong&gt;, and a new class of trust-minimized applications. But as Oasis Network’s recent blog explains, &lt;strong&gt;remote attestation alone doesn’t give you real trust&lt;/strong&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  What Remote Attestation &lt;em&gt;Actually&lt;/em&gt; Proves
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vu9y98x6dy1k77fz1ii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vu9y98x6dy1k77fz1ii.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remote attestation gives you a signed quote from hardware that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A specific binary ran&lt;/li&gt;
&lt;li&gt;On specific hardware&lt;/li&gt;
&lt;li&gt;At a specific point in time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sounds solid … until you realize it &lt;em&gt;only proves a snapshot&lt;/em&gt;. It doesn’t tell you anything about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether the quote is &lt;strong&gt;fresh&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Whether the enclave used the &lt;strong&gt;latest state&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Who is &lt;em&gt;actually&lt;/em&gt; running it
&lt;/li&gt;
&lt;li&gt;Whether the code you audited is the exact code that was deployed
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s why raw attestations on their own become &lt;strong&gt;verification theater&lt;/strong&gt;, offloading complex crypto-hardware responsibilities onto users who aren’t security researchers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Critical Gaps
&lt;/h2&gt;

&lt;p&gt;Even a "valid" attestation doesn’t automatically guarantee:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Freshness &amp;amp; Liveness&lt;/strong&gt; - A stale but valid attestation can be reused&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Continuity &amp;amp; Anti-Rollback&lt;/strong&gt; - Old state can be replayed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operator Accountability&lt;/strong&gt; - Attestations don’t tell you &lt;em&gt;who&lt;/em&gt; controls the enclave&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TCB Governance&lt;/strong&gt; - Hardware vendors define threat models; users might demand stricter policies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Provenance&lt;/strong&gt; - You still need reproducible builds and verifiable binaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simply put: &lt;strong&gt;attestation ≠ trust&lt;/strong&gt; if you leave these holes unaddressed. &lt;/p&gt;

&lt;h2&gt;
  
  
  Turning TEEs into Trust Systems
&lt;/h2&gt;

&lt;p&gt;So how do you fix this?&lt;/p&gt;

&lt;p&gt;Instead of expecting every user to parse raw hardware quotes, Oasis proposes treating &lt;strong&gt;consensus as the verifier&lt;/strong&gt;. A fault-tolerant network of stake-bearing validators:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Collects attestations + verification evidence&lt;/li&gt;
&lt;li&gt;Verifies TCB, freshness, policies, upgrade history&lt;/li&gt;
&lt;li&gt;Agrees on validity via BFT consensus&lt;/li&gt;
&lt;li&gt;Publishes a simple &lt;strong&gt;on-chain verification state&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now users don’t need to parse multi-kilobyte attestation blobs or know Intel/AMD internals, they simply verify a consensus signed proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters??
&lt;/h2&gt;

&lt;p&gt;This architecture transforms TEEs from:&lt;/p&gt;

&lt;p&gt;🔹 isolated hardware boxes&lt;br&gt;&lt;br&gt;
into&lt;br&gt;&lt;br&gt;
🔹 integrated, verifiable components&lt;br&gt;&lt;br&gt;
   within a larger trust system&lt;/p&gt;

&lt;p&gt;full thread can be read through Oasis official blog, &lt;a href="https://oasis.net/blog/tee-attestation-is-not-enough" rel="noopener noreferrer"&gt;here&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>cryptocurrency</category>
      <category>web3</category>
      <category>privacy</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Oasis in 2025: A Shift Toward Verifiable Off-Chain Compute</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Tue, 13 Jan 2026 10:36:30 +0000</pubDate>
      <link>https://forem.com/rollingindo/oasis-in-2025-a-shift-toward-verifiable-off-chain-compute-159k</link>
      <guid>https://forem.com/rollingindo/oasis-in-2025-a-shift-toward-verifiable-off-chain-compute-159k</guid>
      <description>&lt;p&gt;2025 didn’t bring a single “killer app” moment for crypto, but it did bring something more important: infrastructure getting real.&lt;/p&gt;

&lt;p&gt;One of the most underappreciated shifts this year was how Oasis positioned itself as a practical bridge between on-chain systems and real-world compute.&lt;/p&gt;

&lt;p&gt;This post is a short recap of why &lt;a href="https://oasis.net/" rel="noopener noreferrer"&gt;Oasis&lt;/a&gt; mattered in 2025, especially for devs building beyond toy smart contracts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fufuxx9d64lorgsmfr70x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fufuxx9d64lorgsmfr70x.png" alt=" " width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem We Finally Stopped Ignoring
&lt;/h2&gt;

&lt;p&gt;Smart contracts are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transparent&lt;/li&gt;
&lt;li&gt;Deterministic&lt;/li&gt;
&lt;li&gt;Verifiable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slow&lt;/li&gt;
&lt;li&gt;Expensive&lt;/li&gt;
&lt;li&gt;Terrible at handling private data or complex logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most serious protocols already rely on off-chain systems (AWS, GCP, custom infra), but those systems are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opaque&lt;/li&gt;
&lt;li&gt;Centralized&lt;/li&gt;
&lt;li&gt;Impossible to verify on-chain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2025 was the year projects stopped pretending this tradeoff didn’t exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Oasis’ Core Bet: Trusted Execution Environments (TEEs)
&lt;/h2&gt;

&lt;p&gt;Oasis doubled down on TEE-based compute, enabling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Off-chain execution&lt;/li&gt;
&lt;li&gt;With hardware-level confidentiality&lt;/li&gt;
&lt;li&gt;And cryptographic attestations&lt;/li&gt;
&lt;li&gt;Verifiable by on-chain logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t theoretical privacy, it’s auditable execution.&lt;/p&gt;

&lt;p&gt;You don’t “&lt;em&gt;trust the operator&lt;/em&gt;”.&lt;br&gt;
You verify what code ran, where it ran, and what it produced.&lt;/p&gt;

&lt;h2&gt;
  
  
  ROFL: A Decentralized TEE Cloud (Not Just a Whitepaper)
&lt;/h2&gt;

&lt;p&gt;ROFL (Runtime Off-chain Logic Framework) became one of the most important  and misunderstood pieces of Oasis' stack.&lt;/p&gt;

&lt;p&gt;What it actually enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deterministic off-chain execution&lt;/li&gt;
&lt;li&gt;Across a decentralized set of TEE nodes&lt;/li&gt;
&lt;li&gt;With outputs posted on-chain&lt;/li&gt;
&lt;li&gt;And reproducible verification guarantees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, this means you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run risk engines&lt;/li&gt;
&lt;li&gt;Pricing models&lt;/li&gt;
&lt;li&gt;ML inference&lt;/li&gt;
&lt;li&gt;Fraud detection&lt;/li&gt;
&lt;li&gt;Private analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…without exposing data or logic, and without blindly trusting AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Real Projects Started Paying Attention
&lt;/h2&gt;

&lt;p&gt;The big signal in 2025 wasn’t marketing, it was adoption by protocols with real risk.&lt;/p&gt;

&lt;p&gt;Using Oasis + ROFL allowed teams to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep existing infra&lt;/li&gt;
&lt;li&gt;Add verifiability instead of rewriting everything&lt;/li&gt;
&lt;li&gt;Gradually decentralize trust, not functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This hybrid model (centralized performance + decentralized verification) is likely how most production crypto systems will evolve.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for Devs
&lt;/h2&gt;

&lt;p&gt;If you’re building in 2026+, Oasis makes sense when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private state&lt;/li&gt;
&lt;li&gt;Complex logic&lt;/li&gt;
&lt;li&gt;Off-chain performance&lt;/li&gt;
&lt;li&gt;On-chain trust guarantees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwukxfvu73f3vx384lmf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwukxfvu73f3vx384lmf.png" alt=" " width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You don’t replace your backend. You prove it.&lt;/p&gt;

&lt;p&gt;That’s the mental shift Oasis helped normalize in 2025.&lt;/p&gt;

&lt;p&gt;Oasis didn’t try to “replace Ethereum”.&lt;br&gt;
It didn’t chase memes.&lt;br&gt;
It didn’t promise magic scalability.&lt;/p&gt;

&lt;p&gt;Instead, it focused on something harder: &lt;br&gt;
&lt;strong&gt;Making off-chain compute verifiable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that’s exactly the kind of boring, foundational work that ends up shaping the next wave of adoption.&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>cryptocurrency</category>
    </item>
    <item>
      <title>Oasis for Developers: an underrated EVM for privacy-first dApps</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Sun, 11 Jan 2026 10:21:51 +0000</pubDate>
      <link>https://forem.com/rollingindo/oasis-for-developers-an-underrated-evm-for-privacy-first-dapps-9if</link>
      <guid>https://forem.com/rollingindo/oasis-for-developers-an-underrated-evm-for-privacy-first-dapps-9if</guid>
      <description>&lt;p&gt;If you’re building in Web3 and everything starts to feel like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MEV everywhere&lt;/li&gt;
&lt;li&gt;Front-running by default&lt;/li&gt;
&lt;li&gt;Sensitive logic exposed in calldata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…it might be time to look at &lt;a href="https://oasis.net/sapphire" rel="noopener noreferrer"&gt;Oasis Sapphire&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=LDLz06X_KNY" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=LDLz06X_KNY&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Oasis actually is
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Oasis is a Layer 1 with a modular architecture&lt;/li&gt;
&lt;li&gt;Sapphire is an EVM-compatible ParaTime (smart contract runtime)&lt;/li&gt;
&lt;li&gt;You deploy Solidity contracts almost exactly like Ethereum&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What makes it different
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Confidential EVM execution&lt;/li&gt;
&lt;li&gt;Contract state, inputs, and internal logic can be encrypted&lt;/li&gt;
&lt;li&gt;Data is only visible inside the secure runtime (TEE-backed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t “privacy by obfuscation”. It’s enforced at execution level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for devs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Protect MEV strategies (arbs, liquidations, auctions)&lt;/li&gt;
&lt;li&gt;Build sealed-bid auctions without commit–reveal hacks&lt;/li&gt;
&lt;li&gt;Hide sensitive parameters (fees, thresholds, allowlists)&lt;/li&gt;
&lt;li&gt;Reduce attack surface from calldata-based exploits&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dev experience
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Solidity + standard tooling (Foundry, Hardhat)&lt;/li&gt;
&lt;li&gt;Minimal changes to existing contracts&lt;/li&gt;
&lt;li&gt;No custom rollup infra, no sequencers to manage&lt;/li&gt;
&lt;li&gt;Deploy like an app, not like an infrastructure company&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When Oasis makes sense
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DeFi protocols with strategy logic&lt;/li&gt;
&lt;li&gt;Account abstraction / paymaster logic&lt;/li&gt;
&lt;li&gt;Games with hidden state&lt;/li&gt;
&lt;li&gt;Governance or voting systems&lt;/li&gt;
&lt;li&gt;Any app where “everything public” is a liability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedeet6so8ye5idq7hmer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedeet6so8ye5idq7hmer.png" alt=" " width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Trade-offs (being honest)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Smaller ecosystem than Ethereum L2s&lt;/li&gt;
&lt;li&gt;You need to design with confidentiality in mind&lt;/li&gt;
&lt;li&gt;Not every app needs privacy, obviously.. but when you do, it’s hard to fake&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If Ethereum L2s optimize for throughput, Oasis optimizes for who gets to see what. And that’s a powerful primitive most stacks still don’t have.&lt;/p&gt;

</description>
      <category>solidity</category>
      <category>cryptocurrency</category>
      <category>blockchain</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Oasis &amp; TEE Vulnerabilities and Why Oasis Survived the Storm</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Sun, 21 Dec 2025 17:19:22 +0000</pubDate>
      <link>https://forem.com/rollingindo/oasis-tee-vulnerabilities-and-why-oasis-survived-the-storm-193o</link>
      <guid>https://forem.com/rollingindo/oasis-tee-vulnerabilities-and-why-oasis-survived-the-storm-193o</guid>
      <description>&lt;p&gt;Trusted Execution Environments (TEEs) like Intel SGX and AMD SEV‑SNP recently hit the news with two nasty physical attacks: Battering RAM &amp;amp; Wiretap. These attacks target memory encryption and can expose attestation keys.&lt;/p&gt;

&lt;p&gt;But here’s the kicker: Oasis wasn’t affected. Let’s break it down:&lt;/p&gt;

&lt;p&gt;What went down with TEEs&lt;/p&gt;

&lt;h2&gt;
  
  
  The attacks:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Extract keys directly from memory using physical access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Break the confidentiality guarantees of SGX v2 / SEV‑SNP.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Affected projects had to patch immediately.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;examples: Phala, Secret Network, Crust, IntegriTEE.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Oasis stayed safe
&lt;/h2&gt;

&lt;p&gt;Oasis isn’t just “TEE inside blockchain”. it’s layered security:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Runs critical components (key manager, Sapphire/Cipher runtimes) on older SGX v1, not affected by these attacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Core system doesn’t rely on enclave secrecy for correctness or funds safety.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Even if a TEE key were compromised, ephemeral keys &amp;amp; rotation reduce risk drastically.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Defense‑in‑Depth
&lt;/h2&gt;

&lt;p&gt;Oasis uses multiple layers to protect users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On‑chain governance &amp;amp; staked validators&lt;/li&gt;
&lt;li&gt;Ephemeral key rotation &amp;amp; policy blacklists&lt;/li&gt;
&lt;li&gt;Enclave isolation for sensitive components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if a hardware TEE is compromised, consensus, funds, and historical messages stay safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dev Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;TEEs are powerful but not infallible.&lt;/li&gt;
&lt;li&gt;Layered security &amp;gt; single-point trust.&lt;/li&gt;
&lt;li&gt;Design protocols assuming hardware can fail.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oasis shows a blueprint for confidential computing done right in Web3.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>cryptocurrency</category>
      <category>privacy</category>
      <category>computervision</category>
    </item>
    <item>
      <title>Verifiable Compute for Onchain Prop Trading: Carrot Meets Oasis ROFL</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Sun, 21 Dec 2025 17:01:24 +0000</pubDate>
      <link>https://forem.com/rollingindo/verifiable-compute-for-onchain-prop-trading-carrot-meets-oasis-rofl-1f5i</link>
      <guid>https://forem.com/rollingindo/verifiable-compute-for-onchain-prop-trading-carrot-meets-oasis-rofl-1f5i</guid>
      <description>&lt;p&gt;As decentralized finance continues to mature, one of the persistent challenges has been reducing reliance on centralized or opaque computation, particularly in performance-sensitive applications like proprietary trading. The Oasis Protocol ecosystem has published a detailed update on how Carrotfunding.io plans to tackle this by integrating ROFL (Runtime Offchain Logic Framework) to bring cryptographically verifiable compute into its trading stack. &lt;/p&gt;

&lt;h2&gt;
  
  
  Trusted Compute in DeFi
&lt;/h2&gt;

&lt;p&gt;Prop trading, where skilled traders deploy capital under performance constraints, has traditionally relied on centralized engines for order execution, risk evaluation, and performance assessment. Even when using decentralized vaults and execution rails, a core piece of this puzzle often remains a black-box server environment (for example, AWS) that users must implicitly trust. &lt;/p&gt;

&lt;p&gt;This trust assumption limits the ability to provide fully transparent and provable financial services. In a space where trustlessness and verifiability are fundamental value propositions, bridging this gap is crucial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Carrot’s Approach with Verifiable Compute
&lt;/h2&gt;

&lt;p&gt;Carrotfunding is introducing a verification layer using ROFL. This framework leverages trusted execution environments to independently verify compute results generated by the existing trading infrastructure. In practical terms, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A ROFL instance runs in parallel with the AWS-based engine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Every compute operation, whether order placement logic, trader evaluation metrics, or payout calculations, is independently verified by ROFL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cryptographic proofs of these compute results are made available onchain. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This approach preserves performance and compatibility with existing systems while adding an orthogonal layer of verified trust.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Benefits for Traders and Capital Providers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Traders benefit from verifiable evaluation logic. Instead of taking the platform’s word on performance metrics or evaluation criteria, they can independently confirm that the rules were applied fairly and consistently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Investors and capital allocators gain confidence that the pool’s rules for risk, capital deployment, and reward distribution are enforced without manipulation or manual interference.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This model strengthens the credibility of onchain prop trading and opens the door for similar applications across DeFi where proving computational integrity is essential. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Road Ahead
&lt;/h2&gt;

&lt;p&gt;Currently, ROFL runs alongside existing compute infrastructure. Over time, Carrot aims to migrate toward a fully ROFL-centric compute model. This reflects a broader trend in Web3: combining the efficiency of offchain computation with the trust guarantees of onchain verification.&lt;/p&gt;

&lt;p&gt;For developers and teams exploring verifiable compute patterns in financial, AI, or agentic applications, this integration between Carrot and Oasis ROFL provides a practical reference model. Full thread on oasis' blog, &lt;a href="//dev.to/joinwithken/top-5-tools-technologies-for-llm-development-2025-5696#comments"&gt;here&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Oasis launches a strategic investment arm and backs SemiLiquid to build confidential RWA credit infrastructure</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Tue, 16 Dec 2025 07:49:07 +0000</pubDate>
      <link>https://forem.com/rollingindo/oasis-launches-a-strategic-investment-arm-and-backs-semiliquid-to-build-confidential-rwa-credit-mfc</link>
      <guid>https://forem.com/rollingindo/oasis-launches-a-strategic-investment-arm-and-backs-semiliquid-to-build-confidential-rwa-credit-mfc</guid>
      <description>&lt;p&gt;Oasis Protocol recently announced the launch of a strategic investment arm, marking a shift from pure ecosystem grants to longer-term capital deployment and hands-on technical collaboration.&lt;/p&gt;

&lt;p&gt;The first investment from this new arm is SemiLiquid, a project building custody-native credit infrastructure for tokenized real-world assets.&lt;/p&gt;

&lt;p&gt;From a developer and infrastructure perspective, this is an interesting signal about where Oasis is positioning itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What SemiLiquid is building
&lt;/h2&gt;

&lt;p&gt;SemiLiquid focuses on enabling credit against tokenized assets without requiring those assets to leave institutional custody.&lt;/p&gt;

&lt;p&gt;In practice, this means&lt;br&gt;
• Assets remain with a qualified custodian&lt;br&gt;
• Credit eligibility and collateral constraints are verified on-chain&lt;br&gt;
• Sensitive financial data is never publicly exposed&lt;/p&gt;

&lt;p&gt;This addresses a major blocker for institutional DeFi adoption: privacy and compliance around balance sheets, collateral composition, and counterparty exposure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Oasis is involved
&lt;/h2&gt;

&lt;p&gt;SemiLiquid is built on Oasis’s confidential compute stack, including Sapphire and Oasis’s runtime confidentiality guarantees.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The key technical components include&lt;/em&gt;&lt;br&gt;
• Confidential smart contracts executed in trusted execution environments&lt;br&gt;
• On-chain verification with private state&lt;br&gt;
• Liquefaction primitives that allow off-chain or private data to influence on-chain logic without disclosure&lt;/p&gt;

&lt;p&gt;For developers, this shows a concrete production use case where confidential EVM execution is not just a theoretical privacy feature, but a requirement for regulated financial workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pilot results and real usage
&lt;/h2&gt;

&lt;p&gt;According to Oasis, SemiLiquid has already completed pilot workflows with institutional partners such as Franklin Templeton and Zodia Custody.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;These pilots included&lt;/em&gt;&lt;br&gt;
• Collateral locking&lt;br&gt;
• Credit issuance&lt;br&gt;
• Automated repayment logic&lt;br&gt;
• Privacy-preserving verification&lt;/p&gt;

&lt;p&gt;All executed on Oasis infrastructure.&lt;/p&gt;

&lt;p&gt;This is notable because many RWA projects stall at the proof-of-concept stage, while this one appears to be testing full lifecycle flows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for builders
&lt;/h2&gt;

&lt;p&gt;If you are building in DeFi, RWAs, or compliance-aware systems, this announcement highlights a few trends&lt;br&gt;
• Confidential execution is becoming infrastructure, not a niche feature&lt;br&gt;
• Institutions require verifiable logic without public state exposure&lt;br&gt;
• Blockchain investment arms are starting to fund infrastructure layers, not just applications&lt;/p&gt;

&lt;p&gt;Oasis moving from grants to strategic investments suggests a focus on fewer but more deeply integrated projects that push the limits of what on-chain systems can safely handle.&lt;/p&gt;

&lt;p&gt;Full thread can be found in this &lt;a href="https://oasis.net/blog/strategic-investment-arm-semiliquid" rel="noopener noreferrer"&gt;link&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>cryptocurrency</category>
      <category>programming</category>
    </item>
    <item>
      <title>ERC 8004 and Trustless AI Agents</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Fri, 28 Nov 2025 08:56:02 +0000</pubDate>
      <link>https://forem.com/rollingindo/erc-8004-and-trustless-ai-agents-40hb</link>
      <guid>https://forem.com/rollingindo/erc-8004-and-trustless-ai-agents-40hb</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fekb0fojwxektg459ayib.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fekb0fojwxektg459ayib.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What ERC 8004 Tries To Solve
&lt;/h2&gt;

&lt;p&gt;AI agents need a way to identify themselves, prove what they did, and accumulate reputational history across different environments.&lt;br&gt;
Today this is fragmented. Each API or platform uses its own identity model, its own reputation rules, and its own trust signals.&lt;br&gt;
ERC 8004 proposes a shared framework so that autonomous agents can reliably interact across chains and systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identity Registry
&lt;/h2&gt;

&lt;p&gt;The standard introduces a common identity layer where each agent is represented as a token.&lt;br&gt;
The token points to a JSON document called an agent card.&lt;br&gt;
The card contains information such as capabilities, metadata, links to external profiles, and service endpoints.&lt;br&gt;
This allows clients and other agents to discover what an agent can do without depending on centralized API registries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation Registry
&lt;/h2&gt;

&lt;p&gt;Agents produce outputs that sometimes must be verified.&lt;br&gt;
ERC 8004 defines a mechanism for validators to respond to requests, return results, and attach supporting information such as proof files or reexecution traces.&lt;br&gt;
This is important for tasks where correctness matters, including code generation, data transformation, or fact-based responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reputation Registry
&lt;/h2&gt;

&lt;p&gt;Trust grows when feedback is consistent across platforms.&lt;br&gt;
The reputation layer lets users or clients leave structured feedback that agents can carry with them.&lt;br&gt;
Feedback can include scores, tags, and optional file references.&lt;br&gt;
The goal is to create a portable reputation footprint instead of siloed rating systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trustless Agents
&lt;/h2&gt;

&lt;p&gt;When identity, validation, and reputation are standardized, an agent can operate without relying on a single platform.&lt;br&gt;
The agent becomes portable.&lt;br&gt;
The client does not need to trust the hosting company but only the chain-level registries.&lt;br&gt;
This creates a foundation for agent markets, agent-to-agent commerce, and autonomous services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fk05h7jgnpaws2iwir8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fk05h7jgnpaws2iwir8.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Developers gain an open and verifiable way to expose AI services.&lt;br&gt;
Users get transparent trust signals.&lt;br&gt;
Platforms can interoperate instead of locking agents inside proprietary ecosystems.&lt;br&gt;
This moves AI services toward the same open model that helped the web grow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Use Cases
&lt;/h2&gt;

&lt;p&gt;Running autonomous assistants that perform API calls with verifiable logs&lt;br&gt;
Building agent marketplaces where discovery and scoring work across vendors&lt;br&gt;
Creating validator networks for correctness checking&lt;br&gt;
Composing multiple agents into pipelines without hidden trust assumptions&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Start
&lt;/h2&gt;

&lt;p&gt;Build an agent card describing capabilities and metadata&lt;br&gt;
Register it through an identity registry implementation&lt;br&gt;
Use the validation and reputation registries to attach proof and feedback data&lt;br&gt;
Publish your agent so other clients or agents can discover and interact with it&lt;/p&gt;

&lt;p&gt;ERC 8004 is still young but it has practical design goals.&lt;br&gt;
It aims for interoperability, transparency, and portable trust.&lt;br&gt;
As the agent ecosystem grows, shared standards like this will become essential infrastructure. Full article can be accessed through this &lt;a href="https://oasis.net/blog/erc-8004-trustless-agents" rel="noopener noreferrer"&gt;link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>ai</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
