<?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 Verifiable Multi-Chain AI Execution Layer with Oasis ROFL + Sapphire + TDX</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Thu, 21 May 2026 07:02:11 +0000</pubDate>
      <link>https://forem.com/rollingindo/building-a-verifiable-multi-chain-ai-execution-layer-with-oasis-rofl-sapphire-tdx-14na</link>
      <guid>https://forem.com/rollingindo/building-a-verifiable-multi-chain-ai-execution-layer-with-oasis-rofl-sapphire-tdx-14na</guid>
      <description>&lt;p&gt;Most AI on blockchain applications today still rely heavily on trust.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The AI inference happens on centralized servers.
&lt;/li&gt;
&lt;li&gt;The wallet keys live in backend infrastructure.
&lt;/li&gt;
&lt;li&gt;Smart contracts trust APIs blindly.
&lt;/li&gt;
&lt;li&gt;And users have no way to verify what actually happened off-chain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this tutorial, we’ll build something far more advanced:&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;verifiable confidential AI execution layer&lt;/strong&gt; using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oasis Sapphire&lt;/li&gt;
&lt;li&gt;ROFL (Runtime Offchain Logic)&lt;/li&gt;
&lt;li&gt;Intel TDX Trusted Execution Environments&lt;/li&gt;
&lt;li&gt;Remote Attestation&lt;/li&gt;
&lt;li&gt;Enclave-managed wallet signing&lt;/li&gt;
&lt;li&gt;Cross-chain transaction execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private AI inference
&lt;/li&gt;
&lt;li&gt;Verifiable off-chain execution
&lt;/li&gt;
&lt;li&gt;Secure enclave wallet management
&lt;/li&gt;
&lt;li&gt;Cross-chain automation
&lt;/li&gt;
&lt;li&gt;Trust-minimized AI agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without needing zkML or expensive zkVM proving systems.&lt;/p&gt;




&lt;h1&gt;
  
  
  What We’re Building
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+---------------------------------------------------+
|                 User / dApp                       |
+--------------------+------------------------------+
                     |
                     v
+---------------------------------------------------+
|          Sapphire Smart Contract                  |
|---------------------------------------------------|
| - Stores trusted ROFL identities                  |
| - Verifies enclave signatures                     |
| - Accepts/verifies AI execution results           |
+--------------------+------------------------------+
                     ^
                     |
             Signed attested result
                     |
+---------------------------------------------------+
|          ROFL App Inside Intel TDX                |
|---------------------------------------------------|
| - Runs AI inference                               |
| - Calls APIs                                      |
| - Generates wallet keys internally                |
| - Signs responses                                 |
| - Performs remote attestation                     |
+--------------------+------------------------------+
                     |
                     v
         External APIs / Other Chains / LLMs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Most AI agents today suffer from major trust issues.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| Problem                       | Why It Matters                    |
| ------------------------------------------------------------------|                                                              
| Centralized inference         | Outputs can be manipulated        |
| Backend wallet custody        | Keys can be stolen                |
| Hidden execution logic        | Impossible to audit               |
| Fake oracle data              | Contracts trust unverifiable APIs |
| Cross-chain trust assumptions | Bridges increase attack surface   |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ROFL changes this entirely.&lt;/p&gt;

&lt;p&gt;Instead of trusting a backend server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;computation runs inside a Trusted Execution Environment&lt;/li&gt;
&lt;li&gt;outputs are cryptographically signed&lt;/li&gt;
&lt;li&gt;enclave identities are attested&lt;/li&gt;
&lt;li&gt;smart contracts verify execution authenticity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates &lt;strong&gt;trustless off-chain compute&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Core Technologies
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Sapphire
&lt;/h2&gt;

&lt;p&gt;Sapphire is Oasis Network’s confidential EVM runtime.&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;encrypted calldata&lt;/li&gt;
&lt;li&gt;encrypted state&lt;/li&gt;
&lt;li&gt;confidential smart contract execution&lt;/li&gt;
&lt;li&gt;Solidity/EVM compatibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike traditional EVM chains, node operators cannot inspect execution data.&lt;/p&gt;




&lt;h2&gt;
  
  
  ROFL (Runtime Offchain Logic)
&lt;/h2&gt;

&lt;p&gt;ROFL allows developers to run arbitrary off-chain logic inside TEEs.&lt;/p&gt;

&lt;p&gt;This means your application can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;call APIs&lt;/li&gt;
&lt;li&gt;run AI models&lt;/li&gt;
&lt;li&gt;sign transactions&lt;/li&gt;
&lt;li&gt;manage secrets&lt;/li&gt;
&lt;li&gt;execute autonomous workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;while remaining cryptographically verifiable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Intel TDX
&lt;/h2&gt;

&lt;p&gt;Intel TDX provides confidential virtual machines with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;encrypted memory&lt;/li&gt;
&lt;li&gt;hardware isolation&lt;/li&gt;
&lt;li&gt;attestation support&lt;/li&gt;
&lt;li&gt;strong execution guarantees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ROFL supports TDX-backed confidential compute environments.&lt;/p&gt;




&lt;h1&gt;
  
  
  Architecture Deep Dive
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        User Prompt
              |
              v
+-----------------------------------+
|      Sapphire Smart Contract      |
+-----------------------------------+
              |
              v
+-----------------------------------+
|       ROFL TDX Enclave            |
|-----------------------------------|
| 1. Receives encrypted request     |
| 2. Runs AI inference              |
| 3. Generates signed result        |
| 4. Signs with enclave wallet      |
+-----------------------------------+
              |
              v
      Cross-chain execution
              |
              v
     Ethereum / Base / Arbitrum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 1: Install Oasis CLI
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://get.oasis.io | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;oasis &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 2: Create a ROFL Application
&lt;/h1&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;ai-executor
&lt;span class="nb"&gt;cd &lt;/span&gt;ai-executor

oasis rofl init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This generates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rofl.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The manifest defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enclave configuration&lt;/li&gt;
&lt;li&gt;TEE type&lt;/li&gt;
&lt;li&gt;networking&lt;/li&gt;
&lt;li&gt;policies&lt;/li&gt;
&lt;li&gt;deployment settings&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Step 3: Configure ROFL Manifest
&lt;/h1&gt;

&lt;p&gt;Example advanced configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ai-executor&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.1.0&lt;/span&gt;

&lt;span class="na"&gt;tee&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tdx&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;containers&lt;/span&gt;

&lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8192&lt;/span&gt;
  &lt;span class="na"&gt;cpus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;

&lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;paratime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sapphire&lt;/span&gt;

&lt;span class="na"&gt;policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;quotes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;pcs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;tdx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;

&lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Important Manifest Settings
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| Field       |    Purpose                     |
| ------------|--------------------------------|                                
| tee         | TEE backend (SGX/TDX)          |
| kind        | Raw or containerized workloads |
| resources   | Enclave memory + CPU           |
| network     | Connected ParaTime             |
| policy      | Attestation requirements       |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 4: Build the Enclave
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;oasis rofl build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This generates an ORC bundle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-app.orc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bundle includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enclave measurements&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;li&gt;binaries&lt;/li&gt;
&lt;li&gt;identity hashes&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Step 5: Generate Wallet Keys Inside the Enclave
&lt;/h1&gt;

&lt;p&gt;This is one of the most powerful features.&lt;/p&gt;

&lt;p&gt;Traditional AI agents store keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;in &lt;code&gt;.env&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;in cloud KMS systems&lt;/li&gt;
&lt;li&gt;in backend infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wallet Key Generated INSIDE TEE
        ↓
Key Never Leaves Enclave
        ↓
Transactions Signed Securely
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No backend custody required.&lt;/p&gt;




&lt;h1&gt;
  
  
  Example Rust Wallet Generation
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;k256&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;ecdsa&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SigningKey&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;rand_core&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OsRng&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;generate_wallet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SigningKey&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;SigningKey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;OsRng&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 private key only exists inside enclave memory.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 6: Run AI Inference Securely
&lt;/h1&gt;

&lt;p&gt;Example inference service:&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;transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt;

&lt;span class="n"&gt;classifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-classification&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;distilbert-base-uncased&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;classifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Execute strategy?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside ROFL:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prompts remain confidential&lt;/li&gt;
&lt;li&gt;inference is hidden from operators&lt;/li&gt;
&lt;li&gt;outputs are signed by the enclave&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Secure AI Execution Flow
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Prompt
    ↓
ROFL Enclave
    ↓
Private AI Inference
    ↓
Signed Output
    ↓
Sapphire Verification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 7: Remote Attestation
&lt;/h1&gt;

&lt;p&gt;Attestation proves:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This exact code executed inside genuine TDX hardware.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without attestation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TEEs are just claims&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With attestation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contracts can verify enclave authenticity&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Attestation Flow
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ROFL App Starts
      ↓
TEE Generates Measurement
      ↓
Attestation Quote Produced
      ↓
Quote Registered On-Chain
      ↓
Sapphire Verifies Identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 8: Register the ROFL App
&lt;/h1&gt;

&lt;p&gt;Create the application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;oasis rofl create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; testnet &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--paratime&lt;/span&gt; sapphire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;oasis rofl update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enclave identities&lt;/li&gt;
&lt;li&gt;measurements&lt;/li&gt;
&lt;li&gt;execution policy&lt;/li&gt;
&lt;li&gt;attestation configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;on-chain.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 9: Smart Contract Verification
&lt;/h1&gt;

&lt;p&gt;Now we create a Sapphire contract that verifies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enclave identity&lt;/li&gt;
&lt;li&gt;signatures&lt;/li&gt;
&lt;li&gt;trusted execution&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Solidity Verification Contract
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pragma solidity ^0.8.20;

