最近在做一些SGX的相关研究,简单写了一个在Linux里面跑EVM的代码,挂载到项目实训的区块链端,应该是可以直接用的,对前面的java调用啥的都没影响。
关键词:eEVM、TEE、远程证明、健康打卡、NFT/SBT 勋章、可验证计算
1 项目背景
-
优化的问题
-
-
数据造假:本地时间篡改、抓包脚本伪造请求,导致无效打卡。
-
隐私泄露:上传完整步数/位置数据易暴露敏感信息。
-
激励可信度不足:服务器说给就给,缺乏可公开验证的“荣耀感”。
-
解决思路:将打卡事件在 可信执行环境(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
└──────────────┘ └──────────────┘
关键组件
-
移动端 SDK
-
收集最小化运动摘要:日期、步数区间(1000-1999、2000-2999 …)、设备 attestation 报文。
-
-
SGX Enclave + eEVM
-
自定义
Host
持久层:仅包含账户状态、当前合约 code。 -
内部部署「打卡验证 & 勋章升级」合约字节码。
-
-
远程证明服务
-
证明 enclave 未被篡改(MRENCLAVE)+ 输出哈希。
-
-
链上 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 端到端流程示例
-
用户打卡:App 发送
{"date":2025-05-20,"steps":4820}
→ HTTPS → SGX Server -
Enclave
-
验签设备身份,校验步数阈值(≥ 3000 步)。
-
将
stepsRange
、date
编码为 calldata 调用AttendanceVerifier
。 -
eEVM 计算 newStreak = 16,输出 call to
BadgeNFT.updateBadge(...)
。 -
Enclave 签名
proofHash
,返回给外部客户机。
-
-
链上交易:服务端批量把 updateBadge+proof 打成 tx 发送;矿工验证合约代码,即可完成 mint/升级。
-
用户钱包 / 前端:读取
BadgeNFT
元数据,展示 15-day 勋章 → 30-day 候选进度条。
8 安全与性能评估
维度 | 说明 |
---|---|
完整性 | 远程证明保证 enclave 软件身份;链上合约不可篡改。 |
隐私 | 步数区间 + 日期;无精确 GPS / 心率。 |
吞吐 | 单 enclave 每秒可执行数百次 eEVM 调用(opcode < 150)。批量聚合 tx 减少链上手续费。 |
扩展 | 可并行多 enclave + L2 rollup,将 updateBadge 迁移到 zk-rollup 中进一步降费。 |
9 未来工作
-
ZKP 证明替代 TEE 信任根:用 zkEVM 生成非交互式证明,彻底消除对 SGX 的信任假设。
-
跨平台 SDK:iOS Secure Enclave + Android Trusted Execution Environment 通用实现。
-
社交分享:勋章 SBT 上嵌入可视化 SVG,用户可一键同步至 Lens / CyberConnect。