# @fitzdoud/valun 中文文档

规范地址：https://npmcn.com/package/%40fitzdoud/valun/

版本：0\.7\.0
npm 元数据更新时间：2026-11-14T13:00:31.979Z
中文译文更新时间：2026-11-14T20:45:37.662Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40fitzdoud/valun
原文对照：https://npmcn.com/package/%40fitzdoud/valun/?lang=original
项目主页：https://github.com/fitzss/valun-open/tree/main/js
源码仓库：https://github.com/fitzss/valun-open

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：680 kB，26 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=18
- 运行依赖：0 个
- 首次发布：2026-11-07T16:02:12.462Z
- 最新版本发布：2026-11-14T13:00:31.563Z
- 近 30 天下载量：2643（2026-10-15 至 2026-11-13，npm 官方下载统计）
- 已发布版本数：18（近 12 个月 18 个）

## 中文简介

0依赖性 JavaScript/TypeScript客户端为Valun代理信用网络(valun-deal/1):本地secp256k1密钥 Basid Schnor签名,每次签名前的独立检查. 实验飞行员:合成单位,未定.

## 安装

```sh
npm install @fitzdoud/valun
```

也可以使用：`pnpm add @fitzdoud/valun`、`yarn add @fitzdoud/valun`、`bun add @fitzdoud/valun`

## README

# valun (JavaScript / 类型脚本)

Valun代理信用网络的零依赖客户端( protocol) `valun-deal/1`网络 `valun-testnet-1` 时间 [https://valun.tech (英语)](https://valun.tech/)),这样 JavaScript代理可以在没有Python的情况下加入并处理. 它是 Python 参考客户端的端口 (单位:千美元)`python/src/valun/client.py`, (中文(简体) ), `basis.py`: 代理的 sip256k1 键生成并保存在自己的机器上,每 行为在当地与 Base Schnorr 计划签署,客户端检查服务器在签名前告诉它的内容.

> **测试网.** 数额为 **ergo测试网的纳米ERG**: 测试硬币 **无货币价值** (1个贷项= 100,000纳米ERG). 发放信用票据产生未兑现的付款承诺;在向新的票据付款时结算 债权人,在循环中取消,或者以其发行人的tERG储备(下)赎回. 较早的试点网络 (单位:千美元)`valun-pilot-1`,合成单位))于2026-11-13被退役:为它制作的简介必须再次加入.

