关于 Stellaroid Earn
Stellaroid Earn 是 Stellar 测试网上用于发行、验证链上凭证并通过托管向毕业生付款的应用。它提供公开凭证页面和移动优先的 PWA;项目目前已暂停开发,仅维护现有演示和证据。
主要功能
- 01在链上登记并验证凭证证明
- 02无需登录的公开验证页面
- 03带里程碑付款的托管机会
- 04浏览托管事件与活动记录
- 05可安装的移动优先 PWA
适用场景
- 01发行可供独立核验的训练营凭证
- 02供雇主审阅证明并为付费试用注资
- 03跟踪里程碑提交、付款释放和退款
- 04演示 Stellar 测试网上的凭证与托管流程
MCP 相关
提供的 README 介绍了 Stellaroid Earn 应用和 Stellar 合约,但未提及 MCP 服务。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://stellaroid.tech/api/mcpclaude mcp add --transport http iron-mark-stellaroid-earn https://stellaroid.tech/api/mcp{"mcpServers":{"iron-mark-stellaroid-earn":{"type":"http","url":"https://stellaroid.tech/api/mcp"}}}在 Cursor 中打开{"servers":{"iron-mark-stellaroid-earn":{"type":"http","url":"https://stellaroid.tech/api/mcp"}}}在 VS Code 中打开{"mcpServers":{"iron-mark-stellaroid-earn":{"type":"http","url":"https://stellaroid.tech/api/mcp"}}}{"mcpServers":{"iron-mark-stellaroid-earn":{"serverUrl":"https://stellaroid.tech/api/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
6| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| hash | string | 是 |
详细介绍
Stellaroid Earn
适用于链上凭证的可复用证明、验证与支付基础组件,为 Stellar PH Bootcamp 2026 构建
在 Stellar 测试网上向毕业生颁发凭证、验证并支付:Soroban 智能合约,支持 8 种钱包及用于移动端的 WalletConnect(Freighter、Albedo、LOBSTR、xBull 等),可安装的 PWA,端到端支持。

| 在线演示 | stellaroid.tech |
| 合约(当前) | CAD6C24POQGRYXMBNBEGVDHUROF5ZC37XRDC6NCVILTXWMYJIBMISZCV |
| 交易证据 | 初始化 · 注册 · 验证 |
| 源码验证 | 已部署 WASM 的哈希为 1b7479f1ca0f12846bbfdd8f0681670692e29e1f20618150912f010b7caf4b9f。重新构建 v3.0.0 发布标签可逐字节复现该哈希;已部署的字节码会记录自身的构建工具链(rsver 1.95.0、rssdkver 26.1.0、cliver 27.0.0),因此无需信任此 README 即可自行检查。由 contract-verification.yml 每周验证。操作手册:docs/operations/contract-verification.md。 |
| 参赛项目 | Rise In · Stellar Smart Contract Bootcamp · Stellar PH Bootcamp 2026 |
| 成绩 | 105 位参赛者中排名前 5 · 得分:75.00 · 完整历程 |

