CKB 键瓦
KeyWay仅在CKB测试网运行.
CKB KeyWay是用于Fiber Network的可重用电子邮件认证的钱包基础设施. 它结合了更好的Auth电子邮件OTP和Resend送货,一个Lit Chipotle PKP,CCC交易构建,以及一个主机或浏览器Fiber节点,这样应用程序就可以恢复稳定的CKB身份并外部为Fiber通道提供资金而无需输出PKP的私人密钥.
该存放处载有两项独立的交付品:
- 公众反应 SDK在
src/sdk,包括其框架独立的浏览器客户端. - 一个独立的节点/后端和一个Next.js参考钱包,显示登录、恢复、频道激活、发票和付款.
项目概况: ckbkeyway.dev (英语)
现场测试网钱包 : ckbkeyway.dev/app (英语)
反应 SDK 文档 : ckbkeyway.dev (英语)
npm 软件包 : @ cockb- keyway/ 反应
独立的 API : (原始内容存档于2018-10-21). keyway-api- production.up.railway.app
工作流程
- SDK向管理中的 KeyWay API 发送电子邮件 OTP 请求; 更好的 Auth 验证应用程序特定代码并创建应用程序绑定会话; KeyWay 提供永久应用程序账户ID .
- 后端提供或回收一个Lit PKP及其CKB测试网地址.
- 一个主机节点是用户在KeyWay服务器上持续的本土纤维节点. 一个可选的浏览器节点恢复其单独的纤维特性并加载一个WASM节点.
- 选中的节点连接到 Fiber 测试网对等点 .
- 纤维和同行合作构建未署名的资金交易.
- 后端验证了完整的交易,只计算出KeyWay锁组的CKB sighash.
- 一个被钉住的Lit动作标志 消化。 KeyWay 验证找到的公用钥匙,并插入其证人.
- Fiber 提交签名的交易, 等待
ChannelReady,并可以发送或接收发票. - 带有主机节点的登录清除SDK会话,而本地节点则保持在线. 浏览器登录停止了Fiber,并在释放设备所有权前上传一个加密的钱包扫描索引DB备份.
KeyWay将每个浏览器节点连接到官方测试网中继器,用于网络可及性和八卦. 其便利活化流量随后更倾向于浏览器可访问的瓶子或Bracer信道供应商,倒回从Fiber图中发现的合格节点. 400 CKB 值为 channel-peers.ts 是 KeyWay 发送给这些提供者的最小请求,而不是他们的贡献。 在下面经过核实的1,250 CKB测试网通道中,KeyWay要求1,000 CKB,接受的对等方贡献了剩余的250 CKB;应用程序应读取谈判的 local_balance 财务报告和审定财务报表 remote_balance 而不是假设每个频道都分开.
本地运行
要求:Node.js 20或更新,一个经过验证的Resend发件人,一个已配置的Lit Chipotle账户,以及Postgres.
npm install
cp .env.example .env.local
npm run build:api
npm run api
# In another terminal:
npm run dev
使用配置更好的 Auth、 Postgres 和经过验证的 Resend 发送器 .env.example运行 npm run migrate 在生产开始前明确。 消费者在开发者控制台上登记确切的出处;演示使用 NEXT_PUBLIC_KEYWAY_APP_ID保存数据库、 更好的 Auth、 Resend 和 Lit 证书服务器.
反应 SDK
公共软件包拥有电子邮件OTP,登录模式,钱包提供,一个CC签名器,以及一个提供者背后的用户纤维节点. 节点默认由 KeyWay 托管(fiberNode="hosted"); 浏览器节点(fiberNode="browser")是一个明确的选择.
在 ckbkeyway.dev/dashboard (英语)并复制其公共应用程序ID.
npm install @ckb-keyway/react
import { KeyWayLoginButton, KeyWayProvider, useKeyWay, useCkbWallet } from "@ckb-keyway/react";
function Wallet() {
return (
<KeyWayProvider appId="keyway_..." appName="My Fiber App" theme="light">
<KeyWayLoginButton />
<Balance />
</KeyWayProvider>
);
}
function Balance() {
const { ready, authenticated } = useKeyWay();
const { balance } = useCkbWallet();
if (!ready) return <p>Loading KeyWay...</p>;
if (!authenticated) return null;
return balance === undefined ? <p>Loading balance...</p> : <p>{balance.toString()} shannons</p>;
}
KeyWayLoginButton 打开内置的电子邮件 OTP 模式。 登录恢复 CKB 身份而不启动纤维 。 使用 start() 从 useFiber() 或者说 KeyWayFiberButton 需要的时候。 打开频道使用内置审批对话框. 使用 login() 财务报告和审定财务报表 logout() 从 useKeyWay() 用于自定义按钮.
反应 API
| API 密码 | 目的 |
|---|---|
KeyWayProvider | 拥有电子邮件 OTP、钱包回收、纤维启动和批准对话框 |
KeyWayLoginButton | 打开电子邮件 OTP 模式并登录认证用户 |
KeyWayFiberButton | 当纤维开始或停止时 autoStartFiber 关闭 |
useKeyWay() | 认证准备、用户、登录和登录 |
useCkbWallet() | 状态、CCC签名人、地址、公用钥匙、独立余额、刷新、错误和选择入帐收回(recovery(中文(简体) ) |
useFiber() | 开始和停止,用户的纤维节点(node)渠道、发票、付款估计和结算付款 |
SDK使用KeyWay管理后端. appId 识别已注册的申请并强制执行来源. appName 标记对话框; theme 接受光或暗; approveFiberChannelOpen, (中文(简体) ), approveFiberChannelClose, (中文(简体) ), approveFiberPeerConnect, (中文(简体) ), approveFiberChannelSettings, (中文(简体) ), approveCkbTransaction, (中文(简体) ), approveCkbMessage, (中文(简体) ), approveRecovery 财务报告和审定财务报表 approveBackupChange 可替换内置对话框,以及 approveFiberPayment 增加付款确认. autoStartFiber 默认为虚假. fiberNode 默认主机; 使用浏览器运行页面中的节点。 认证,账户恢复,和纤维准备都有单独的钩子. 后端 URL 和 证书 在提供者配置中缺失 .
appName 更改模式。 电子邮件通过Resend使用已注册应用程序的名称和已存在的中性模板. OTP记录和会话是通过应用程序隔离的;另一个应用程序中的同一电子邮件会得到不同的永久KeyWay账户和钱包. 服务器使用更好的 Auth 绑定会话范围 databaseHooks.session.create.before 钩.
成功检察官办公室在没有节点的情况下收回CKB账户. useCkbWallet() 独立读取其平衡. useFiber().start() 启动浏览器节点或连接主机节点。 浏览器节点在 WASM 启动前恢复任何声称的备份 。 选择自动启动 autoStartFiber。 。 。 . stop() 不停止主机节点.
在浏览器模式下, 明确 logout() 已存在 Fiber 连接后为交易 : KeyWay 在保留设备租赁的同时停止了节点, 仅抓取钱包的索引DB 数据库, 从 Lit 回收的 Fiber 密钥中获取 AES-256-GCM 备份密钥, 用 HKDF- SHA256 , 并将密码文本上传到管理的后端 。 只有在后端独立验证并存储密码文本后,才能清除认证和所有权。 一个新设备在Fiber开始前声称并恢复了一次性备份. 如果备份或还原失败, KeyWay 不释放或消耗唯一可恢复状态 。 日志不停止主机节点 .
useFiber().node 是用户的有纤维-js官方方法名称和参数的纤维节点,对主机和浏览器节点来说是相同的:
const { node } = useFiber();
if (!node) throw new Error("Start Fiber first");
const { channels } = await node.listChannels({});
const { invoice_address } = await node.newInvoice({ amount: "0x5f5e100", description: "Coffee" });
await node.sendPayment({ invoice: fiberInvoice }); // no dialog; may ask for the emailed code
const { payments } = await node.listPayments({});
每一种方法都是保密的。 阅读和发票是免费的. sendPayment 财务报告和审定财务报表 sendPaymentWithRouter 没有内置对话框( 应用程序可以通过) approveFiberPayment在主机节点上, 开放和关闭渠道,连接和连接同行 updateChannel 显示应用程序可以替换的对话框 . openChannel, (中文(简体) ), acceptChannel 财务报告和审定财务报表 abandonChannel 被封锁,任何没有保密的 都被拒绝 UNSUPPORTED_METHOD. 主机节点在 KeyWay 后端执行此功能;浏览器节点在 SDK 中执行此功能. 见 纤维节点文件。 。 。 .
较高层次的帮助者覆盖了共同流量:
const fiber = useFiber();
await fiber.start();
await fiber.openChannel({ fundingAmount: 500n * 100_000_000n, public: true });
const estimate = await fiber.estimatePayment({ invoice: fiberInvoice, max_fee_amount: "0x5f5e100" });
if (estimate.routable) await fiber.payInvoice(fiberInvoice, { max_fee_amount: "0x5f5e100" });
openChannel() 默认为1,000 CKB, 接受 peer,并打开一个符号频道(例如RUSD) udtTypeScript 财务报告和审定财务报表 fundingAmount频道资金与其它转账一样. estimatePayment() 执行 Fiber 的干线并返回 { routable, fee } 或打入,可重试 KeyWayError。 。 。 . fiber.channels 列出每个频道的 canSend, (中文(简体) ), canReceive, (中文(简体) ), capacity 财务报告和审定财务报表 asset。 。 。 . closeChannel() 用户批准后关闭.
一个主机节点运行在KeyWay的服务器上,这些服务器持有它的密钥,在一个孤立的持久本地纤维过程和每个用户的数据目录中,但受主机容量限制. 选择 <KeyWayProvider fiberNode="browser"> 运行页面中的节点;演示保留在 /app?mode=browser。切换模式不会迁移频道:主机和浏览器节点具有单独的特性和状态。 保留现有的专用节点任务.
fiber.channels 报告每个频道的链外分配,而不是钱包的链上CKB平衡. 参考应用提供了现成频道的总和 canSend 作为主要纤维平衡,保持链上CKB的松散,并列出每个非封闭信道,并有明确的用户端和对等端平衡.
SDK也暴露了Fiber的低水平近距离操作. 合作贴近需要同行参与,并向用户一方支付自己的地址. force: true 在频道承诺延迟后关闭, 大约4小时。 在Fiber 0.9.1中,一个被强制关闭的信道被固定在节点自己的密钥上,而不是该信道的关闭脚本上,并且只有在该密钥持有一些CKB以支付费用时. 作为在Fiber向关闭地址支付结算之前的临时措施,用户的第一个通道打开后也会向他们的节点键发送一次性的62 CKB费用储备,KeyWay将结算扫描到用户的地址: Fiber的浏览器构建没有监视器,因此一个浏览器节点的SDK在页面中运行一个,它声称用户分享从Fiber密钥衍生出来的密钥(没有飞行中付款的通道),并在节点开始时和运行时每10分钟扫描一次;一个主机节点的结算在用户下次使用Fiber时被KeyWay所覆盖. 预备队在每个频道关闭后返回用户. 更喜欢合作关闭.
await fiber.closeChannel(channelId, { force: true });
关闭会消耗频道的链上供资单元格,并将最后的频道分配回正常的CKB单元格. 这个 channel_outpoint 诊断表明,资助细胞独特的CKB参考:资助交易散列加其产出指数. 它是频道的链上主播,而不是频道ID或平衡.
耗用反应应用程序不需要 Next.js 或后端配置 。 应用程序的使用 KeyWayProvider 从不处理会话符号.
开发者控制台支持禁用应用程序,去除来源,设定OTP限制,查看消毒用法并检查API健康. 其会场范围与SDK应用会分开. 消费者不需要认证提供者证书.
以 :
npm run build:package
私人独立后端运行 npm run api 和要求 DATABASE_URL, (中文(简体) ), KEYWAY_ALLOWED_ORIGINS, (中文(简体) ), KEYWAY_RATE_LIMIT_SECRET,更好的 Auth/Resend 服务器证书,以及来自 Lit 服务器证书 .env.example。它由CKB KeyWay部署,不由公众SDK输出。 Next.js 参考应用没有 API 路由: 它导入已发布 @ckb-keyway/react 包,它和外部消费者都使用相同的由SDK管理的铁路终点.
寄存器包为私有. npm run pack:sdk 只有阶段和包 package.sdk.json,反应/浏览器构建,REDME,和许可证. 仅限服务器 postgres, (中文(简体) ), pg, (中文(简体) ), better-auth,以及 resend 依赖性,铁路代码,和Lit Action被排除在外. 发行版本使用 npm 信任的出版: 明文 v<package-version> 标签触发器 .github/workflows/publish.yml使用一次性邮递、检查类型、构建公共软件包并通过国际开发部出版。 普通承诺不发布 npm 版本 .
公共软件包将它经过测试的Fiber WASM版本接上. 节点升级需要明确的相容性和恢复性核查;在依赖性解析期间不得默默地进行.
安保模式
- Lit PKP 私人密钥不由 KeyWay 动作返回到浏览器或 KeyWay 后端 。 Lit Chipotle是一个单一认证的TEE:在KeyWay Lit组中的任何允许的动作可以读取其中的密钥,而KeyWay的Lit管理证书控制可以读取允许列表.
- 后端接受完整的CKB交易,执行测试网供资和收费限制,计算CCC精确的叹息,并只引用被绑定的Lit Action:后端拒绝发送由所配置的IPFS CID所不同的Action代码,而Lit只运行CID允许在KeyWay集团中上市.
- 存储的纤维身份密钥在休息时被加密. 对于浏览器节点,Lit创建了密钥并重新加密到用户浏览器中生成的一次性密钥上,因此KeyWay的后端中继器只能是密码文本,在正常操作中从未收到密钥;后端仍然信任Lit授权发布. 一个主机节点运行在KeyWay的服务器上,这些服务器持有该节点的操作密钥和频道状态.
- 网页锁定,
BroadcastChannel,而原子 Postgres 租赁则执行一个活动浏览器节点. - 纤维状态备份被加密在浏览器中并被存储为密码文本. 明确登出附件为一不可变的一代;只有最出名的才能自动登出,更年长的一代留下来回滚,恢复时拒绝覆盖设备上已经存在的纤维状态.
- 会话无记名符號活在嵌入式应用程序中
localStorage,所以应用程序中的 XSS 错误可以读取它们. useCkbWallet().signer是 CCC 签名符。 后端只标出用户自锁,仅标出其在审批对话框中解码并显示的确切交易,并有大小收费上限和费率限制. 发送限制是默认的:在账户第一次发送之前,“保护你的账户”对话框提供每天10万个CKB的限制,用户可以改变,24小时内任何超过它的东西都需要电子邮件代码;主机-节点Fiber支付算在它前面. 有了政策签名器,KeyWay的Lit Action从一个链上发送限制单元格中强制执行每个发送链上的金额本身,所以服务器单靠它不能超过(C研究/期货限制) (中文(简体) ). 对话框运行在嵌入式app的页面中,因此一个被损坏的页面可以批准低于该金额的交易,而app可以替换对话框(包括默默批准).- Opt- in 账户恢复允许用户名备份(一个 EVM 钱包或一个 JoyID 密码) 通过 Omnilock 管理员路径和 救援页面 (单位:千美元)
app/rescue, (中文(简体) ),src/rescue) (中文(简体) ). 在一次更改账户地址时将其转至一个Omnilock地址,命名用户的管理员;备份更改再也不会更改. 打开它 每一个备份更改 总是需要电子邮件代码 并且,为了添加一个, 备份自己的签名。 Omnilock 被数据散列所粘住,没有公共审计;备份列表单独锁定在Lit键上;备份通过签署一个可读文本来批准一个动作,该文本命名目的地和金额,这是KeyWay的验证者(contracts/连锁重建。 见 账户地址回收。 。 。 . - 电子邮件妥协可以授权追回。 这个测试网原型是实验性的,未经审计,而不是生产保管软件.
验证测试网结果
2026年7月13日,一个一次性的KeyWay钱包在登录后被回收,恢复了持续状态 ChannelReady 并结清了一张独立的CKB纤维发票.
- 供资交易:
0x6cbe309c362fca8df9d9d57359ccedb5f31691e265abbfc32d3a4c5e5527c319 - 频道编号 :
0xfb2ed16a558fd89565c6b3d14596eff90228e11c91a579c25a58c5ae8d4a0ed9 - 供资产出:指数
0x01,250 CKB 合作频道能力 - 纤维支付散列 :
0x705dae6371d3b2b10e417bf18b9cac0235e654eb59ffd8a1432e0cf3250d472b - 发件人结果: 已解决
- 独立接收结果:已确认付款
见 docs/TESTNET_EVIDENCE.md 关于可复制的证据和 docs/ARCHITECTURE.md 用于组件边界.
核查
npm run typecheck
npm test
npm run build
生产部署也发出 Cross-Origin-Opener-Policy: same-origin 财务报告和审定财务报表 Cross-Origin-Embedder-Policy: require-corp费伯的多行WASM运行时间要求的.
目前的限制
- 只测试网( 纤维货币)
FibtCKB和指使符(xUDT,包括RUSD)被支持;互换,商检出站,主网已超出范围. - 交叉设备 Fiber状态迁移目前需要明确的登录。 崩溃,丢失的设备,强制关闭标签,或被中断的浏览器无法创建出新的检查点,因此背景快照仍然需要一个上游安全的数据库冲出边界.
- 频道余额和频道关闭可通过
useFiber(). 参考钱包使每个频道的两侧都形成一个,在明确确认后可以关闭一个频道;合作关闭后在CKB上结算最新的余额. - 后端被信任来授权Lit操作,包括Lit向被签名的用户放出浏览器节点的Fiber密钥. 它从不看到这把钥匙:Lit创建并封入一次性浏览器钥匙,后端只接发密码文本. 它持有主机节点的密钥.
- 浏览器-节点纤维支付不会通过KeyWay的后端,所以它们不会算入每日的电子邮件确认金额,方法规则只在SDK中执行.
- 参考钱包对可预见演示使用固定活化和最高付费限制;SDK消费者可以配置通道资金并估算付费.
- CKB平衡是活细胞的索引出自总和,不是账户字段. 参考钱包每10秒就进行一次投票,所以在索引器延迟后,新出矿或由水龙头所创建的单元格仍然可以出现.
- Lit, Fiber WASM, 公共同辈,Resend, CKB测试网 RPC 仍然是外部可用性依赖.
- 托管的节点仍然是实验测试网基础设施. 每个账户都被映射到一个持续体积的专用本土节点上,并有主机节点容量限制. 经认证的运算符可以快取并恢复状态;目前的备份共享主机的音量,而不是出量的灾难恢复. 单独的中试证书被推迟到主网准备. 见
docs/ARCHITECTURE.md和资金回收证据.
上游基金会
@nervosnetwork/fiber-js0.9.1@fiber-pay/sdk0.2.7@ckb-ccc/core1.16.1- 更好的认证
1.7.7重新发送6.32.1(仅私人后端) - Lit Chipotle Actions 由 IPFS CID 控股 (通过后端检查并被允许列入 KeyWay Lit 组)
CKB KeyWay是独立的实验性基础设施,不隶属于这些项目或得到这些项目的认可.
许可证
CKB KeyWay 发布于 MIT 许可证。 。 。 .