-   18\. 纯JavaScript BLAKE2b(RFC 7693)、SHA-256和secp256k1(BigInt).
-   主条目导入已安装的节点 。 钥匙来自 `globalThis.crypto.getRandomValues`HTTP通过 `fetch`。仅节点部分是单独的条目: 文件存储 `@fitzdoud/valun/file-store` 和 DNS 主机检查器 `@fitzdoud/valun/dns`。 。 。 .
-   版本 `0.7.0`数字 : `npm install @fitzdoud/valun` (或从一次离职: `npm install ./js`)或导入 `js/src/index.js`.0.4.0 增加流通信用(服务器发布 v16, spec 修订版) v14:绑定音符,用您持有的音符支付,同意并抵消,边缘同步,镜像 Python 包 `valun` 0.4.1.0.4.1 修补沙盒巡演(等待沙盒代理付费,并说只在 )并显示在跟踪器结束之前服务器结束的尝试。 0.4.2和0.4.3只修改版本, 以匹配 Python 软件包(添加) `valun sell`, (中文(简体) ), `valun profile` 编辑 `check` 服务)。 0.4.4 增加简报 观点 `valun_status` 用于小型模型: `brief: true` 打电话,或 `new ValunAgent(client, {briefStatus: true})` 作为默认值(与 Python 软件包相同的输出)。 0.5.0 在Ergo测试网上添加网络和结算 testnet network,以下: 赎回一张纸币取自其发行人保留地,由本地人签名,并用纳米ERG文本. 0.5.1:签名防火墙的拒绝命名为网络单位. 0.5.2:每桶字数限制,只检查由买家字取名的沙盒活,测试网的准确检查 自有工具单词( e)`schemas.forNetwork`),以及 `retry_after_seconds` (输出与Python包相同). 0.6.0: 保证(一个后卫的封口,可以对另一个代理的 IOU 作出可调用的承诺; 第19节):客户方法 `offerGuarantee` . `honorGuarantee` 和四个工具 `valun_guarantees`, (中文(简体) ), `valun_offer_guarantee`, (中文(简体) ), `valun_respond_guarantee` 财务报告和审定财务报表 `valun_call_guarantee` (输出与Python包相同). 0.6.1:一个网络(默认服务器是 [https://valun.tech (英语)](https://valun.tech/),服务于 `valun-testnet-1`; 保证该名称 交易,他们回来(`offerGuarantee({..., deals})`覆盖 `issuer_payment_for_deals`; 应付交易的反报价 在一天之内; 价格和小时仅作为JSON整数(与Python包相同的输出). 0.62: (中文(简体) ) `setProfile({publicVouches})` 选择公共担保(fix inbox #31).

仅在Windows上的节点24.21.0测试. Deno, Bun和浏览器预计会工作(主条目中没有节点API) 但没有运行。 一个浏览器页面只有在该服务器允许该页面的来源(CORS)的情况下才能调用Valun服务器. 这一点没有经过任何部署检查.

## 快速启动( 节点)

```js
import {Client} from '@fitzdoud/valun';
import {FileStore} from '@fitzdoud/valun/file-store';

// One private file per identity: settings, the agent's key, its agent token, its record of notes issued.
// The layout is the Python client's, so either client can use the same file.
const client = new Client({store: new FileStore('.valun/agent.json'), server: 'https://your-valun-server'});

// 1. The HUMAN owner joins with an invite. The response holds the owner token and the enrollment code. Both are
//    for the person: keep the owner token away from the agent.
const joined = await client.join({invite: 'vpi_...', handle: 'my-agent', operator: 'Your Name'});

// 2. The agent enrolls: it generates its key locally and proves possession. Key and agent token go to the store;
//    neither is ever returned.
await client.enroll(joined.participant_id, joined.enrollment_code);

// 3. Deal.
const offer = await client.propose({counterpartyId: 'vp_...', role: 'payer', title: 'Short research brief',
  description: 'Summarise three sources on agent-to-agent credit.', deliverable: 'markdown, 300-500 words', price: 20});
const inbox = await client.inbox();
// counterparty side: await client.accept(dealId, {expectedTermsHash});   payee: await client.deliver(dealId, content)
// payer side:        await client.complete(dealId, {expectedDeliverableSha256})  // signs the Basis credit note
```

其他运行时间 `new MemoryStore()` 或自营的商店.

## API 密码

所有的方法都是同步的,但 `verifiedAgreement`。数据对象保存协议的蛇 case 字段名称。 每个 拒绝是一个 `ValunError` 拥有稳定 `code`; 服务器错误带有服务器的 `error` 作为 `code`, HTTP 软件 `status`, (中文(简体) ), 和其它错误正文中 `extra`。 。 。 .

| 方法 | 它会做什么 |
| --- | --- |
| `join({invite, handle, operator, displayName?, about?, services?})` | 创建参与者( 拥有方) |
| `enroll(participantId, code)` | 在当地生成密钥, 并用占有证书签名予以注册 |
| `info()`, (中文(简体) ), `directory()`, (中文(简体) ), `participant(id)`, (中文(简体) ), `ledger()` | 公开读取 |
| `me()`, (中文(简体) ), `inbox()`, (中文(简体) ), `deals()`, (中文(简体) ), `deal(id)` | 随代理符号一起读取 |
| `setLimits(body)` | 记录限制`PUT /limits`(中文(简体) ) |
| `card(who)`, (中文(简体) ), `checkPayer(payer, amount, {payee?})` | 预算卡:代理已公布的卡,服务器对其付款的判断(公众读取该签名一文不值;支票带有该代理自己的代币,因为只有收款人能看到其封面); `who`, (中文(简体) ), `payer` 财务报告和审定财务报表 `payee` 手柄或参与者身份(`resolveParticipant(who)`(中文(简体) ) |
| `setPublicCard(on, ownerToken)` | 拥有者公布或隐藏其代理人的预算卡(`PUT /owner/mandate {public_card}`; 先检查所有者代号, 并且从未存储) |
| `verifyOffer(dealView)` | 以下检查; 返回 `{terms_hash, proposer_signature_valid, terms}` |
| `verifiedAgreement(dealView)` | 在检查散列和两个签名之后 |
| `buildTerms({...})` | 提案将签署的条款(无签名) |
| `propose({counterpartyId, role, title, description, deliverable, price, deliverByHours = 48, offerTtlHours = 24})` | 签名并发送版本 1 |
| `counter(dealId, {price?, title?, description?, deliverable?, deliverByHours?, offerTtlHours?})` | 验证报价,签署版本+1;默认开放24小时,但从未超过交货期限,也未超过答复报价 |
| `accept(dealId, {expectedTermsHash?})` | 核实报价,签署接受书 |
| `decline(dealId, reason = '')`, (中文(简体) ), `withdraw(dealId)` | 签名 : 拒绝( 所签理由与发送理由完全相同) 或撤回 |
| `deliver(dealId, content, {title?})` | 核实协议,签署 `sha256(content)` 完全按照发送 |
| `complete(dealId, {expectedDeliverableSha256?})` | 检查交货、协议和信用票据模板;签名完成和80字节说明 |
| `dispute(dealId, reason)` | 核实协议和交货,签署争议书 |
| `request(method, path, body?, {auth?, token?})` | 任何其他API电话 |

选项 : `new Client({store, server, timeoutMs = 30000, fetch, pin: {trackerNftId, denomination}, signerRetries = 0, retryDelayMs = 1000})`。 。 。 . `pin` 使客户拒绝一个跟踪器或单位不同的网络(spec 15.2表示客户端) 应接针). 打开 `503 signer_unavailable` 没有记录。 与 `signerRetries` 客户端发送 **同签 请求** 重回原点 默认它会像Python客户端那样扔出. 不要因为 此错误 . `now`, (中文(简体) ), `randomBytes` 财务报告和审定财务报表 `generateSecret` 是试钩.

低级 : `canonical`, (中文(简体) ), `termsHash`, (中文(简体) ), `sha256Hex`, (中文(简体) ), `statement`, (中文(简体) ), `statements.*` (每个行为的确切声明文本), `basis.sign / verify / verifyHex / publicKey / generateSecret / noteMessage / debtKey`, (中文(简体) ), `blake2b`, (中文(简体) ), `blake2b256`, (中文(简体) ), `sha256`, (中文(简体) ), `cleanText` (服务器的) `clean()`, (中文(简体) ), `reasonProblem` (服务器的v13理由拒绝), `hasUnsafeText` (第13届) spec 2.3的文本规则,与服务器的功能相同),以及 `neutralize` (显示控制、badi和隐形) 字符为 `\u{XXXX}` 标记,用于向一个人或模型显示;绝不在输出上签名).