项目状态
训练营/活动提交已完成,项目已归档。维护工作会保留现有的 Stellar 测试网演示和证据;产品开发目前未进行。
- 路线图:
ROADMAP.md - 维护检查:
MAINTENANCE.md - 文档索引:
docs/README.md - 发布与部署:
docs/operations/release-and-deployment.md - 专业研究接收状态:
docs/planning/research-intake-status.md - 演示清单:
docs/operations/demo-checklist.md - 规范线上 URL:
stellaroid.tech - 运行状态路由:
/status - 试点申请路由:
/pilot - 案例研究(构建与验证过程):
/case-study - 交接文档(仓库状态、不变量、待办事项):
HANDOFF.md - 推广活动与发布图片:
assets/campaign/,包括时长为 2 分钟的宣传演示stellaroid-promotional-demo.mp4
www.stellaroid.tech 和 earn.stellaroid.tech 会重定向到规范主域名 URL。
版本存档
每个按月构建周期都会以固定快照形式保存在指定子域名上,独立于线上站点:
| 版本 | 周期 | 快照 |
|---|---|---|
| v1 | 4 月 | v1.stellaroid.tech |
| v2 | 6 月 | v2.stellaroid.tech |
| v3 | 7 月 | v3.stellaroid.tech |
| v4 | 8 月(当前) | v4.stellaroid.tech |
stellaroid.tech 始终提供最新的生产构建(main)。4 月的源代码位于 april-bootcamp-and-monthly-builder 分支;6 月、7 月和 8 月的源代码分别位于 june-monthly-builder、july-monthly-builder 和 august-monthly-builder 分支。7 月是只读存档。8 月是当前线上运行的月度构建分支,v4.stellaroid.tech 提供其 Vercel 部署版本。
7 月 v3.2 产品功能
- 无需钱包的引导演示 -
/demo:通过真实的预置测试网数据完整展示注册 → 验证 → 托管 → 付款流程(包括一笔已释放的 25 XLM 托管款和一笔仍在进行且已注资的托管款),并为每个步骤提供 stellar.expert 审计链接。无需钱包或扩展程序,也可在手机上使用。 - 机会目录 -
/opportunity:列出合约中所有正在进行的付费试用托管项目,并提供按钱包筛选的选项(为你创建/由你创建),以及跳转到里程碑控制台的深层链接。 - 实时托管凭证 - 状态页和活动动态现在会解码所有托管事件(创建/注资/提交/批准/释放/退款)以及凭证事件,并对 RPC 和 Stellar Expert 索引器中的事件去重;
/app会显示与你已连接钱包相关的事件。 - 现场试点项目申请 -
/pilot提供了真正的潜在客户信息收集表单(设有速率限制和蜜罐防护,通过电子邮件发送),而非外链;此外还提供/contact、内容坦诚的隐私与条款页面,以及符合 RFC 9116 的security.txt。 - 性能优化 - 多 MB 的 stellar-sdk 已从所有路由的 First Load JS 中改为延迟加载(
/app的压缩后体积从 483 KB 降至约 260 KB);品牌字体(Orbitron/Exo 2)通过next/font自托管;第一方客户端错误遥测会将运行时故障报告到服务器日志,不依赖第三方服务。 - 可安装的 PWA - 提供带可遮罩图标的清单、服务工作线程(页面优先联网、离线回退、按部署版本管理缓存;验证页面绝不会从缓存提供)以及 iOS 启动画面。访问线上网站后,可将其添加到手机主屏幕。
- 移动优先的重新设计 - 采用应用风格的底部导航和“更多”面板、自动隐藏的页眉、底部弹出式对话框,并全面适配安全区域和刘海屏。
- 开发者文档中心 -
/docs:包括合约参考(线上版本标签 v3.0.0:19 个函数、17 个错误代码;源码还包含刷新/过期写入)、集成指南、架构说明和安全态势。 - 内容引擎 - 面向不同受众的落地页,涵盖训练营、雇主和毕业生付款;另有指南库和可验证凭证术语表——所有页面均包含 FAQPage/HowTo/DefinedTermSet 结构化数据和
llms.txt。 - 多钱包签名 - 原生支持 Freighter 和 Albedo;通过 WalletConnect 支持移动钱包(LOBSTR、xBull、Hana、Freighter mobile);并提供本地桌面选择器,可通过钱包 API 直接连接 xBull、Rabet、LOBSTR、Hana、Klever 和 Bitget。桥接 SDK 会在首次使用时加载。配置 Reown 项目 ID 后即可启用 WalletConnect。参阅钱包集成说明。
公开入口流程围绕三类角色展开:Issue、Verify 和 Hire。已验证的凭证页面现在会将雇主引导至
/employer,并预先填入凭证哈希和候选人的钱包地址,然后要求完成审核清单才能创建托管。页面还会将招聘人员引导至/talent/<address>?proof=<hash>,以便候选人护照展示已知凭证,而不会假装目前已支持钱包级别的凭证发现。签发方注册现在会在签名之前说明审批准备情况,而/pilot则将首次推广限定为小规模测试网签发方试点。雇主凭证包包含适合招聘人员查看的摘要,以及针对 W3C VC 2.0 和 Open Badges 3.0 映射的未签名标准对齐预览。该预览目前还不是签名后的标准凭证。
30 秒介绍
**问题:**训练营证书是任何人都能伪造的 PDF,而且没人能独立验证。雇主要么跳过验证,要么付费使用背景调查服务。
**解决方案:**Stellaroid Earn 将凭证哈希锚定在 Soroban 智能合约上。获批的签发方可在合约上注册并验证证书;任何人都能通过公开网址查看凭证,无需登录;雇主则可在 Stellar 测试网上用 XLM 向毕业生付款,所有操作都在链上完成。
**为何选择 Stellar:**低于 1 美分的手续费和 5 秒的最终确认时间,让签发凭证的成本低到不值得跳过。任何人都可以使用 simulateTransaction 验证凭证,无需设置钱包。通过 SAC 使用原生 XLM,可在同一条链上打通从凭证验证到付款的完整流程。

功能展示
![]() 发现 - 首页展示 3 步操作流程 |
![]() 验证 - 链上凭证带有绿色「已验证」徽章 |
![]() 签发与付款 - 面向签发方和雇主的双角色仪表板 |
![]() 分享 - 可在任何移动浏览器中扫描二维码的凭证卡片 |
实时信任凭证
每份凭证都会生成一个公开的已验证徽章网址——无需钱包、无需登录、无需 API 密钥。绿色表示已在链上验证。琥珀色表示已签发但尚未验证。
![]() 已验证 亲自试试 → |
![]() 已签发(锁定) 亲自试试 → |
Stellar Expert 上的合约:CAD6C24P…ISZCV

