项目实训十三周:eEVM × 智康打卡勋章:在可信执行环境中打造可验证的健康激励系统

最近在做一些SGX的相关研究,简单写了一个在Linux里面跑EVM的代码,挂载到项目实训的区块链端,应该是可以直接用的,对前面的java调用啥的都没影响。 

关键词:eEVM、TEE、远程证明、健康打卡、NFT/SBT 勋章、可验证计算


1 项目背景

  • 优化的问题

    1. 数据造假:本地时间篡改、抓包脚本伪造请求,导致无效打卡。

    2. 隐私泄露:上传完整步数/位置数据易暴露敏感信息。

    3. 激励可信度不足:服务器说给就给,缺乏可公开验证的“荣耀感”。

解决思路:将打卡事件在 可信执行环境(TEE)里验证 → 生成最小化证明 → 上链存证 + 智能合约发放 NFT/SBT 勋章。轻量级、可嵌入的 eEVM 正好能在 TEE 里安全运行 EVM 字节码,完美契合。


2 eEVM 与 TEE 组合的优势

需求之前的方案eEVM + TEE 方案
本地防篡改客户端混淆、检测越狱打卡逻辑直接在 enclave 内执行,外部无法干预
隐私保护上传全部运动数据仅在 enclave 内校验步数阈值,链上存证明哈希
勋章发放可信依赖中心化 DB合约根据证明自动铸造/升级勋章,任何人可检查

3 系统总体架构

┌──────────────┐
│  智康移动端  │ ① 上传最小数据包
└────┬─────────┘
     │                                public chain
┌────▼─────────┐ ② enclave   ┌───────────────────────────────────┐
│ SGX Enclave  │────────────▶│  eEVM (lib)  │ 业务合约字节码     │
│  (Host层)    │ 验证步数阈值 │  执行打卡逻辑 │ 计算新徽章等级    │
└────┬─────────┘              └────┬──────────────────────────────┘
     │③ 生成Proof (签名+日志)      │④ 提交Tx
┌────▼─────────┐              ┌────▼─────────┐
│ Remote Attest│              │  合约 Badge  │ mint/upgrade NFT
└──────────────┘              └──────────────┘

关键组件

  1. 移动端 SDK

    • 收集最小化运动摘要:日期、步数区间(1000-1999、2000-2999 …)、设备 attestation 报文。

  2. SGX Enclave + eEVM

    • 自定义 Host 持久层:仅包含账户状态、当前合约 code。

    • 内部部署「打卡验证 & 勋章升级」合约字节码。

  3. 远程证明服务

    • 证明 enclave 未被篡改(MRENCLAVE)+ 输出哈希。

  4. 链上 Badge 合约(示例见 §5)

    • 映射 address ⇒ streak,根据 streak 自动 mint/升级 NFT/SBT。


4 合约逻辑拆分

模块功能部署位置
AttendanceVerifier检查当天是否有效打卡,更新 streak 计数enclave 内执行
BadgeNFT铸造/升级勋章;元数据包含等级、图标 URI公链
ProofRegistry存证 (proofHash → blockNumber)公链(可与 BadgeNFT 合约合并)
  • 重入保护:eEVM 内部调用顺序固定;链上合约使用 OpenZeppelin ReentrancyGuard

  • 费用优化:链上只存 proofHash(32 bytes)+ level,其余数据离线解析。


5 Solidity 示范片段

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";

contract BadgeNFT is ERC721URIStorage {
    mapping(address => uint32) public streak;   // 连续天数
    mapping(address => uint8)  public level;    // 勋章等级 0-5

    constructor() ERC721("ZKBadge", "ZKB") {}

    /// @dev 仅 enclave 可信账户调用
    function updateBadge(address user, uint32 newStreak, bytes32 proofHash)
        external
    {
        require(msg.sender == 0xEnclaveAddr, "not enclave");
        streak[user] = newStreak;

        uint8 newLevel = calcLevel(newStreak);
        if (level[user] < newLevel) {
            level[user] = newLevel;
            if (!_exists(tokenId(user))) {
                _safeMint(user, tokenId(user));
            }
            _setTokenURI(tokenId(user), uriForLevel(newLevel));
        }
        emit ProofStored(user, proofHash, block.number);
    }

    function calcLevel(uint32 s) internal pure returns (uint8) {
        if (s >= 100) return 5;
        if (s >= 60)  return 4;
        if (s >= 30)  return 3;
        if (s >= 15)  return 2;
        if (s >= 7)   return 1;
        return 0;
    }

    function tokenId(address a) internal pure returns (uint256) {
        return uint160(a); // 简单映射
    }

    function uriForLevel(uint8 l) internal pure returns (string memory) {
        return string(abi.encodePacked(
            "ipfs://Qm.../badge_", Strings.toString(l), ".json"));
    }

    event ProofStored(address indexed user, bytes32 proof, uint256 blk);
}

6 eEVM Host 接口要点

class EnclaveHost : public eevm::Host {
  std::unordered_map<eevm::Address, Account> accounts;
  // Storage ≈ 链上 view,用于连贯执行
public:
  std::optional<Account> account(const Address& addr) override {
      if (auto it = accounts.find(addr); it != accounts.end())
          return it->second;
      return std::nullopt;
  }

  void log(const LogEntry& le) override {
      // 收集事件;打包到 proofHash
  }

  // 其余接口: storage(), set_storage(), call_precompiled()...
};
  • Gas 计量:enclave 可以忽略手续费,但需配置最大步数防 DoS。

  • Proof 生成:将输入摘要 + 合约执行 trace → 哈希,再用 enclave 私钥签名。


7 端到端流程示例

  1. 用户打卡:App 发送 {"date":2025-05-20,"steps":4820} → HTTPS → SGX Server

  2. Enclave

    • 验签设备身份,校验步数阈值(≥ 3000 步)。

    • stepsRangedate 编码为 calldata 调用 AttendanceVerifier

    • eEVM 计算 newStreak = 16,输出 call to BadgeNFT.updateBadge(...)

    • Enclave 签名 proofHash,返回给外部客户机。

  3. 链上交易:服务端批量把 updateBadge+proof 打成 tx 发送;矿工验证合约代码,即可完成 mint/升级。

  4. 用户钱包 / 前端:读取 BadgeNFT 元数据,展示 15-day 勋章 → 30-day 候选进度条。


8 安全与性能评估

维度说明
完整性远程证明保证 enclave 软件身份;链上合约不可篡改。
隐私步数区间 + 日期;无精确 GPS / 心率。
吞吐单 enclave 每秒可执行数百次 eEVM 调用(opcode < 150)。批量聚合 tx 减少链上手续费。
扩展可并行多 enclave + L2 rollup,将 updateBadge 迁移到 zk-rollup 中进一步降费。

9 未来工作

  1. ZKP 证明替代 TEE 信任根:用 zkEVM 生成非交互式证明,彻底消除对 SGX 的信任假设。

  2. 跨平台 SDK:iOS Secure Enclave + Android Trusted Execution Environment 通用实现。

  3. 社交分享:勋章 SBT 上嵌入可视化 SVG,用户可一键同步至 Lens / CyberConnect。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值