contract VerifiedAIExecutor {

    mapping(bytes32 =&amp;gt; bool) public trustedEnclaves;

    function registerEnclave(bytes32 enclaveId) external {
        trustedEnclaves[enclaveId] = true;
    }

    function verifyExecution(
        bytes32 enclaveId,
        bytes calldata signature,
        bytes calldata result
    ) external view returns (bool) {

        require(trustedEnclaves[enclaveId], "Untrusted enclave");

        // Signature verification logic
        return true;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 10: Cross-Chain Transaction Execution
&lt;/h1&gt;

&lt;p&gt;This is where things become extremely powerful.&lt;/p&gt;

&lt;p&gt;The enclave can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;manage Ethereum wallets&lt;/li&gt;
&lt;li&gt;sign Base transactions&lt;/li&gt;
&lt;li&gt;execute Arbitrum transactions&lt;/li&gt;
&lt;li&gt;interact with multiple chains&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without bridges.&lt;/p&gt;




&lt;h1&gt;
  
  
  Cross-Chain Execution Flow
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Strategy Generated
        ↓
TEE Decides Action
        ↓
TEE Signs Transaction
        ↓
Broadcast To Ethereum RPC
        ↓
Result Returned To Sapphire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;autonomous trading systems&lt;/li&gt;
&lt;li&gt;AI treasury management&lt;/li&gt;
&lt;li&gt;confidential DAO executors&lt;/li&gt;
&lt;li&gt;secure cross-chain agents&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Step 11: Deterministic Execution Logging
&lt;/h1&gt;

&lt;p&gt;AI outputs are often nondeterministic.&lt;/p&gt;

&lt;p&gt;To improve auditability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hash prompts&lt;/li&gt;
&lt;li&gt;hash outputs&lt;/li&gt;
&lt;li&gt;hash model versions&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;model_version&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;output hash&lt;/li&gt;
&lt;li&gt;enclave ID&lt;/li&gt;
&lt;li&gt;timestamp&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;on-chain.&lt;/p&gt;




&lt;h1&gt;
  
  
  Security Considerations
&lt;/h1&gt;

&lt;p&gt;TEEs are powerful but not perfect.&lt;/p&gt;

&lt;p&gt;Potential risks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;side-channel attacks&lt;/li&gt;
&lt;li&gt;hardware trust assumptions&lt;/li&gt;
&lt;li&gt;speculative execution vulnerabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still, TEEs provide dramatically stronger guarantees than centralized servers.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why This Architecture Is Important
&lt;/h1&gt;

&lt;p&gt;Traditional AI systems rely on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;trusted cloud providers&lt;/li&gt;
&lt;li&gt;centralized APIs&lt;/li&gt;
&lt;li&gt;backend custody&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ROFL + Sapphire introduces:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional Backend&lt;/th&gt;
&lt;th&gt;ROFL + Sapphire&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Centralized inference&lt;/td&gt;
&lt;td&gt;TEE-attested inference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend wallet storage&lt;/td&gt;
&lt;td&gt;Enclave-managed keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidden execution&lt;/td&gt;
&lt;td&gt;Verifiable execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API trust assumptions&lt;/td&gt;
&lt;td&gt;Hardware-backed trust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Centralized orchestration&lt;/td&gt;
&lt;td&gt;Permissionless infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Real-World Use Cases
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Verifiable AI Trading Agents
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;runs private strategies&lt;/li&gt;
&lt;li&gt;signs trades&lt;/li&gt;
&lt;li&gt;proves execution authenticity&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Confidential Healthcare AI
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;patient data remains private&lt;/li&gt;
&lt;li&gt;inference occurs inside TEEs&lt;/li&gt;
&lt;li&gt;outputs become auditable&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Autonomous DAO Executors
&lt;/h2&gt;

&lt;p&gt;AI agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;propose governance actions&lt;/li&gt;
&lt;li&gt;execute treasury operations&lt;/li&gt;
&lt;li&gt;prove execution legitimacy&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Multi-Chain AI Wallet Infrastructure
&lt;/h2&gt;

&lt;p&gt;One enclave can securely control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ethereum&lt;/li&gt;
&lt;li&gt;Base&lt;/li&gt;
&lt;li&gt;Arbitrum&lt;/li&gt;
&lt;li&gt;future ecosystems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without custodial bridges.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Bigger Picture
&lt;/h1&gt;

&lt;p&gt;ROFL introduces something Web3 desperately needs:&lt;/p&gt;

&lt;h1&gt;
  
  
  Trustless Off-Chain Compute
&lt;/h1&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“another oracle”&lt;/li&gt;
&lt;li&gt;“another AI chain”&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;verifiable computation&lt;/li&gt;
&lt;li&gt;confidential execution&lt;/li&gt;
&lt;li&gt;autonomous infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a new primitive between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;smart contracts&lt;/li&gt;
&lt;li&gt;AI infrastructure&lt;/li&gt;
&lt;li&gt;confidential computing&lt;/li&gt;
&lt;li&gt;cross-chain orchestration&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Most AI + blockchain systems today still require enormous trust assumptions.&lt;/p&gt;

&lt;p&gt;With:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sapphire&lt;/li&gt;
&lt;li&gt;ROFL&lt;/li&gt;
&lt;li&gt;TDX&lt;/li&gt;
&lt;li&gt;attestation&lt;/li&gt;
&lt;li&gt;enclave-managed wallets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;developers can finally build systems where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;computation is private&lt;/li&gt;
&lt;li&gt;outputs are verifiable&lt;/li&gt;
&lt;li&gt;execution is cryptographically authenticated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This unlocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;autonomous AI agents&lt;/li&gt;
&lt;li&gt;confidential DeFi automation&lt;/li&gt;
&lt;li&gt;verifiable off-chain compute&lt;/li&gt;
&lt;li&gt;secure cross-chain execution&lt;/li&gt;
&lt;li&gt;trusted AI infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And this is likely only the beginning of what confidential compute on Oasis can enable.&lt;/p&gt;




&lt;h1&gt;
  
  
  Resources
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io/" rel="noopener noreferrer"&gt;https://docs.oasis.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io/build/rofl/" rel="noopener noreferrer"&gt;https://docs.oasis.io/build/rofl/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io/build/rofl/workflow/" rel="noopener noreferrer"&gt;https://docs.oasis.io/build/rofl/workflow/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io/build/tools/cli/rofl/" rel="noopener noreferrer"&gt;https://docs.oasis.io/build/tools/cli/rofl/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://oasis.net/sapphire" rel="noopener noreferrer"&gt;https://oasis.net/sapphire&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>web3</category>
      <category>privacy</category>
      <category>development</category>
    </item>
    <item>
      <title>Building a Confidential AI RAG Agent on Oasis Sapphire + ROFL</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Tue, 12 May 2026 08:42:31 +0000</pubDate>
      <link>https://forem.com/rollingindo/building-a-confidential-ai-rag-agent-on-oasis-sapphire-rofl-4e5e</link>
      <guid>https://forem.com/rollingindo/building-a-confidential-ai-rag-agent-on-oasis-sapphire-rofl-4e5e</guid>
      <description>&lt;p&gt;&lt;em&gt;An advanced Oasis Network tutorial for developers who want to combine AI, confidential smart contracts, encrypted vector storage, and verifiable off-chain execution.&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Most AI applications today leak sensitive data somewhere in the pipeline.&lt;/p&gt;

&lt;p&gt;Even if the frontend is secure, prompts, embeddings, retrieval context, API calls, or inference metadata are usually visible to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud providers&lt;/li&gt;
&lt;li&gt;Backend operators&lt;/li&gt;
&lt;li&gt;Database administrators&lt;/li&gt;
&lt;li&gt;Analytics tools&lt;/li&gt;
&lt;li&gt;Infrastructure vendors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This becomes a serious issue for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Financial AI assistants&lt;/li&gt;
&lt;li&gt;Healthcare copilots&lt;/li&gt;
&lt;li&gt;Private enterprise knowledge bases&lt;/li&gt;
&lt;li&gt;Identity systems&lt;/li&gt;
&lt;li&gt;Reputation engines&lt;/li&gt;
&lt;li&gt;On-chain AI agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this tutorial, we will build a &lt;strong&gt;Confidential Retrieval-Augmented Generation (RAG) Agent&lt;/strong&gt; using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oasis Sapphire&lt;/li&gt;
&lt;li&gt;ROFL (Runtime Off-chain Logic)&lt;/li&gt;
&lt;li&gt;Encrypted storage&lt;/li&gt;
&lt;li&gt;Smart contracts&lt;/li&gt;
&lt;li&gt;Off-chain AI inference&lt;/li&gt;
&lt;li&gt;Verifiable confidential execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of storing prompts or embeddings publicly, we will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Encrypt user knowledge before storage&lt;/li&gt;
&lt;li&gt;Perform confidential retrieval&lt;/li&gt;
&lt;li&gt;Execute AI inference off-chain through ROFL&lt;/li&gt;
&lt;li&gt;Return only approved outputs on-chain&lt;/li&gt;
&lt;li&gt;Keep sensitive data hidden from everyone except the user&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  What We Are Building
&lt;/h1&gt;

&lt;p&gt;We are building a confidential AI assistant where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users upload private documents&lt;/li&gt;
&lt;li&gt;Documents are encrypted before storage&lt;/li&gt;
&lt;li&gt;Embeddings are generated off-chain&lt;/li&gt;
&lt;li&gt;Retrieval happens confidentially&lt;/li&gt;
&lt;li&gt;AI inference runs through ROFL&lt;/li&gt;
&lt;li&gt;Smart contracts manage permissions and integrity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confidential EVM execution&lt;/li&gt;
&lt;li&gt;Off-chain compute&lt;/li&gt;
&lt;li&gt;AI pipelines&lt;/li&gt;
&lt;li&gt;Privacy-preserving storage&lt;/li&gt;
&lt;li&gt;Ethereum compatibility&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Architecture
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A[User Uploads Document] --&amp;gt; B[Frontend Encrypts Data]
    B --&amp;gt; C[IPFS / Arweave Storage]
    B --&amp;gt; D[Oasis Sapphire Contract]

    D --&amp;gt; E[ROFL Worker]
    E --&amp;gt; F[Embedding Model]
    F --&amp;gt; G[Encrypted Vector Store]

    H[User Query] --&amp;gt; I[Confidential Retrieval]
    I --&amp;gt; G

    G --&amp;gt; J[Relevant Context]
    J --&amp;gt; K[LLM Inference]
    K --&amp;gt; L[Signed Response]
    L --&amp;gt; D

    D --&amp;gt; M[Verified Output Returned]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Why Sapphire Matters
&lt;/h1&gt;

&lt;p&gt;Traditional EVM chains expose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contract state&lt;/li&gt;
&lt;li&gt;Function arguments&lt;/li&gt;
&lt;li&gt;Internal logic&lt;/li&gt;
&lt;li&gt;Metadata&lt;/li&gt;
&lt;li&gt;User activity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sapphire changes this model by introducing confidential smart contracts.&lt;/p&gt;

&lt;p&gt;This allows developers to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encrypt application state&lt;/li&gt;
&lt;li&gt;Generate secrets securely&lt;/li&gt;
&lt;li&gt;Store confidential metadata&lt;/li&gt;
&lt;li&gt;Protect AI prompts&lt;/li&gt;
&lt;li&gt;Hide retrieval logic&lt;/li&gt;
&lt;li&gt;Secure wallet-based identity systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike “privacy through frontend encryption,” Sapphire provides confidentiality at the runtime layer.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why ROFL Matters
&lt;/h1&gt;

&lt;p&gt;Large AI models cannot realistically run fully on-chain.&lt;/p&gt;

&lt;p&gt;Inference requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPUs&lt;/li&gt;
&lt;li&gt;External APIs&lt;/li&gt;
&lt;li&gt;Heavy compute&lt;/li&gt;
&lt;li&gt;Vector databases&lt;/li&gt;
&lt;li&gt;Long-running processes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ROFL enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Off-chain execution&lt;/li&gt;
&lt;li&gt;Trusted compute&lt;/li&gt;
&lt;li&gt;Verifiable outputs&lt;/li&gt;
&lt;li&gt;Secure communication with Sapphire&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of ROFL as a confidential execution bridge between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smart contracts&lt;/li&gt;
&lt;li&gt;AI systems&lt;/li&gt;
&lt;li&gt;External infrastructure&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Tech Stack
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Smart Contracts&lt;/td&gt;
&lt;td&gt;Solidity + Sapphire&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Off-chain Compute&lt;/td&gt;
&lt;td&gt;ROFL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;IPFS / Arweave&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Embeddings&lt;/td&gt;
&lt;td&gt;Sentence Transformers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector Search&lt;/td&gt;
&lt;td&gt;ChromaDB / Qdrant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wallet&lt;/td&gt;
&lt;td&gt;RainbowKit + Wagmi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encryption&lt;/td&gt;
&lt;td&gt;AES-GCM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Inference&lt;/td&gt;
&lt;td&gt;OpenAI / Local LLM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Step 1: Setting Up Sapphire
&lt;/h1&gt;

&lt;p&gt;Create a new project:&lt;br&gt;
&lt;/p&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;confidential-rag-agent
&lt;span class="nb"&gt;cd &lt;/span&gt;confidential-rag-agent
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install dependencies:&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;hardhat ethers dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initialize Hardhat:&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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add Sapphire configuration:&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="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="s1"&gt;@oasisprotocol/sapphire-hardhat&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="s1"&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&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="s1"&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="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;h1&gt;
  
  
  Step 2: Creating the Confidential Contract
&lt;/h1&gt;

&lt;p&gt;Our contract will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store encrypted metadata&lt;/li&gt;
&lt;li&gt;Register AI responses&lt;/li&gt;
&lt;li&gt;Verify ROFL signatures&lt;/li&gt;
&lt;li&gt;Manage access permissions
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract ConfidentialRAG {

    struct Document {
        string cid;
        bytes encryptedKey;
        address owner;
    }

    mapping(uint256 =&amp;gt; Document) public documents;

    uint256 public docCounter;

    event DocumentStored(uint256 indexed id, address owner);

    function storeDocument(
        string memory cid,
        bytes memory encryptedKey
    ) external {

        documents[docCounter] = Document({
            cid: cid,
            encryptedKey: encryptedKey,
            owner: msg.sender
        });

        emit DocumentStored(docCounter, msg.sender);

        docCounter++;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 3: Encrypting User Data
&lt;/h1&gt;

&lt;p&gt;Never upload raw user data directly.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate a local encryption key&lt;/li&gt;
&lt;li&gt;Encrypt the document client-side&lt;/li&gt;
&lt;li&gt;Upload encrypted data to IPFS&lt;/li&gt;
&lt;li&gt;Store only references on Sapphire&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sequenceDiagram
    participant U as User
    participant F as Frontend
    participant I as IPFS
    participant S as Sapphire

    U-&amp;gt;&amp;gt;F: Upload document
    F-&amp;gt;&amp;gt;F: Generate AES key
    F-&amp;gt;&amp;gt;F: Encrypt document
    F-&amp;gt;&amp;gt;I: Upload encrypted file
    I--&amp;gt;&amp;gt;F: CID
    F-&amp;gt;&amp;gt;S: Store CID + encrypted key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example encryption:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;encrypted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;encryptFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secretKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 4: Generating Embeddings Through ROFL
&lt;/h1&gt;

&lt;p&gt;We now process the encrypted content off-chain.&lt;/p&gt;

&lt;p&gt;ROFL workers can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetch encrypted files&lt;/li&gt;
&lt;li&gt;Decrypt securely&lt;/li&gt;
&lt;li&gt;Generate embeddings&lt;/li&gt;
&lt;li&gt;Store vectors&lt;/li&gt;
&lt;li&gt;Return signed proofs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ROFL Flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
    A[Sapphire Event] --&amp;gt; B[ROFL Worker]
    B --&amp;gt; C[Decrypt File]
    C --&amp;gt; D[Generate Embeddings]
    D --&amp;gt; E[Vector Database]
    E --&amp;gt; F[Signed Result]
    F --&amp;gt; G[Sapphire Contract]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example Python embedding pipeline:&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;sentence_transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SentenceTransformer&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SentenceTransformer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all-MiniLM-L6-v2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&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="n"&gt;document_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 5: Confidential Retrieval
&lt;/h1&gt;

&lt;p&gt;When a user asks a question:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Query embedding is generated&lt;/li&gt;
&lt;li&gt;Similar vectors are retrieved&lt;/li&gt;
&lt;li&gt;Relevant context is assembled&lt;/li&gt;
&lt;li&gt;Context stays encrypted/private&lt;/li&gt;
&lt;li&gt;LLM receives only authorized information&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This prevents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompt leakage&lt;/li&gt;
&lt;li&gt;Public retrieval inspection&lt;/li&gt;
&lt;li&gt;Competitor scraping&lt;/li&gt;
&lt;li&gt;Metadata deanonymization&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Step 6: AI Inference Layer
&lt;/h1&gt;

&lt;p&gt;The inference engine can use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI APIs&lt;/li&gt;
&lt;li&gt;Local Llama models&lt;/li&gt;
&lt;li&gt;Mistral&lt;/li&gt;
&lt;li&gt;DeepSeek&lt;/li&gt;
&lt;li&gt;Confidential GPU infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prompt assembly example:&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="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Context:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;retrieved_context&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Question:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_question&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Step 7: Returning Verifiable Results
&lt;/h1&gt;

&lt;p&gt;ROFL signs outputs before returning them.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Authorized worker&lt;/li&gt;
&lt;li&gt;Valid signature&lt;/li&gt;
&lt;li&gt;Fresh timestamp&lt;/li&gt;
&lt;li&gt;Integrity proof&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a verifiable AI pipeline.&lt;/p&gt;




&lt;h1&gt;
  
  
  Security Design
&lt;/h1&gt;

&lt;p&gt;Our architecture protects against:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threat&lt;/th&gt;
&lt;th&gt;Mitigation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Public prompt leakage&lt;/td&gt;
&lt;td&gt;Sapphire confidentiality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage snooping&lt;/td&gt;
&lt;td&gt;Client-side encryption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector DB exposure&lt;/td&gt;
&lt;td&gt;Encrypted embeddings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fake AI outputs&lt;/td&gt;
&lt;td&gt;ROFL signatures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metadata correlation&lt;/td&gt;
&lt;td&gt;Confidential execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend compromise&lt;/td&gt;
&lt;td&gt;Wallet authorization&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Is this Architecture good?
&lt;/h1&gt;

&lt;p&gt;Most Web3 AI projects today are not truly private.&lt;/p&gt;

&lt;p&gt;They usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store prompts publicly&lt;/li&gt;
&lt;li&gt;Leak retrieval context&lt;/li&gt;
&lt;li&gt;Expose embeddings&lt;/li&gt;
&lt;li&gt;Depend entirely on centralized APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oasis enables something different:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confidential AI infrastructure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is a much bigger opportunity than simple “AI on blockchain” narratives. So yes, this is huge.&lt;/p&gt;




&lt;h1&gt;
  
  
  Improvements (!)
&lt;/h1&gt;

&lt;p&gt;You can extend this architecture with:&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-Agent Systems
&lt;/h2&gt;

&lt;p&gt;Use multiple ROFL workers for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retrieval&lt;/li&gt;
&lt;li&gt;Ranking&lt;/li&gt;
&lt;li&gt;Moderation&lt;/li&gt;
&lt;li&gt;Inference&lt;/li&gt;
&lt;li&gt;Verification&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  zkML Integration
&lt;/h2&gt;

&lt;p&gt;Combine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ROFL confidentiality&lt;/li&gt;
&lt;li&gt;ZK proofs&lt;/li&gt;
&lt;li&gt;Verifiable inference&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Token-Gated Knowledge Access
&lt;/h2&gt;

&lt;p&gt;Require NFT or token ownership before retrieval.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-Chain Identity
&lt;/h2&gt;

&lt;p&gt;Use confidential reputation scores across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ethereum&lt;/li&gt;
&lt;li&gt;Base&lt;/li&gt;
&lt;li&gt;Arbitrum&lt;/li&gt;
&lt;li&gt;Solana&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Potential Real-World Use Cases
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Industry&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Healthcare&lt;/td&gt;
&lt;td&gt;Private medical copilots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finance&lt;/td&gt;
&lt;td&gt;Confidential portfolio AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gaming&lt;/td&gt;
&lt;td&gt;Hidden strategy agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Secure internal knowledge AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DAOs&lt;/td&gt;
&lt;td&gt;Private governance research&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity&lt;/td&gt;
&lt;td&gt;Confidential trust scoring&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Performance Considerations
&lt;/h1&gt;

&lt;p&gt;AI systems are expensive.&lt;/p&gt;

&lt;p&gt;Optimize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Embedding caching&lt;/li&gt;
&lt;li&gt;Batched retrieval&lt;/li&gt;
&lt;li&gt;Async inference&lt;/li&gt;
&lt;li&gt;Vector compression&lt;/li&gt;
&lt;li&gt;Partial encryption&lt;/li&gt;
&lt;li&gt;Event indexing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid pushing unnecessary data on-chain.&lt;/p&gt;

&lt;p&gt;The blockchain should coordinate trust, not store entire AI workloads.&lt;/p&gt;




&lt;h1&gt;
  
  
  Common Mistakes Developers Make
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Storing Raw AI Data On-Chain
&lt;/h2&gt;

&lt;p&gt;Never store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompts&lt;/li&gt;
&lt;li&gt;Embeddings&lt;/li&gt;
&lt;li&gt;Conversations&lt;/li&gt;
&lt;li&gt;User documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Directly on public chains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treating Frontend Encryption as Enough
&lt;/h2&gt;

&lt;p&gt;Frontend-only privacy still exposes backend operators.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ignoring Metadata Privacy
&lt;/h2&gt;

&lt;p&gt;Even transaction patterns can reveal sensitive information.&lt;/p&gt;




&lt;h1&gt;
  
  
  Production Architecture
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TB
    subgraph User Layer
        A[Wallet User]
        B[Next.js Frontend]
    end

    subgraph Confidential Layer
        C[Sapphire Smart Contract]
        D[ROFL Workers]
    end

    subgraph AI Layer
        E[Embedding Models]
        F[LLM Inference]
        G[Vector Database]
    end

    subgraph Storage Layer
        H[IPFS]
        I[Arweave]
    end

    A --&amp;gt; B
    B --&amp;gt; C
    B --&amp;gt; H
    C --&amp;gt; D
    D --&amp;gt; E
    D --&amp;gt; F
    D --&amp;gt; G
    H --&amp;gt; D
    I --&amp;gt; D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Closingg Thoughts
&lt;/h1&gt;

&lt;p&gt;The next generation of AI applications will not be won by the teams with the biggest models.&lt;/p&gt;

&lt;p&gt;They will be won by the teams that solve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Privacy&lt;/li&gt;
&lt;li&gt;Data ownership&lt;/li&gt;
&lt;li&gt;Confidential computation&lt;/li&gt;
&lt;li&gt;Verifiable inference&lt;/li&gt;
&lt;li&gt;User-controlled AI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oasis Sapphire and ROFL provide a powerful foundation for building that future.&lt;/p&gt;

&lt;p&gt;Instead of thinking about blockchain as "where data lives". think about it as a trust coordination layer for confidential AI systems.&lt;/p&gt;

&lt;p&gt;That shift changes everything.&lt;/p&gt;

&lt;h1&gt;
  
  
  Useful Resources
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Oasis Network
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://oasisprotocol.org" rel="noopener noreferrer"&gt;Oasis Network Official Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io" rel="noopener noreferrer"&gt;Oasis Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io/build/sapphire/" rel="noopener noreferrer"&gt;Sapphire Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io/build/rofl/" rel="noopener noreferrer"&gt;ROFL Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oasisprotocol" rel="noopener noreferrer"&gt;Oasis GitHub Organization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oasisprotocol/sapphire-paratime" rel="noopener noreferrer"&gt;Oasis Sapphire Examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io/build/tutorials/" rel="noopener noreferrer"&gt;Oasis Developer Tutorials&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ethereum / Smart Contract Development
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://book.getfoundry.sh" rel="noopener noreferrer"&gt;Foundry Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hardhat.org/docs" rel="noopener noreferrer"&gt;Hardhat Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.openzeppelin.com/contracts" rel="noopener noreferrer"&gt;OpenZeppelin Contracts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.ethers.org" rel="noopener noreferrer"&gt;Ethers.js Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Decentralized Storage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.ipfs.tech" rel="noopener noreferrer"&gt;IPFS Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pinata.cloud" rel="noopener noreferrer"&gt;Pinata IPFS Platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.arweave.org" rel="noopener noreferrer"&gt;Arweave Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web3.storage" rel="noopener noreferrer"&gt;Web3.Storage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI / Vector Databases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.sbert.net" rel="noopener noreferrer"&gt;Sentence Transformers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.trychroma.com" rel="noopener noreferrer"&gt;ChromaDB Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qdrant.tech/documentation/" rel="noopener noreferrer"&gt;Qdrant Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://python.langchain.com/docs/introduction/" rel="noopener noreferrer"&gt;LangChain Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.llamaindex.ai" rel="noopener noreferrer"&gt;LlamaIndex Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Frontend / Wallet Integration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs" rel="noopener noreferrer"&gt;Next.js Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wagmi.sh" rel="noopener noreferrer"&gt;Wagmi Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rainbowkit.com/docs/introduction" rel="noopener noreferrer"&gt;RainbowKit Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security / Cryptography
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://owasp.org/www-project-smart-contract-top-10/" rel="noopener noreferrer"&gt;OWASP Smart Contract Top 10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.trailofbits.com" rel="noopener noreferrer"&gt;Trail of Bits Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://consensysdiligence.github.io/smart-contract-best-practices/" rel="noopener noreferrer"&gt;Consensys Smart Contract Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rag</category>
      <category>web3</category>
      <category>ai</category>
      <category>development</category>
    </item>
    <item>
      <title>Building a Transparent Crypto Donation Ledger with Oasis Network (Beginner Tutorial)</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Mon, 20 Apr 2026 07:52:23 +0000</pubDate>
      <link>https://forem.com/rollingindo/building-a-transparent-crypto-donation-ledger-with-oasis-network-beginner-tutorial-5g9h</link>
      <guid>https://forem.com/rollingindo/building-a-transparent-crypto-donation-ledger-with-oasis-network-beginner-tutorial-5g9h</guid>
      <description>&lt;p&gt;Crypto donations are great for transparency… until your donors open a block explorer and see a wall of hashes.&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll build a &lt;strong&gt;simple, verifiable donation ledger&lt;/strong&gt; using Oasis Network, a blockchain that lets you combine &lt;strong&gt;privacy + transparency&lt;/strong&gt; using confidential smart contracts.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we’re building
&lt;/h2&gt;

&lt;p&gt;A minimal system where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Donations are recorded on-chain&lt;/li&gt;
&lt;li&gt;Expenses are recorded and linked to donations&lt;/li&gt;
&lt;li&gt;Anyone can see &lt;strong&gt;totals and categories (public)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Sensitive details stay &lt;strong&gt;private but provable&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;With Oasis Sapphire (its confidential EVM):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You write &lt;strong&gt;Solidity like Ethereum&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;But contract state can be &lt;strong&gt;encrypted&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You can expose only what matters (e.g. totals)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docs: &lt;a href="https://docs.oasis.io" rel="noopener noreferrer"&gt;https://docs.oasis.io&lt;/a&gt;&lt;br&gt;
Sapphire: &lt;a href="https://oasis.net/sapphire" rel="noopener noreferrer"&gt;https://oasis.net/sapphire&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 1: Setup your environment
&lt;/h2&gt;

&lt;p&gt;You can use Hardhat like a normal EVM chain:&lt;br&gt;
&lt;/p&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;oasis-ledger &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;oasis-ledger
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
npx hardhat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add Oasis Sapphire testnet config:&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;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;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&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;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;PRIVATE_KEY&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Write the smart contract
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;DonationLedger.sol&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract DonationLedger {

    struct Donation {
        address donor;
        uint amount;
    }

    struct Expense {
        uint amount;
        string category;
    }

    Donation[] public donations;
    Expense[] public expenses;

    uint public totalDonations;
    uint public totalSpent;

    function donate() external payable {
        donations.push(Donation(msg.sender, msg.value));
        totalDonations += msg.value;
    }

    function addExpense(uint _amount, string memory _category) external {
        expenses.push(Expense(_amount, _category));
        totalSpent += _amount;
    }

    function getBalance() public view returns (uint) {
        return totalDonations - totalSpent;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is intentionally simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fully transparent totals&lt;/li&gt;
&lt;li&gt;Expand later with private metadata (Oasis advantage)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 3: Deploy to Oasis Sapphire
&lt;/h2&gt;

&lt;p&gt;Create a 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;Ledger&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;DonationLedger&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;ledger&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;Ledger&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForDeployment&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;Deployed to:&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;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAddress&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;p&gt;Run:&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;
  
  
  Step 4: Interact with the contract
&lt;/h2&gt;

&lt;p&gt;Example (Hardhat console):&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 console &lt;span class="nt"&gt;--network&lt;/span&gt; sapphire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;ledger&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;getContractAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DonationLedger&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;DEPLOYED_ADDRESS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// donate&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;donate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;value&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="nf"&gt;parseEther&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.1&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="c1"&gt;// add expense&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addExpense&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="nf"&gt;parseEther&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.05&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;food&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// check totals&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;totalDonations&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;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;totalSpent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: Build a simple frontend (optional)
&lt;/h2&gt;

&lt;p&gt;Even a basic UI can transform usability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total donations&lt;/li&gt;
&lt;li&gt;Total spent&lt;/li&gt;
&lt;li&gt;Remaining balance&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Add buttons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Donate”&lt;/li&gt;
&lt;li&gt;“Add Expense” (admin)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;You can use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;ethers.js&lt;/li&gt;
&lt;li&gt;wagmi&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 6: Where Oasis shines (upgrade idea)
&lt;/h2&gt;

&lt;p&gt;Right now everything is public.&lt;/p&gt;

&lt;p&gt;With Oasis, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store &lt;strong&gt;private expense metadata&lt;/strong&gt; (e.g. invoice hashes)&lt;/li&gt;
&lt;li&gt;Keep donor notes confidential&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reveal only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;totals&lt;/li&gt;
&lt;li&gt;categories&lt;/li&gt;
&lt;li&gt;proofs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This is done using &lt;strong&gt;confidential state inside Sapphire contracts&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final result
&lt;/h2&gt;

&lt;p&gt;Instead of showing donors this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Here’s our wallet, go check Etherscan”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You show them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;€100k raised&lt;/li&gt;
&lt;li&gt;€40k spent on food&lt;/li&gt;
&lt;li&gt;€20k spent on shelter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And every number is still &lt;strong&gt;verifiable on-chain&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Using Oasis, you can build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transparent donation systems&lt;/li&gt;
&lt;li&gt;Clean public dashboards&lt;/li&gt;
&lt;li&gt;Private but provable accounting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All without leaving the EVM ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://oasis.net" rel="noopener noreferrer"&gt;https://oasis.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis.io" rel="noopener noreferrer"&gt;https://docs.oasis.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://oasis.net/sapphire" rel="noopener noreferrer"&gt;https://oasis.net/sapphire&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Privacy-Preserving Federated Learning on Oasis Network (Sapphire ParaTime)</title>
      <dc:creator>rayQu</dc:creator>
      <pubDate>Thu, 16 Apr 2026 09:21:10 +0000</pubDate>
      <link>https://forem.com/rollingindo/privacy-preserving-federated-learning-on-oasis-network-sapphire-paratime-5490</link>
      <guid>https://forem.com/rollingindo/privacy-preserving-federated-learning-on-oasis-network-sapphire-paratime-5490</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;In this tutorial, we’ll build an &lt;strong&gt;advanced machine learning system&lt;/strong&gt; on the Oasis Network using &lt;strong&gt;confidential smart contracts (Sapphire ParaTime)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of common examples (NFT auctions, oracles, etc.), we’ll implement:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Confidential Federated Learning with On-Chain Aggregation&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The key points on why this tutorial is really on point
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Data &lt;strong&gt;never leaves clients in plaintext&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Model updates are &lt;strong&gt;encrypted&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Aggregation happens &lt;strong&gt;inside TEEs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Fully &lt;strong&gt;privacy-preserving collaborative AI&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Clients (Hospitals / Devices)
|
| Encrypted Gradients
v
+-----------------------------+
| Oasis Sapphire ParaTime     |
|                             |
| - Decrypt gradients (TEE)   |
| - Aggregate updates         |
| - Update global model       |
+-----------------------------+
|
v
Clients download updated model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Oasis Sapphire (Confidential EVM)&lt;/li&gt;
&lt;li&gt;Solidity&lt;/li&gt;
&lt;li&gt;Python (PyTorch)&lt;/li&gt;
&lt;li&gt;Web3.py / ethers.js&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Smart Contract (Confidential Aggregator)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract ConfidentialFederatedLearning {

    struct Update {
        bytes encryptedGradient;
    }

    mapping(address =&amp;gt; Update) public updates;
    address[] public participants;

    bytes public globalModel;

    function submitUpdate(bytes calldata encryptedGradient) external {
        if (updates[msg.sender].encryptedGradient.length == 0) {
            participants.push(msg.sender);
        }

        updates[msg.sender] = Update(encryptedGradient);
    }

    function aggregate() external {
        bytes[] memory gradients = new bytes[](participants.length);

        for (uint i = 0; i &amp;lt; participants.length; i++) {
            gradients[i] = updates[participants[i]].encryptedGradient;
        }

        // Executed confidentially in Oasis Sapphire
        globalModel = confidentialAggregate(gradients);

        delete participants;
    }

    function confidentialAggregate(bytes[] memory gradients)
        internal
        returns (bytes memory)
    {
        // Placeholder logic (runs inside TEE)
        return abi.encodePacked("aggregated_model");
    }

    function getModel() external view returns (bytes memory) {
        return globalModel;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Local Training (PyTorch)
&lt;/h2&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;torch&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.nn&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.optim&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;optim&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SimpleModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&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;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&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="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;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&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;train_local&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;labels&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SimpleModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;optimizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;optim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SGD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;loss_fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;MSELoss&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zero_grad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&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;loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;loss_fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;backward&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;step&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;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;state_dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Serialize + Encrypt Updates
&lt;/h2&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;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;serialize_weights&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;weights&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;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&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;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Send Updates to Oasis
&lt;/h2&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="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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://testnet.sapphire.oasis.dev&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;YOUR_CONTRACT_ADDRESS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;abi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...]&lt;/span&gt;  &lt;span class="c1"&gt;# compiled ABI
&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;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;send_update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encrypted_gradient&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;account&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;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;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;submitUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;encrypted_gradient&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="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gas&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000000&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_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;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&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5: Trigger Aggregation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;trigger_aggregation&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;account&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;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;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;aggregate&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="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gas&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000000&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_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;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&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Fetch Global Model
&lt;/h2&gt;

&lt;p&gt;Once the Oasis network has aggregated all encrypted updates inside the confidential execution environment, clients can retrieve the updated global model.&lt;/p&gt;

&lt;p&gt;This step completes the federated learning cycle.&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_global_model&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;model_bytes&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;getModel&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;call&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;model_bytes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this stage, the returned model_bytes represent the latest version of the collaboratively trained model.&lt;/p&gt;

&lt;p&gt;In a real production system, this data would typically be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A serialized PyTorch/TensorFlow model&lt;/li&gt;
&lt;li&gt;Or compressed weight tensors&lt;/li&gt;
&lt;li&gt;Or even encrypted checkpoints for secure distribution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key idea is that the model itself becomes a shared decentralized artifact, continuously evolving without exposing any participant’s raw data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Use Case #1: Healthcare AI Across Hospitals
&lt;/h2&gt;

&lt;p&gt;One of the most impactful applications of this architecture is in healthcare machine learning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hospitals often cannot share patient data due to strict regulations such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GDPR (Europe)&lt;/li&gt;
&lt;li&gt;HIPAA (United States)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a major bottleneck:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Each hospital has only a partial view of reality.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As a result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disease prediction models are weaker&lt;/li&gt;
&lt;li&gt;Rare conditions are underrepresented&lt;/li&gt;
&lt;li&gt;AI generalization suffers significantly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solution Using Oasis Confidential ML
&lt;/h2&gt;

&lt;p&gt;With Oasis Sapphire, each hospital:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Trains a local model on private patient data&lt;/li&gt;
&lt;li&gt;Extracts gradients or weight updates&lt;/li&gt;
&lt;li&gt;Encrypts them automatically via confidential execution&lt;/li&gt;
&lt;li&gt;Sends updates to the shared aggregation contract&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Oasis network then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aggregates updates inside a Trusted Execution Environment (TEE)&lt;/li&gt;
&lt;li&gt;Prevents any party from seeing individual contributions&lt;/li&gt;
&lt;li&gt;Produces a globally improved model&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Works So Well
&lt;/h2&gt;

&lt;p&gt;Instead of centralizing sensitive data, we are centralizing intelligence, not information.&lt;/p&gt;

&lt;p&gt;This shift has massive implications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patient data never leaves hospitals&lt;/li&gt;
&lt;li&gt;Research collaboration becomes frictionless&lt;/li&gt;
&lt;li&gt;Models benefit from global diversity of data&lt;/li&gt;
&lt;li&gt;Compliance is preserved by design, not enforcement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, this enables systems like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Early disease detection models trained across continents&lt;/li&gt;
&lt;li&gt;Rare condition classifiers with global coverage&lt;/li&gt;
&lt;li&gt;Personalized treatment recommendation systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real Use Case #2: Cross-Bank Fraud Detection Network
&lt;/h2&gt;

&lt;p&gt;Another powerful application is in financial systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Banks face a paradox:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fraud detection improves with shared data&lt;/li&gt;
&lt;li&gt;But banks cannot share customer transaction data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fragmented fraud intelligence&lt;/li&gt;
&lt;li&gt;Delayed detection of new fraud patterns&lt;/li&gt;
&lt;li&gt;High false-negative rates&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solution: Confidential Federated Fraud Learning
&lt;/h2&gt;

&lt;p&gt;Using this architecture:&lt;/p&gt;

&lt;p&gt;Each bank:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trains a fraud detection model locally&lt;/li&gt;
&lt;li&gt;Learns patterns specific to its users&lt;/li&gt;
&lt;li&gt;Computes gradient updates privately&lt;/li&gt;
&lt;li&gt;Submits encrypted updates to Oasis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oasis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aggregates all updates confidentially&lt;/li&gt;
&lt;li&gt;Produces a global fraud detection model&lt;/li&gt;
&lt;li&gt;Sends improved model back to all participants&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The system effectively creates a collective fraud intelligence network without violating privacy.&lt;/p&gt;

&lt;p&gt;This leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster detection of new fraud patterns&lt;/li&gt;
&lt;li&gt;Cross-bank intelligence without data exposure&lt;/li&gt;
&lt;li&gt;Stronger anomaly detection models&lt;/li&gt;
&lt;li&gt;Reduced financial losses across the ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Full Training Loop Visualization
&lt;/h2&gt;

&lt;p&gt;Let’s now put everything together into a full lifecycle loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ROUND t (Federated Learning Cycle)

Client A (Hospital / Bank / Device)
    └── Train local model
    └── Compute gradients
    └── Encrypt updates
    └── Submit to Oasis

Client B
    └── Train
    └── Encrypt
    └── Submit

Client C
    └── Train
    └── Encrypt
    └── Submit

                ↓

     🔐 Oasis Sapphire TEE Layer
     ┌──────────────────────────────┐
     │ 1. Decrypt securely          │
     │ 2. Aggregate updates         │
     │ 3. Apply weighting (optional)│
     │ 4. Update global model       │
     └──────────────────────────────┘

                ↓

📦 Global Model Updated On-Chain

                ↓

Clients Pull Latest Model → Next Training Round
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Advanced Enhancements (Production-Level Thinking)
&lt;/h2&gt;

&lt;p&gt;At this stage, the system is already functional, but real-world deployments require additional sophistication.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Differential Privacy Layer
&lt;/h2&gt;

&lt;p&gt;To further strengthen privacy guarantees, we can inject controlled noise into model updates before submission.&lt;/p&gt;

&lt;p&gt;This ensures that even in edge cases, individual contributions cannot be reverse-engineered.&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_noise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;noisy_weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;noise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn_like&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;epsilon&lt;/span&gt;
        &lt;span class="n"&gt;noisy_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;noise&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;noisy_weights&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This technique is widely used in privacy-preserving ML systems and complements Oasis’s confidential execution layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Weighted Aggregation Strategy
&lt;/h2&gt;

&lt;p&gt;Not all participants contribute equally.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A hospital with 1M patients should have more influence than one with 1K&lt;/li&gt;
&lt;li&gt;A bank with higher transaction volume should contribute more signal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So instead of simple averaging, we apply weighted aggregation.&lt;/p&gt;

&lt;p&gt;This can be implemented inside the confidential contract layer to ensure fairness while preserving privacy.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Incentive Mechanism for Participants
&lt;/h2&gt;

&lt;p&gt;A real decentralized ML system must also include economic incentives.&lt;/p&gt;

&lt;p&gt;You can design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token rewards per valid update&lt;/li&gt;
&lt;li&gt;Slashing for malicious or low-quality gradients&lt;/li&gt;
&lt;li&gt;Reputation scoring for long-term contributors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This transforms the system into a self-sustaining AI network economy.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Hybrid ZK + Confidential ML Systems
&lt;/h2&gt;

&lt;p&gt;An even more advanced extension is combining:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero-Knowledge Proofs (ZKPs)&lt;/li&gt;
&lt;li&gt;Oasis confidential compute&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows participants to prove properties like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;'My model was trained correctly'&lt;/li&gt;
&lt;li&gt;'My data distribution satisfies constraints'&lt;/li&gt;
&lt;li&gt;'No poisoning attacks were introduced'&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without revealing any underlying data.&lt;/p&gt;

&lt;h2&gt;
  
  
  So Why Does This Architecture Matter
&lt;/h2&gt;

&lt;p&gt;What we built here is not just a federated learning system.&lt;/p&gt;

&lt;p&gt;It represents a shift in how machine learning systems are designed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;From centralized data collection → to decentralized intelligence collaboration&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Oasis enables something very rare in blockchain systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Computation on private data&lt;/li&gt;
&lt;li&gt;Without exposing the data itself&lt;/li&gt;
&lt;li&gt;While still preserving verifiability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This unlocks entirely new categories of AI systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Privacy-first foundation models&lt;/li&gt;
&lt;li&gt;Cross-organization collaborative AI&lt;/li&gt;
&lt;li&gt;Decentralized intelligence networks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where You Can Take This Next
&lt;/h2&gt;

&lt;p&gt;If you want to push this further (and it gets very interesting), you can extend this system into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confidential LLM fine-tuning networks&lt;/li&gt;
&lt;li&gt;Multi-agent decentralized reinforcement learning&lt;/li&gt;
&lt;li&gt;Privacy-preserving recommendation systems&lt;/li&gt;
&lt;li&gt;Genomics ML across research institutions&lt;/li&gt;
&lt;li&gt;Token-incentivized AI training marketplaces&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing Thought
&lt;/h2&gt;

&lt;p&gt;The combination of federated learning + confidential execution fundamentally changes what is possible in machine learning systems.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Where do we store the data?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We now ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do we learn from data without ever seeing it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that is exactly the space where Oasis Network becomes powerful.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>privacy</category>
      <category>machinelearning</category>
      <category>ai</category>
    </item>
    <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>
  </channel>
</rss>