架构
sequenceDiagram
autonumber
actor Issuer as Approved Issuer
actor Student
actor Employer
participant FE as Stellaroid Earn (Next.js)
participant FR as Freighter
participant SC as Soroban contract<br/>(stellaroid_earn)
participant XLM as Stellar testnet
Issuer->>FE: Open /app, paste student wallet + cert hash
FE->>FR: requestAccess + signTransaction(register_certificate)
FR->>XLM: Submit tx
XLM->>SC: register_certificate(issuer, student, hash, title, cohort, uri)
SC-->>XLM: cert_reg event
Issuer->>FE: Click "Approve credential"
FE->>FR: signTransaction(verify_certificate)
FR->>XLM: Submit tx
XLM->>SC: verify_certificate(verifier, hash)
SC-->>XLM: cert_ver event
Student->>FE: Share /proof/<hash> (QR or link)
Note over FE,SC: Read-only get_certificate via simulateTransaction
Employer->>FE: Open /app as Employer, paste hash + amount
FE->>FR: signTransaction(link_payment)
FR->>XLM: Submit tx (XLM transfer + payment event)
设计决策:
- 使用 soroban-sdk 26.1 和带类型的
#[contracterror]枚举(17 个变体)、持久化存储 + 实例存储,以及 518k/1.04M 账本的 TTL - 发行方信任层:自行注册 → 管理员批准 → 颁发凭证。被暂停的发行方会在链上遭到拦截
- 两种读取路径:服务端 RSC 配合
revalidate=60(由 CDN 缓存的证明页面)+ 客户端simulateTransaction(仪表板状态) - 一种写入路径:Freighter 签名 →
sendTransaction→ 轮询结果 - CSP 将
connect-src限定为*.stellar.org和 WalletConnect 中继,不允许其他第三方源
合约集成(前端到 Soroban)
前端通过 @stellar/stellar-sdk 与已部署的 stellaroid_earn 合约通信。客户端代码位于 frontend/src/lib/contract-client.ts(写入 + 客户端读取)和 frontend/src/lib/contract-read-server.ts(服务端渲染的证明页面)。SDK 会延迟加载,避免其数 MB 的包影响每个路由的首次加载。
// frontend/src/lib/contract-client.ts
import type * as StellarSdk from "@stellar/stellar-sdk";
// Lazy-load the SDK once, on the first contract read or wallet action.
const getSdk = () => import("@stellar/stellar-sdk");
// READ (no wallet): simulate an invocation against Soroban RPC.
const server = new sdk.rpc.Server(appConfig.rpcUrl);
const sim = await server.simulateTransaction(tx);
const value = sdk.scValToNative(sim.result.retval);
// WRITE: build with TransactionBuilder, wallet signs, submit + poll.
const tx = new sdk.TransactionBuilder(account, {
fee: sdk.BASE_FEE,
networkPassphrase: getExpectedNetworkPassphrase(),
})
.addOperation(
sdk.Operation.invokeContractFunction({
contract: appConfig.contractId, // NEXT_PUBLIC_SOROBAN_CONTRACT_ID
function: method, // e.g. "verify_certificate"
args, // sdk.nativeToScVal(...) per argument
}),
)
.setTimeout(30)
.build();
const signedXdr = await wallet.sign(tx.toXdr()); // The selected wallet provider
const sent = await server.sendTransaction(sdk.TransactionBuilder.fromXdr(signedXdr, passphrase));
const result = await server.pollTransaction(sent.hash);
每个公开合约函数在客户端中都有对应的带类型封装。封装会将准确的合约函数名称传递给 Operation.invokeContractFunction:
合约函数(contracts/stellaroid_earn/src/lib.rs) | 前端封装(contract-client.ts) |
|---|---|
register_issuer | registerIssuer() |
approve_issuer | approveIssuer() |
suspend_issuer | suspendIssuer() |
get_issuer | getIssuer()(读取 / simulateTransaction) |
register_certificate | registerCertificate() |
verify_certificate | verifyCertificate() |
get_certificate | getCertificate()(读取 / simulateTransaction) |
revoke_certificate | revokeCertificate() |
suspend_certificate | suspendCertificate() |
reward_student | rewardStudent() |
link_payment | linkPayment() |
create_opportunity | createOpportunity() |
fund_opportunity | fundOpportunity() |
submit_milestone | submitMilestone() |
approve_milestone | approveMilestone() |
release_payment | releasePayment() |
refund_opportunity | refundOpportunity() |
get_opportunity | getOpportunity()(读取 / simulateTransaction) |
NEXT_PUBLIC_STELLAR_NETWORK_PASSPHRASE 中的网络通行短语必须与合约部署所在的网络(testnet)一致,否则钱包会拒绝签名。
快速开始
前置条件
- Rust(stable)+
wasm32v1-none目标 - Stellar CLI v26+
- Node.js 20+ 和 npm
- Freighter 浏览器扩展,设置为 Testnet
完整设置指南:docs/reference/pre-workshop-setup-guide.pdf
智能合约
cd contracts/stellaroid_earn
make test # cargo test (contract suite)
make build # builds wasm32v1-none target
# Deploy to testnet
stellar keys generate my-key --network testnet --fund
stellar contract deploy \
--wasm target/wasm32v1-none/release/stellaroid_earn.wasm \
--source my-key --network testnet
CI 使用 cargo test -p stellaroid_earn --locked 和 cargo build -p stellaroid_earn --target wasm32v1-none --release --locked 在 Contract CI 中运行合约门禁。
前端
cd frontend
cp .env.example .env.local # fill in contract ID + read address
npm install
npm run dev # http://localhost:3000
环境变量(.env.local):
NEXT_PUBLIC_STELLAR_RPC_URL=https://soroban-testnet.stellar.org
NEXT_PUBLIC_STELLAR_NETWORK=TESTNET
NEXT_PUBLIC_STELLAR_NETWORK_PASSPHRASE=Test SDF Network ; September 2015
NEXT_PUBLIC_SOROBAN_CONTRACT_ID=<your deployed contract ID>
NEXT_PUBLIC_STELLAR_ADMIN_ADDRESS=<your admin G... address>
NEXT_PUBLIC_STELLAR_READ_ADDRESS=<any funded testnet address for read-only calls>
NEXT_PUBLIC_SOROBAN_ASSET_ADDRESS=CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC
NEXT_PUBLIC_SOROBAN_ASSET_CODE=XLM
NEXT_PUBLIC_SOROBAN_ASSET_DECIMALS=7
NEXT_PUBLIC_STELLAR_EXPLORER_URL=https://stellar.expert/explorer/testnet
NEXT_PUBLIC_CANONICAL_URL=https://stellaroid.tech
可验证的链上记录
演示流程中的每个操作都是真实的 Stellar 测试网交易。点击任意哈希,即可在 Stellar Expert 上验证。
| 操作 | 交易哈希 | 结果 |
|---|---|---|
init | faf278d7…85e6 | 使用管理员和 XLM 代币初始化合约 |
register_certificate | 8c20a944…a0e8 | 为学生注册演示凭证哈希 |
verify_certificate | 67137aa8…2cb9 | 状态更改为已验证 |
有效证书(测试网,合约 CAD6C24P…):
| 哈希 | 群组 | 状态 |
|---|---|---|
c02ce160…aea3 | Stellar PH 训练营 2026 | 已验证 |
有效测试网合约 CAD6C24P… 的标签为 v3.0.0(19 个函数)。此源代码树中包含三项刷新和过期写入操作;在重新部署之前,不会对该 WASM 使用这些操作。
合约函数
| 函数 | 调用方 | 描述 |
|---|---|---|
init(admin, token) | 部署者 | 使用管理员地址和 XLM 代币初始化合约 |
register_issuer(address, name, website, category) | 任何人 | 提交发行方申请(待处理状态) |
approve_issuer(admin, issuer) | 管理员 | 批准发行方注册凭证 |
suspend_issuer(admin, issuer) | 管理员 | 暂停行为不当的发行方 |
refresh_issuer(actor, issuer) | 发行方或管理员 | 存储刷新日期并延长发行方 TTL(重新部署之前仅存在于源代码中) |
get_issuer(issuer) | 任何人 | 读取发行方记录和状态 |
register_certificate(issuer, student, cert_hash, title, cohort, metadata_uri) | 已批准的发行方 | 为毕业生注册凭证哈希 |
verify_certificate(issuer, cert_hash) | 管理员或发行方 | 将凭证标记为已验证 |
revoke_certificate(issuer, cert_hash) | 管理员或发行方 | 永久撤销凭证 |
suspend_certificate(issuer, cert_hash) | 管理员或发行方 | 暂时停用凭证 |
set_credential_expiry(actor, cert_hash, expires_at) | 发行方或管理员 | 设置或清除有效期(重新部署之前仅存在于源代码中) |
renew_certificate(actor, cert_hash, expires_at) | 发行方或管理员 | 延长已过期的有效期,并恢复为已颁发或已验证状态(重新部署之前仅存在于源代码中) |
reward_student(student, cert_hash, amount) | 管理员 | 由管理员发起的 XLM 付款,支付给毕业生 |
link_payment(employer, student, cert_hash, amount) | 雇主 | 雇主向毕业生支付 XLM,并关联凭证 |
get_certificate(cert_hash) | 任何人 | 读取完整凭证记录和状态 |
create_opportunity(employer, candidate, cert_hash, title, amount, milestone_count) | 雇主 | 针对已验证凭证创建付费试用托管 |
fund_opportunity(employer, opp_id) | 雇主 | 将全部试用款项托管到合约中 |
submit_milestone(candidate, opp_id) | 候选人 | 将下一个里程碑标记为已交付 |
approve_milestone(employer, opp_id) | 雇主 | 批准已提交的里程碑 |
release_payment(employer, opp_id) | 雇主 | 将已批准里程碑对应的款项支付给候选人 |
refund_opportunity(employer, opp_id) | 雇主 | 将剩余托管资金退还给雇主 |
get_opportunity(opp_id) | 任何人 | 读取付费试用机会记录 |
凭证状态生命周期
Issued --> Verified (issuer or admin calls verify_certificate)
--> Revoked (issuer or admin calls revoke_certificate)
--> Suspended (issuer or admin calls suspend_certificate)
--> Expired (past a nonzero expires_at window; renew_certificate restores Issued or Verified)
测试
契约测试涵盖信任层、访问控制、撤销、机会托管、里程碑上限、发行方刷新日期、凭证过期和事件:
running 15 tests
test test::t1_happy_path_with_approved_issuer ... ok
test test::t2_unapproved_issuer_cannot_issue ... ok
test test::t3_suspended_issuer_cannot_issue ... ok
test test::t4_wrong_approved_issuer_cannot_verify ... ok
test test::t5_revoked_credential_blocks_payment ... ok
test test::t6_issuer_events_emit ... ok
test result: ok. 15 passed; 0 failed; 0 ignored
| 测试 | 验证内容 |
|---|---|
| t1 | 正常流程:已获批准的发行方注册并验证凭证,管理员奖励学生 |
| t2 | 待审批(未获批准)的发行方无法注册凭证 |
| t3 | 已暂停的发行方无法注册凭证 |
| t4 | 已获批准的发行方 A 无法验证发行方 B 的凭证 |
| t5 | 已撤销的凭证会阻止后续付款 |
| t6 | init、register_issuer、approve_issuer 正确触发事件 |
| t7-t10 | 机会创建、注资、提交、批准、发放、退款及无效状态转换行为 |
| t11 | 机会的里程碑数量设有上限,以防止工作量或渲染量不受限制 |
| t12 | 候选人提交后,雇主可以退款,以避免托管资金被锁定 |
| t13 | 发行方记录包含注册和刷新日期;只有发行方或管理员可以刷新 |
| t14 | 凭证过期后会阻止付款;续期后可恢复 Verified 访问权限 |
| t15 | 无法为已撤销的凭证设置过期时间或续期 |
安全
完整安全检查清单:docs/reference/security.md
涵盖:智能合约访问控制、前端 CSP/HSTS/X-Frame-Options、严格的输入验证、JSON-LD 转义、URL 清理、证明声明完整性、费用赞助方限制、错误规范化、SSRF 防护和运维安全。
高级功能:费用赞助(免 Gas 交易)
Stellaroid Earn 将 费用提升交易 支持(CAP-0015)置于服务器到服务器的授权边界之后。公开的浏览器客户端不会自动向 /api/fee-bump 发送已签名的 XDR。
工作原理:
- 受信任的服务器获取用户为允许的 Stellaroid Earn 方法签名的交易
- 受信任的服务器使用
Authorization: Bearer <FEE_SPONSOR_TOKEN>调用/api/fee-bump - 路由会检查 XDR 大小、签名、操作数量、网络、合约 ID、方法允许列表和费用上限
- 只有通过检查后,赞助方密钥才会将交易封装为费用提升交易
实现:
- 服务端路由:
frontend/src/app/api/fee-bump/route.ts - 请求策略:
frontend/src/lib/fee-bump-policy.ts - 配置:
FEE_SPONSOR_SECRET+FEE_SPONSOR_TOKEN仅供服务端使用。公开浏览器自动赞助功能保持禁用;受信任的服务端调用方必须显式提供 bearer token。 - 浏览器回退方案:默认使用用户自行付费的普通 Freighter 交易。
指标与监控
- 状态指标:
/status#metrics- 状态页面上的公开合约事件证据、证明哈希、奖励/付款事件和来源标签 - 健康检查端点:
/api/health- 缓存的 JSON 健康检查(配置、RPC 延迟、合约可用性) - 事件 API:
/api/events- 面向外部使用者的结构化合约事件数据 - 事件流:
/api/events/stream- 短时有效的 Server-Sent Events 流,用于实时演示刷新,无需添加数据库 - MCP 服务:
/api/mcp- 只读远程 Model Context Protocol 端点(Streamable HTTP,无需身份验证),供 AI Agent 验证凭证、查看发行方并浏览已托管的付费试用;基于 Vercel 的mcp-handler和官方 MCP TypeScript SDK 构建 - Vercel Analytics: 页面分析,以及用于分享证明、下载证明包、雇主交接、保存候选名单和开始托管等操作的隐私安全自定义事件

