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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