### 存储

一个商店是 `{state, secret(), token(), save(), saveCredentials(secretHex, token)}`。 。 。 . `state` 是个普通的非机密 对象. `secret()` 财务报告和审定财务报表 `token()` 是同步的. `save()` 财务报告和审定财务报表 `saveCredentials()` 可能还原一个承诺. `MemoryStore` 将钥匙和信物保存在私人的课场上,这些没有列出, `JSON.stringify` 或者说 `util.inspect` 到达. `FileStore` (节点)读取并写入了Python客户端的文件布局. 每封信都写到 打开新临时文件 `O_EXCL` 模式 `0600`,然后在州文件上重新命名。 新文件夹是 创建 `0700`。装入时,可读取的文件会收紧到 `0600` (中文(简体) ). 拒绝使用腐败文件 而不引用它 在错误中.

商店也可能有 `update(fn)` (和 `reload()`);然后客户端通过它对其记录进行每一次修改. `FileStore.update(fn)` 在同一文件中使用 Python 文件Store 的锁定协议: a `O_EXCL` 锁定文件 `<path>.lock` 持有 `<pid> <time> <random>`(a) 等待 不超过5 s (当时) `profile_busy`); 30 s 以上的锁被一次一个服务员替换为 stale (单位:千美元)`<path>.lock.break`) (中文(简体) ). 在锁下它重新装入文件, 应用 `fn` 并写解剖,所以一个Python和一个 JavaScript客户端可以共享一个配置,而不会丢失对方的记录. 一个 `Client` 也做出自己的改变 一个接一个.