数据索引
合约事件从两个公开来源读取。应用首先通过 Soroban RPC getEvents 查询近期合约事件,然后使用 Stellar Expert 的公开合约事件索引补充结果,这样当 RPC 的保留窗口向前滚动时,较早的测试网活动仍会显示在演示页面中。事件会尽可能从 ScVal/XDR 解码,按类型(cert_reg、cert_ver、reward、payment)分类、去重并标注来源,然后通过 /api/events、/api/events/stream 和 /status#metrics 提供。
这仍是一个轻量级的无服务器证据层,并非完整的分析数据仓库。Vercel 页面分析和自定义事件有助于了解用户对凭证分享和雇主流程的兴趣,且不会存储原始钱包地址或证明哈希;持久化证明历史、发行方转化情况和长期产品分析仍需要一套第一方读取模型。
技术栈
| 组件 | 版本 |
|---|---|
| Soroban SDK | 已部署 26.1.0(v3.0.0);当前清单为 ^27.0.2,锁定版本为 27.0.6 |
| Stellar CLI | 26+ |
| Next.js | 16.3.8(App Router) |
| React | 19 |
| @stellar/stellar-sdk | ^17.0.0 |
| @stellar/freighter-api | ^6.0.1 |
| @albedo-link/intent | ^0.13.0 |
| Tailwind CSS | v4 |
| PWA | manifest + service worker + iOS 启动画面集 |
项目结构
stellaroid-earn/
├── Cargo.toml # Rust workspace (Soroban contract)
├── contracts/
│ └── stellaroid_earn/
│ ├── src/
│ │ ├── lib.rs # Soroban credential + payment contract
│ │ └── test.rs # contract security and lifecycle tests
│ ├── Makefile # build / test / fmt / clean targets
│ └── Cargo.toml
├── frontend/
│ ├── src/
│ │ ├── app/ # Next.js App Router pages
│ │ │ ├── app/ # Participant dashboard (issuer + employer)
│ │ │ ├── issuer/ # Issuer registration + lookup
│ │ │ └── proof/[hash]/ # Public shareable verified badge
│ │ ├── components/ # UI components (proof card, wallet, badges)
│ │ ├── hooks/ # Freighter wallet state
│ │ └── lib/ # Contract client, RPC helpers, types
│ └── .env.example
├── docs/ # Product docs, setup references, operations, and archives
├── demo/ # Demo script, FAQ, press kit
├── images/ # README screenshots
├── scripts/ # Screenshot capture and operations scripts
├── LICENSE
└── README.md
演示视频
活动剪辑(2026-08): assets/campaign/stellaroid-promotional-demo.mp4
两分钟的 stellaroid.tech 线上演示,配有旁白:落地页、无需钱包的
/demo导览、已验证的证明、雇主交接,以及机会目录。Stellar 测试网,不涉及真实资金。
提交版剪辑: demo/stellaroid-earn-demo.mp4
完整演示:落地页 → 关于 → 应用仪表板(连接钱包)→ 发行方控制台 → 已验证的证明页面 → Stellar Expert 上的链上证据。
两个视频都已提交到此代码库,因此链接不会因外部上传地址过期而失效。
Demo Day 幻灯片: /slides(已集成到应用中,可使用方向键浏览)
提交/演示检查清单: docs/operations/demo-checklist.md
提交证据索引: docs/operations/submission-evidence.md
用户验证
62 个测试网钱包账户(目标为 50 个)
Stellaroid Earn 已记录 62 个具有公开网络活动的测试网钱包账户,超过了 50 个的目标。这一总数由两组构成:测试网评审中的 30 个独立参与者钱包,以及 32 个由我本人运营的受控 QA 账户,用于结构化产品验证(24 个来自 7 月的引导式用户组,另有 8 个来自 8 月的 QA 批次)。下方列出了两组账户的完整清单,每个钱包和交易都链接到 Stellar Expert。
这 32 个 QA 账户明确标记为 QA 用户画像,不代表独立个体。因此,上述数字表示具有真实网络活动的钱包账户覆盖量,并不意味着有 62 位不同用户;独立参与者人数仍为 30。此前该数字为 54(30 个独立参与者账户加 24 个 QA 账户)。
测试网钱包证据
此处列出了 Stellar 测试网评审中 30 个独立参与者的钱包地址,供公众查阅。每个钱包地址都可在 Stellar Expert 上核验。一些钱包有 register_issuer 等直接合约交互;其他则是在评审流程中使用的已注资参与者钱包。已提交的反馈快照对参与者姓名和电子邮件地址进行了脱敏。
查看全部 30 个独立参与者的钱包地址
构成 62 个账户总数的另外 32 个 QA 账户地址,分别列于[引导式 QA 证据日志](docs/operations/guided-qa-cohort-2026-07.md)(24 个 7 月账户)和 [2026 年 8 月 QA 批次日志](docs/operations/guided-qa-wave-2026-08.md)(我运营的另外 8 个账户)中,因此每组都可以单独核查。 | # | Wallet Address | Verified On-Chain | |---|---------------|-------------------| | 1 | `GCBBBLZVJVVM2ZMXPNMDN2ATH7AJ2H4BHOKA7JOJT6EMWTOKCGRKUK6I` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GCBBBLZVJVVM2ZMXPNMDN2ATH7AJ2H4BHOKA7JOJT6EMWTOKCGRKUK6I) | | 2 | `GALGZBDSFG4FRTFSO7XLURBJRYC6PA34H73IF66G7BZOXXQDMWSHPXEU` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GALGZBDSFG4FRTFSO7XLURBJRYC6PA34H73IF66G7BZOXXQDMWSHPXEU) | | 3 | `GAWJEP7LWY7WPLP7SBPR4MWQGQJIBAHVNVXYQE33F5FL2VFMFGBBFZ4B` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GAWJEP7LWY7WPLP7SBPR4MWQGQJIBAHVNVXYQE33F5FL2VFMFGBBFZ4B) | | 4 | `GCBZAJUZXRHNLVR4RCG743KSTKQSVFKXQCNYWAH4FVHDVSS5IT6DWSI3` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GCBZAJUZXRHNLVR4RCG743KSTKQSVFKXQCNYWAH4FVHDVSS5IT6DWSI3) | | 5 | `GAQZJQPZI7YZBUN6YVAFACVKAH6ODNBO3DVELP34VW4MLLUBCL5DMMNS` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GAQZJQPZI7YZBUN6YVAFACVKAH6ODNBO3DVELP34VW4MLLUBCL5DMMNS) | | 6 | `GAYOZX7LSYYYROU4SEBKGOOHOPUWYORPXEDHZJOXZ5Q45XZED7IMXG2U` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GAYOZX7LSYYYROU4SEBKGOOHOPUWYORPXEDHZJOXZ5Q45XZED7IMXG2U) | | 7 | `GDVNNL2QFO4PFYDLVLZTL2GKKOZR3YBV2AIIV7U44DXDOKKRJFIMLWCB` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GDVNNL2QFO4PFYDLVLZTL2GKKOZR3YBV2AIIV7U44DXDOKKRJFIMLWCB) | | 8 | `GCFL24VJA3LPZLIOJ3AAVGCUGOW4A7ZUWNNEGR332IZ2MHMUWCTK3GVG` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GCFL24VJA3LPZLIOJ3AAVGCUGOW4A7ZUWNNEGR332IZ2MHMUWCTK3GVG) | | 9 | `GBNVAVBVELOM2FBBPWDTUBM5DRECBY2MKPZ6YYO3CNKKSFCUUSE3HAU5` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GBNVAVBVELOM2FBBPWDTUBM5DRECBY2MKPZ6YYO3CNKKSFCUUSE3HAU5) | | 10 | `GBWATJDBLCF7PPUQYBWBXCUQ5ZXRHKHZ7RAFHWZ4SLMNH45VBRPAXXYY` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GBWATJDBLCF7PPUQYBWBXCUQ5ZXRHKHZ7RAFHWZ4SLMNH45VBRPAXXYY) | | 11 | `GDBJYDYLU3JH7V6X6KHPWQOSRQNXTL7OYTD6HUNVGB2J6Y7CUUX4WW6R` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GDBJYDYLU3JH7V6X6KHPWQOSRQNXTL7OYTD6HUNVGB2J6Y7CUUX4WW6R) | | 12 | `GA6DCDZIIP3FGLIAU5FLUZLBBFCM6XD26JDJVJCA6EL2LKY5OKA7YAQF` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GA6DCDZIIP3FGLIAU5FLUZLBBFCM6XD26JDJVJCA6EL2LKY5OKA7YAQF) | | 13 | `GBTNI3CULIDVJWABRYF5T56W7COYTA5JCRD3EAKO3VDSDWCUT2ZHSLAO` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GBTNI3CULIDVJWABRYF5T56W7COYTA5JCRD3EAKO3VDSDWCUT2ZHSLAO) | | 14 | `GD2PSTZL2YQC66C4PGFS5D64A6473IEKCZKNMIM5B7JWVLVS2N27D7QU` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GD2PSTZL2YQC66C4PGFS5D64A6473IEKCZKNMIM5B7JWVLVS2N27D7QU) | | 15 | `GCZJCXZTC5KELSLQJU6QUIDMRZ2HFTUIDYL3PCOKGR7XRAFI373DO6PU` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GCZJCXZTC5KELSLQJU6QUIDMRZ2HFTUIDYL3PCOKGR7XRAFI373DO6PU) | | 16 | `GCD4WRBPCKIPMDKLQA2LRAGYOIWCVRXJI4XNW4TI2ECVNKQO3T2XUSHG` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GCD4WRBPCKIPMDKLQA2LRAGYOIWCVRXJI4XNW4TI2ECVNKQO3T2XUSHG) | | 17 | `GBJXD5H457AKCFEGTSKYMD4MRSBBMGTUCOKEBU6YQ7TKNZ7SY2W37KKY` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GBJXD5H457AKCFEGTSKYMD4MRSBBMGTUCOKEBU6YQ7TKNZ7SY2W37KKY) | | 18 | `GAGR7D5K4VL5HNOZCL6CYZIGT5FNYZW7I5WXGX6HSBZLLVQ3NG77XBAO` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GAGR7D5K4VL5HNOZCL6CYZIGT5FNYZW7I5WXGX6HSBZLLVQ3NG77XBAO) | | 19 | `GAZXPBADNPTKWAGUWZM6KWEMIO4MQVU4GW3ZJXKHEO4BOBL5SLERSQYR` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GAZXPBADNPTKWAGUWZM6KWEMIO4MQVU4GW3ZJXKHEO4BOBL5SLERSQYR) | | 20 | `GDANCIDPUHS4IQUNHRM5RNKVOXTRR5RKIYYEE7HVPB2RWD76J66CS2DH` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GDANCIDPUHS4IQUNHRM5RNKVOXTRR5RKIYYEE7HVPB2RWD76J66CS2DH) | | 21 | `GCHZOQCDMG5J6NC2MNAR6EH5JFGI6JEP7TQWWUDRWER75Q3W3NC52HMG` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GCHZOQCDMG5J6NC2MNAR6EH5JFGI6JEP7TQWWUDRWER75Q3W3NC52HMG) | | 22 | `GC54CLYWNJ2AQZCAA2LVXOR2XTNGGCZYDSEJLLQBV6D4EDXN6D6DFGPX` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GC54CLYWNJ2AQZCAA2LVXOR2XTNGGCZYDSEJLLQBV6D4EDXN6D6DFGPX) | | 23 | `GDTJBRZXXMOWPF3LPMM7V4WOBIPLGR6BXTRDBYH6VCBRBL5Y76NK5JHY` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GDTJBRZXXMOWPF3LPMM7V4WOBIPLGR6BXTRDBYH6VCBRBL5Y76NK5JHY) | | 24 | `GDK5LNJFLU5LLNQDDZJ4SUPXASK7SULASCAGEHF5IT65FX2FYZ56CHAM` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GDK5LNJFLU5LLNQDDZJ4SUPXASK7SULASCAGEHF5IT65FX2FYZ56CHAM) | | 25 | `GBTY2BMYVRP2SFSFJXMHFQ6XQOKUS5JEZEAF3ZI5356FK7EQN56G57QE` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GBTY2BMYVRP2SFSFJXMHFQ6XQOKUS5JEZEAF3ZI5356FK7EQN56G57QE) | | 26 | `GANDLIFPFLNRYMIK6PG3BQU437PVUDLKS2VBCBYAMCJOKYZPRJWGORSU` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GANDLIFPFLNRYMIK6PG3BQU437PVUDLKS2VBCBYAMCJOKYZPRJWGORSU) | | 27 | `GAVCDYPJLPA2W4EYIMDXPSGAMUJDDOCSGNVZAX7UER4B4AKLVSDZSEIT` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GAVCDYPJLPA2W4EYIMDXPSGAMUJDDOCSGNVZAX7UER4B4AKLVSDZSEIT) | | 28 | `GARXSQZMDE4YF5IL6TWDAF4IAQG326JWAMOB5MAVAM3BOTXKM47Q6AQC` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GARXSQZMDE4YF5IL6TWDAF4IAQG326JWAMOB5MAVAM3BOTXKM47Q6AQC) | | 29 | `GBS6ERMNCYSO2EK7VPAGJP6TI6IEKGRJNUTKZWJ7KDBLY7Y6MG3CFEWF` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GBS6ERMNCYSO2EK7VPAGJP6TI6IEKGRJNUTKZWJ7KDBLY7Y6MG3CFEWF) | | 30 | `GCOON62FGOWAW44SAWI3UKNJY52W7RD4CIBEQFZJEI2J56MWOCKUENAC` | [Stellar Expert](https://stellar.expert/explorer/testnet/account/GCOON62FGOWAW44SAWI3UKNJY52W7RD4CIBEQFZJEI2J56MWOCKUENAC) |引导式测试网 QA 覆盖
除独立参与者评审外,我运营的 24 个受控 QA 账户还在公共测试网合约上完成了 8 次结构化的颁发方、毕业生和雇主旅程。此次测试产生了 64 笔由 QA 账户签名的交易和 8 项协调人审批,其中包括 8 项已验证凭证,以及 8 项已发放的 1 个测试网 XLM 付费机会(无货币价值)。
引导式 QA 证据日志列出了每个 7 月公共账户及其交易。2026 年 8 月,我又添加了 8 个由我运营的 QA 账户,并记录在 guided-qa-wave-2026-08.md 中。这 8 个账户不属于独立参与者。QA 覆盖总计包括我运营的 32 个账户。组织、凭证、群组和机会名称均为虚构的场景数据。全部 32 个 QA 账户均计入测试网覆盖总数 62 个账户,并在证据日志中标明其 QA 用途。
收集反馈
- Google Form: Stellaroid Earn - 用户反馈表单
- 回复导出(Excel):
docs/planning/user-feedback-responses.xlsx(同时提交了纯文本 CSV:user-feedback-responses.csv) - 完整反馈文档:
docs/planning/user-feedback.md
根据反馈进行的改进
以下每项改进都对应一条试点反馈,以及实现该改进的提交:
| 反馈 | 改进 | 提交 |
|---|---|---|
| “颁发方与雇主切换选项一开始让人困惑” | 在角色切换选项下方添加了情境化角色指导提示 | c1450bf |
| “连接钱包后,不清楚该选哪个角色” | 新增状态提示,说明两个角色的功能,方便新用户选择 | 09c9d45 |
| “希望能在仪表板中查看交易历史” | 在 /app 添加了限定钱包范围的“涉及您钱包的活动”面板 | fa0c5d0 |
| “如果能在移动途中查看证明时提供移动端支持就好了” | 采用移动优先的重新设计、可安装的 PWA,以及 WalletConnect 移动端签名 | 145f6ad |
| “如果能列出我颁发的所有凭证就好了” | 明确说明已颁发凭证的显示位置,并附上完整账户历史记录的链接 | eb181b8 |
社区贡献
作者
Mark Siazon - 混合型产品设计师与全栈开发者
致谢
- Rise In - Stellar 智能合约训练营
- Stellar Philippines - Stellar PH 2026 年训练营
- Workflow PH - 社区合作伙伴
- Stellar 文档 · Soroban SDK · Freighter · Stellar Expert
MIT 许可证 - 详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。