## Ergo测试网结算

瓦伦网络上`valun-testnet-1`,在Ergo测试网的纳米ERG中的数量:没有货币价值的测试硬币)a 代理人可以用一个基础储备来还本付息,还本付息。 它的 Ergo 地址是 P2PK 其Valun密钥的地址,所以它自己的密钥会标出它自己的Ergo交易;服务器从不持有. 重新需求 仅此而已: 客户端计算交易的字节来签名( 任何 ErgoTree 版本, 所以 Basy) 保留合同的版本 3 树),并在检查交易后用自己的密钥在证书上签名 与箱子相对,因为Ergo节点报告它们。 建立您自己使用的 ergo- lib 储备, 这个客户端正在加载 只有安装在旁边时: `npm i ergo-lib-wasm-nodejs@0.28.0` (没有它) `createReserve` 失败 `ergo_lib_missing`) (中文(简体) ).

```js
client.ergoAddress();                                   // send tERG here (a testnet faucet, or another agent)
await client.createReserve(50_000_000);                 // 0.05 tERG: checked and signed, NOT sent; returns it
await client.createReserve(50_000_000, {broadcast: true});
await client.redeem('sandbox-exact', 3_000_000, {broadcast: true});   // a note sandbox-exact issued to you
```

客户端在签名前先检查一下: 保留请求必须准确锁定金额, 在网络上 储备合同,这个代理的钥匙在R4 和网络的追踪器NFT在R6 刻出一个代号,其编号是 第一次输入; 赎回必须花出发行人的储备(其合同、所有者密钥和跟踪器NFT,从节点读取), 将金额降低到准确的金额, 准确支付金额 在这个代理自己的地址, 不花这个代理的盒子, 并且是交易的追踪者 签名的收费( 相同的 ID) 。 上下文扩展为 ergo 节点将其序列化(`ergo.toErgoJson`, (中文(简体) ), `ergo.txBytesToSign`) (中文(简体) ).

## 客户在签名前检查什么(第15.2段)

接受并反驳,就像Python客户端所做的:

-   它重算散列术语,只使用它自己的价值;
-   协议和网络必须如预期,跟踪器和单位必须平等 `GET /info` (和针;
-   该代理人必须是用自己的钥匙取名的一方;
-   提议者的密钥必须等于目录密钥,提议者的签名必须核实;
-   报价不能过期.

在它签定要约或拒绝要约之前`bad_arguments`)一个会保持开放 通过自己的 交付期限, 服务器拒绝, 并且它永远不会缩短价格(`bad_price`) (中文(简体) ).

这也让Python客户端没有做的应验:

-   交易id必须是要求的 `proposer` 必须与签名者相等;
-   版本必须一致 `prior_terms_hash` 必须链接到上一个版本;
-   单位必须是网络的(`nanoERG`· ; `PC` (b) 以全部金额计算,考虑必须是预期金额;
-   时间必须是RFC 3339;
-   字段设置必须准确,所以没有签名显示可能忽略.

完成, 正如Python客户端所做的:

-   交付的内容必须散列到 `delivery.sha256`,这必须是所审查用户的交付,以及商定的 术语必须是用户所审查的术语(`expectedTermsHash`,在模板被读取前检查;
-   协议散列和两个签名必须核对,收款人必须签署了交货(在密钥下 术语名称或收款人当前目录密钥 : `bad_delivery_signature`(三);
-   模板发行者必须是此代理, 收款人当前的目录密钥为收件人;
-   模板必须准确添加商定的价格;
-   前一个必须是客户端可以站后的一个:当服务器提供时 `bound_notes/1`,它显示的前注 (单位:千美元)`?prior=1`)必须是该代理人自己的签名,并且不得比其记录更古老(`bad_prior_signature`, (中文(简体) ), `ledger_mismatch`页:1 `prior_total` 必须与客户本人签发的纸币记录相符;
-   交易从不支付两次,而该代理商可能已申请过(`already_paid`(三);
-   追踪器和单位必须是商定的和被钉住的(`tracker_mismatch`),和10分钟内的时间戳 本地时钟; 当服务器发布任何功能广告时, 以995-999 mss结束的时间戳被拒绝; ;
-   从这些值中重算出80字节的消息,模板的 `message_hex` 从未签名.

尚未被封存的配置文件(第一个没有) `GET /info`0.3 :没有额外 请求,不 `?prior=1`。 。 。 .

Python 行为增加:

-   `deliver` - 首先检查协议;
-   `decline` 财务报告和审定财务报表 `withdraw` 当视图带有条件时重算要约散列;
-   `dispute` 检查交付的内容是否与其散列相匹配;
-   服务器拒绝的原因被本地拒绝, 并且从未发送 。 这些是非弦,拒绝字符和 超长原因(第2.3和8.3项,释放v13);
-   价格必须至少有1个整数。 Python 客户端用 `int()`。 。 。 .

用户可能注意到的 Python 客户端的差异 :

-   请求使用 `redirect: 'error'`因此,一个无记名符号永远不会被传送到方向目标;
-   (单位:千美元) `Content-Type` 信头只用一具尸体发送;
-   拒绝以非RFC方式提供3339次。 服务器只接受日期和RFC 2822字符串. Python 接受一些选择 并撞倒别人.
-   方法签名为带有选项对象的 CameCase.

与Python客户端一样,信用票据被记录为待付款(`state.records`在发送之前,确认(和 `state.issued` 正在更新) 仅当服务器回复时 `note_issued`,或当后面的读取显示其应用。 持有的说明 其所有者拒绝只是被放弃,所以下一个完成到收款人成功(这可以修复OQ-23).

未移植:MCP服务器和CLI. 代理工具层被移植( 下一节) .

## 代理工具

`ValunAgent` 是 Python 工具层的端口( P)`agent.py`, (中文(简体) ), `schemas.py`, (中文(简体) ), `measure.py`,以及 `sandbox.py`) (中文(简体) ). 拥有同样的工具(`valun_status`, (中文(简体) ), `valun_directory`, (中文(简体) ), `valun_inbox`, (中文(简体) ), `valun_deal`, (中文(简体) ), `valun_propose`, (中文(简体) ), `valun_respond`, (中文(简体) ), `valun_deliver`, (中文(简体) ), `valun_review_delivery`, (中文(简体) ), `valun_set_limits`),结果相同 以及签字前的相同检查: 缺少文本的警卫、按衡量条件的送货门和 准确重新计算文本统计和公证结果. `call(name, args)` 解决普通对象. `callSafe` 永远 拒绝; 失败返回为 `{error, message, what_this_means?}`。只读 `valun_check_payer` (单位:千美元)`{payer, amount}`)在代理商接受其IOU前检查付款人与其所有者的预算卡:服务器的判断与 `summary`页:1`checkSummary`(三); `verdict: 'unknown'` 当卡片不公开时.

`valunTools(agent, {approve})` 返回工具为 `{name, description, parameters (JSON Schema), execute(args)}`。 。 。 . 在每一份承诺(要约、接受、反出价、接受交货、放宽限制)之前 `agent.prepare()`,正如 Python MCP 服务器和 CLI 所做的: 读取了会签名的内容后, 将两个参数都给出给 与批准文本一起签名。 文本仅取自所签名的值:必须使用 hash to the state hash, 将这名代理人命名为一方并由另一方提供, 服务器的角色和对手 一定要同意他们的意见 送货必须速战速决 重议的散文者,将在辩论之中 报价被绑定给参与者 id 显示 , 计算线条先到, 文本是对应方或代理人写的 后引为JSON一行. 然后它打电话 `approve(text, name, args)` 并准确执行这些 参数。 仅 `true` 标志。 如果出价或交货在所有人看到后发生变化,客户拒绝签名 (单位:千美元)`stale_terms`, (中文(简体) ), `stale_delivery`) (中文(简体) ). 当将要签署的东西无法读取或无法在一起时,电话是 拒绝使用 `approval_unbound` 而不问主人。 没有钩子,承诺被拒绝 `approval_unavailable`除非你通过 `approvals: 'none'`,也省略了准备。 服务器执行 每个模式都有主人的授权.

批准失败关闭,如Python核. 只有只读的工具, `valun_deliver`, (中文(简体) ), `valun_respond` 与动作 没错 `decline` 或者说 `withdraw`, (中文(简体) ), `valun_review_delivery` 确切的决定 `dispute`,以及 `valun_set_limits` 调用,任何放松都不是承诺;所有其他调用,一个客户不知道的工具名称,就是包含在内。 A 类 审查确切决定以外的决定 `accept` 或者说 `dispute` 拒绝使用 `bad_decision` 在读到之前 签名.

与 OpenAI 兼容的 Chat 补全端点相对应的纯循环, 没有框架 :

```js
import {Client, ValunAgent, valunTools} from '@fitzdoud/valun';
import {FileStore} from '@fitzdoud/valun/file-store';
import {resolveHost} from '@fitzdoud/valun/dns';

const agent = new ValunAgent(new Client({store: new FileStore('.valun/agent.json')}), {resolveHost});
const tools = valunTools(agent, {approve: askOwner});   // askOwner(text): show it to a person, resolve true or false
const spec = tools.map(({name, description, parameters}) => ({type: 'function', function: {name, description, parameters}}));
const messages = [{role: 'user', content: 'Check Valun and act on my inbox within my limits.'}];
for (let turn = 0; turn < 10; turn++) {
  const res = await fetch(process.env.LLM_URL, {method: 'POST', headers: {'content-type': 'application/json',
    authorization: `Bearer ${process.env.LLM_KEY}`}, body: JSON.stringify({model: process.env.LLM_MODEL, messages, tools: spec})});
  const msg = (await res.json()).choices[0].message;
  messages.push(msg);
  if (!msg.tool_calls?.length) { console.log(msg.content); break; }
  for (const c of msg.tool_calls) {
    const t = tools.find(x => x.name === c.function.name);
    const result = t ? await t.execute(c.function.arguments) : {error: 'unknown_tool'};
    messages.push({role: 'tool', tool_call_id: c.id, content: JSON.stringify(result)});
  }
}
```

`execute` 接受参数为对象或作为工具调用的活 JSON 字符串。 使用 JSON 的框架 Schema工具(Vercel AI SDK, LangChain.js, OpenAI Agents SDK, Mastra)可以直接或重命名后使用这些对象 一个田地。 请检查您框架的文档, 例如它是否需要非限制性的策略模式, 因为许多参数都是 选项。 这些工具还没有在任何框架内运行;测试套件会用假模型运行这个循环.

-   链接主机:在节点,通过 `resolveHost` 从 `@fitzdoud/valun/dns` (只有DNS;没有获取页面). 没有它,因为 在浏览器中, 测量值表示 `link_hosts_not_checked`,而送货门只检查单词和链接.
-   `measure`, (中文(简体) ), `sandbox` 财务报告和审定财务报表 `schemas` 以命名空间导出( n)`measure.measure`, (中文(简体) ), `sandbox.checkDelivery`, (中文(简体) ), `schemas.ALL`) (中文(简体) ).

## 遵约

```
node --test js/test/        (from the repository root; or `npm test` in js/)
```

套房下线,不需要套件. 它检查密码 与每个文件 `spec/vectors/` (产生) 从真正的服务器代码, 释放 v16, valun- app `b7ecca0`,在 tracker v3.2; spec 修订版 v14 上:

-   `basis-signatures.json`: Base官方载体 TV001-TV011.
-   `basis-notes.json`:债务键和80字节的便条消息,签名和负子.
-   `canonical.json`: 每一级,包括 `refused`, (中文(简体) ), `wire` 财务报告和审定财务报表 `generic`,字节为字节.
-   `statements.json`数字 :
    -   每个语句文本及其UTF-8字节;
    -   每一签名、替代形式和否定;
    -   (a) 所接受的每一项理由均按原样发送并按原样签名;
    -   每一个被拒绝的理由都用服务器的代码和消息拒绝,没有发送任何信息.
-   `terms-validation.json`:每个案例的散列词,加上一个表格 `verifyOffer` 处理每个案件. 校验本身是服务器专用的 .
-   `circulation.json` (释放v16):时间戳、信息(80字节留言和, `kind: "prior_ack"`105字节 先前承认追踪器v3.2),引文摘要,薪金报表,追踪器请求,以及79项决定 签署防火墙(同意书、付款人模板、约束模板),每个模板都有准确的槽或拒绝代码.
-   `transcript.json`数字 :
    -   每个服务器验证的签名 和每个术语的散列 每一个响应;
    -   所有65个客户呼叫步骤(236个步骤),通过联署材料重新播放 `Client` 对付假人 `fetch` 服务于 记录的读取、时钟和随机值;
    -   每项请求必须等于所记录的1, 签名不在此列, 并且每个签名必须在字节上验证 已验证服务器 .

如Python客户端中那样,签名非ce是随机的. 鉴于发电机的无色, `sign()` 复制每个 签名矢量生成器, 字节为字节: 所有语句向量签名和每个测试键签名 记录 重试规则 `e` 财务报告和审定财务报表 `z` 直接测试,两个分支都行使.

其他测试:

-   BLAKE2b与RFC 7693附录A和附录E的自试(所有消化长度,按键和未按键)进行核对, 和反对 `node:crypto` `blake2b512`。 。 。 .
-   SHA-256与FIPS载体和 `node:crypto`。 。 。 .
-   客户端测试涵盖了上面的每个拒绝, HTTP 错误映射, 超时, 并且密钥和令牌没有状态出现, 返回值、检查、JSON或错误.
-   文件存储测试覆盖文件布局, 专属 `0600` 创建和腐败的文件。 POSIX 模式断言为 跳过视窗. `records.test.js` 覆盖记录, `complete()` 以假服务器和追踪器盟誓 (OQ-23,前注,预留残渣,收款人交货签名,出针),和剖面锁:两家商店,a Python 和一个 JavaScript 进程, 一次更新一个配置文件会失去任何效果( 跳过没有 `python/src` 财务报告和审定财务报表 Python 3.10+) (英语). `approvals.test.js` 涵盖未完成的分类和 `prepare()`。 。 。 .
-   代理工具在Python参考物本身进行测试. `test/fixtures/generate_python_fixtures.py` 运行 蟒 `ValunAgent` (CPython 3.14)超过所记录的服务器响应,一个固定的时钟,固定的ID和一个固定的DNS表. `agent-parity.test.js` 通过JS代理重新播放所有记录的情景. 成果必须是平等的,关键顺序 包括,而且必须包括请求(签字除外),发送的每个签名(它必须核实准确的字节) Python为请求签名 存储状态, `isCommitment`, (中文(简体) ), `prepare()` (约束性论据和批准) 或拒绝及其原因), `bind()` 以及原始和约束论据的批准文本. 帮助级产出(计量、沙盒结果、记录、批准文本引用、, `int()`, (中文(简体) ), `repr()`IP 读取 和共享常数(核准句子、标签、工具类)进行同样的比较 `sandbox-python.json` 是服务器的固定器。 任何测试失败 `valun.*` 模块 在固定装置生成后,已更改.

TypeScript 声明 (`src/index.d.ts`, (中文(简体) ), `src/file-store.d.ts`, (中文(简体) ), `src/dns.d.ts`(通过) `tsc --noEmit --strict --lib es2022,dom` 使用类型脚本 6.0.3 运行 `npx`它不是一个依赖.

这个客户端的BLAKE2b,sepp256k1和Schnorr代码不是常时. 这对本地的签名人来说是罚款的 实验,不是为曝光的签名服务.

驾照:麻省理工.

## 常见问题

### @fitzdoud/valun 是什么？

0依赖性 JavaScript/TypeScript客户端为Valun代理信用网络\(valun-deal/1\):本地secp256k1密钥 Basid Schnor签名,每次签名前的独立检查\. 实验飞行员:合成单位,未定\.

### 如何安装 @fitzdoud/valun？

在项目目录运行 npm install @fitzdoud/valun，或使用 pnpm add / yarn add / bun add。

### @fitzdoud/valun 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @fitzdoud/valun 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @fitzdoud/valun 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=18。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @fitzdoud/valun 可以商用吗？

@fitzdoud/valun 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @fitzdoud/valun 的下载量有多少？

根据 npm 官方下载统计，@fitzdoud/valun 在 2026/10/15 – 2026/11/13 这 30 天内被下载 2,643 次，日均约 88 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @fitzdoud/valun 还在维护吗？

最新版本 0\.7\.0 发布于 2026/11/14（今天）；至今共发布 18 个版本，其中过去 12 个月发布了 18 个；首次发布于 2026/11/08。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

