XChain 平台 - 软件开发者 Kit (SDK)
SDK 用于 XChain 平台: 生成 XChain 交易并查询块链数据.
特征
- 31 行动类型数字 :
sdk.send(), (中文(简体) ),sdk.issue(), (中文(简体) ),sdk.mint(), (中文(简体) ),sdk.stake(),还有27个方便方法 - 交易周期数字 :
sdk.submitAction()在一个呼叫中处理完整编码 - > 标志 - > 广播 - > 等待管道 - 钱包会话数字 :
sdk.session(wif)组合地址/关键/UTXO状态,用于一个地址的重复行动 - 费用估计数字 :
sdk.estimateFees()不签名或广播的返回费信息 - UTXO 链式: 内置的 UTXO 缓存可防止在快速相继交易上重复花费
- 工作流程配方数字 :
sdk.issueAndDistribute(), (中文(简体) ),sdk.deployAndFund(), (中文(简体) ),sdk.stakeAndDelegate()和更多 - 跨链助手:协调跨 BTC、LTC 和 DOGE SDK 实例的互换和平行行动
- 事件驱动的确认数字 :
sdk.waitForAction(txid)当索引器处理交易时解决 - 合同结算门数字 :
sdk.waitForContractState(index, { key: 'status', equals: 'FUNDED' })财务报告和审定财务报表sdk.waitForContractBalance(index, tick, { minQuantity })等待合同本身的状态,这是唯一不能与索引者相竞争的信号;submitAction({ awaitContract: {...} })开同一扇门 所以在合同被记帐之前 押金不会回手控制 - 互动反应数字 :
npm run repl与预配置 SDK 实例一起跳入一个动态会话 - 自动选择格式: 为每个动作选择最小的编码格式
- PSBT 生成: 与 xchain- 编码器集成以生成未签名的交易
- 115+ 探索者查询方法: 余额、代号、交易、市场、历史、合同
- 批量构建器: 流畅的API :
await sdk.batch().send({...}).mint({...}).build()(单位:千美元)build()正在同步) - 实时活动: WebSocket 有自动重联和接续的流经
onBlock(), (中文(简体) ),onAction(), (中文(简体) ),onAddress(), (中文(简体) ),onToken(), (中文(简体) ),onMarket(), (中文(简体) ),onDispenser(), (中文(简体) ),onBetFeed(), (中文(简体) ),onXcall(), (中文(简体) ),onAttestation()和更多;sdk.ws曝光低端客户端( q)subscribe(), (中文(简体) ),on(), (中文(简体) ),listSubscriptions()直接(...) - 加密信件ECIES、ECDH和AES加密MESSAGE行动;
messaging.send()接受一个Buffer有效载荷和getMessages()曝光情况msg.bytes二进制 ECIS - 调制解析文件数字 :
sdk.gatedFile.encryptFileBytes()财务报告和审定财务报表sdk.gatedFile.encryptPack()生产AES-256-GCM Ciphertext + 密钥用于 FILE v1 闸口内容; 密钥交接作为紧凑的33字节二进制有效载荷通过serializeKeyPayload()编号 :parseKeyPayload()(以二进制模式通过ECIES发送). 见 调试内容 - 证明信封助手数字 :
AttestationHelpers.llm({...})建造JSON信封,发给VM合同xchain.attestation.request(...)有提供者 id'llm'· ;AttestationHelpers.httpGet({url})验证 URL并返回有效载荷字符串'http_get'· ;AttestationHelpers.requestOptions({redundancy, deadlineBlocks})构建网关选项对象。 根据设计,这些只是信封构建器:没有用户可推荐的ATTEST动作. ATTEST v0(请求)和v1(答复)为VM-发送:合同呼叫xchain.attestation.request(...)并释放出链上的证据。 因此,SDK帮助你塑造一个合同提出的要求,你通过getAttestations()它没有(而且不能)直接编码ATTEST行动,同样,XCALL只编码VM-排放. - 拥有权交易助手数字 :
ORDER编号 :SWAP编号 :DISPENSERv0 载GIVE_OWNERSHIP编号 :GET_OWNERSHIP旗帜;SWEEP独立携带ORDERS编号 :SWAPS编号 :DISPENSERS旗帜( 是单一的)ESCROWS旗帜) - HTTP 402次付款数字 :
X402Client财务报告和审定财务报表X402Gateway实施XChain-native, x402- 形状的按呼计酬流程,在链式SEND行动之上进行xchain-send(按要求付费),xchain-dispenser(持有进入权),和xchain-deposit(计算支出分类账)计划;客户只支付每笔勾maxAmount最高的,每一次都拒绝。 见 x402 付款额 - 以合同为目标的抽取数字 :
session.stakeToContract({ amount, signingPubkey, targetContractIndex, tick }), (中文(简体) ),session.unstakeFromContract({...}),以及session.delegateForContract({...})将STAKE v3 / UNSTAKE v1 / DELEGATE v1 与通过DEBOY v1(与COOLDOWN_BLOCKS+ 键SLASH_DESTINATION) (中文(简体) ). 高级别食谱:sdk.deployStakeableContract()财务报告和审定财务报表sdk.stakeToContractAndDelegate() - NFT 帮助者数字 :
sdk.nft.unique(), (中文(简体) ),sdk.nft.edition(), (中文(简体) ),sdk.nft.collectionItem(), (中文(简体) ),sdk.nft.attachContentParams(),以及sdk.nft.isNft()用于构建 NFT 模式(ISSUE 有 DECIMALS=0 + LOCK MAX SUPPLY=1) 外加高级sdk.issueNft(), (中文(简体) ),sdk.issueNftEdition(), (中文(简体) ),sdk.issueCollectionItem(),以及sdk.attachContent()提交食谱 - 项目登记册助手数字 :
sdk.project.rosterParams()财务报告和审定财务报表sdk.project.rosterEditParams()为所有者测试的代号名册建立列表动作;sdk.setRoster()运行列表然后 LINK 并等待索引器 - 车票压缩: 在默认情况下; 解决其紧凑的符号计数器
^id在编码缩小链上有效载荷大小之前,通过探险器形成电线; 选择退出{ compactTickers: false } - MCP 服务器数字 :
npx xchain-mcp将所有探索者查询工具曝光为 模型背景协议工具,供 AI 代理使用 - 钱包认证( A):关键管理,PSBT签名,质疑-回应核查
- 智能合同:通过xchain-vm集成部署、执行、交存、退出
- 飞行前合同身份: 已部署的合同必须出口
meta: { name, description, version }(单位:千美元)CONTRACT_META_REQUIRED) (中文(简体) ).sdk.deploy(), (中文(简体) ),session.deploy(), (中文(简体) ),session.deployChunk(), (中文(简体) ),sdk.deployAndFund()财务报告和审定财务报表sdk.deployStakeableContract()在动作组成前静地读取,并用链条本身的判决字符串拒绝,因此索引者会拒绝一份合同,永远不收费.sdk.contracts.getExportedMeta(source)显示相同的读取 - 枢纽发现: xchain-hub 的自动解析服务端点
- 用后退重试:处理HTTP 429/502/503/504,尊重
Retry-After页眉 - 请求钩子数字 :
onRequest, (中文(简体) ),onResponse, (中文(简体) ),onError, (中文(简体) ),onRetry调用 - 类型脚本定义: 满
.d.ts用于 IDE 自动完成 - 浏览器捆绑: 用于客户端的浏览构建
文档
完整的 SDK 开发者指南发布于 文件.xchain.io/组件/sdk数字 :
| 文档 | 说明 |
|---|---|
| 读取 | 概述、安装、使用模式 |
| 配置 | 构造选项, env vars, 枢纽发现, 重试, 集合, 钩子 |
| 行动 | 所有31个行动类型:参数、验证规则、格式版本、实例 |
| 交易周期 | 提交操作、费用估算、UTXO链接、P2SH两相处理 |
| 钱包会话 | 绑定钱包会话、便利方法、 UTXO 缓存 |
| 工作流量 | 高级食谱:发布和分配、部署和基金、利害关系和删除 |
| 横琴 | 多链协调:平行行动、互换、链接 |
| 浏览器 | 所有115+查询方法: 余额、指使、交易、市场 |
| 编码器 | PSBT 生成:编码类型,选项,飞行前验证,P2SH 二相 |
| 批量构建器 | 多动作交易的流利 API |
| 合同 | VM智能合同集成:部署,执行,交存,退出 |
| 网络安全套 | 实时活动流:块、行动、地址、市场 |
| 钱包认证( A) | 关键管理、PSBT签署、质疑-答复核查 |
| 通讯 | ECIES/ECDH/AES MESSAGE行动的加密 |
| 轻型客户端( SPV) | 针对计分加权检查站进行加密平衡/行动核查 |
| NFT 注册创建器 | NFT模式构建者、收集/内容附件、项目名册 |
| 格式选择 | SDK 如何选择最佳格式版本 |
| 错误 | 所有错误类别、代码和故障排除 |
| 实例 | 端到端代码示例 |
安装
npm install @dankest-llc/xchain-sdk
节点22或更新. 为了针对源进行开发,克隆此寄存器和 npm install 内部; 辅助的 AI 代理的 MCP 服务器单独发布为 xchain-mcp。 。 。 .
快速启动
const { XChainSDK } = require('@dankest-llc/xchain-sdk');
// Zero-config: a network alone targets the public XChain Platform.
// Mainnet/testnet default to the public hosts (hub.xchain.io discovers
// explorer/encoder, falling back to explorer.xchain.io / encoder.xchain.io);
// on any *-regtest network only the explorer defaults to localhost:8080. The
// encoder (needed for writes) needs ENCODER_URL or ENCODER_PORT, and the
// WebSocket needs a WEBSOCKET_* or EXPLORER_* URL or port (or the matching
// constructor options).
const sdk = new XChainSDK({ network: 'bitcoin-mainnet' });
// To point at your own services, pass full URLs (include the scheme; a
// bare host is treated as http://host:<dev-port>):
// const sdk = new XChainSDK({
// network: 'bitcoin-mainnet',
// explorerUrl: 'https://explorer.example.com',
// encoderUrl: 'https://encoder.example.com'
// });
// Generate an action string
const result = await sdk.send({
tick: 'MYTOKEN',
amount: '100',
destination: 'bc1q...',
memo: 'Payment'
});
console.log(result.actionString); // 'SEND|0|MYTOKEN|100|bc1q...|Payment'
// Multi-destination SEND: one entry per recipient. The wire format version
// is chosen from the legs (v1 shared tick, v2 per-leg tick, v3 per-leg memo).
// A flat {tick, amount, destination} map can only ever express ONE leg, so
// the SDK refuses one against a multi-leg format instead of repeating leg 1.
const multi = await sdk.send({
tick: 'MYTOKEN',
legs: [
{ amount: '100', destination: 'bc1qaddr1...' },
{ amount: '250', destination: 'bc1qaddr2...' }
]
});
console.log(multi.actionString); // 'SEND|1|MYTOKEN|100|bc1qaddr1...|250|bc1qaddr2...'
// Full lifecycle: create, encode, sign, broadcast, wait for indexer
const tx = await sdk.submitAction(
{ action: 'SEND', params: { tick: 'MYTOKEN', amount: '100', destination: 'bc1q...' } },
{ pubkey: '02abc123...' },
{ wif: 'your-wif-key' }
);
console.log(tx.txid); // transaction hash
console.log(tx.indexed); // action data from the indexer
// Wallet session: bind to a key and send multiple actions
const session = sdk.session('your-wif-key');
await session.send({ tick: 'MYTOKEN', amount: '50', destination: 'bc1q...' });
await session.send({ tick: 'MYTOKEN', amount: '50', destination: 'bc1q...' });
const balances = await session.getBalances();
// Workflow recipes: multi-step operations in one call
await sdk.issueAndDistribute('your-wif-key',
{ tick: 'NEWTOKEN', maxSupply: '1000000', decimals: 8 },
[
{ destination: 'bc1qaddr1...', amount: '500000' },
{ destination: 'bc1qaddr2...', amount: '300000' }
]
);
// Deploy a smart contract. Every contract must export its identity: `meta.name`
// and `meta.description` are consensus-required (CONTRACT_META_REQUIRED), and
// `meta.version` is optional but indexed. Use STRING LITERALS: the chain evaluates
// `meta` at deploy, so a computed name is not what you read in the source, and the
// pre-flight cannot check it for you.
const code = `module.exports = {
meta: {
name: 'Escrow', // 1..64 bytes
description: 'Two-party escrow with an arbiter', // 1..512 bytes
version: '1.0.0' // optional, 1..32 bytes
},
permissions: ['SEND'],
initialize(xchain) { xchain.state.set('status', 'OPEN'); }
};`;
await session.deploy({ code, gasLimit: 200000 });
// A contract with no conforming meta is refused BEFORE anything is composed,
// signed or broadcast, with the exact verdict the indexer would have written:
// SDKContractError: invalid: CONTRACT_MANIFEST (meta required)
// Pass { preflight: 'warn' | 'off' } (session/workflow seams) or
// { lint: 'warn' | 'off' } (sdk.deploy) to downgrade or skip the check; the
// deploy is still rejected on-chain. A computed or unreadable `meta` only warns.
sdk.contracts.getExportedMeta(code); // { status: 'present', name: 'Escrow', ... }
// Query blockchain data. The token record arrives NESTED under `info`:
const token = await sdk.getToken('MYTOKEN');
token.info.tick_id; // '42' <- the fields live here
token.tick_id; // undefined
// A tick that does not exist answers HTTP 404, so getToken() THROWS
// SDKExplorerError (code EXPLORER_HTTP_404) instead of answering an empty
// body. Use these for an existence check rather than a try/catch:
await sdk.tokenExists('MYTOKEN'); // true / false, never throws on absence
await sdk.findToken('MYTOKEN'); // the unwrapped info record, or null
// Both answer "absent" only for the 404. A timeout, network failure, 429 or
// 5xx still throws, because an explorer that could not answer is not proof
// that the ticker is free.
配置
| 变量 | 需求 | 默认 | 说明 |
|---|---|---|---|
NETWORK | 对 | (无) | 默认硬币和网络(例如. bitcoin-regtest, (中文(简体) ), dogecoin-mainnet(中文(简体) ) |
SDK_API_PORT | 没有 | 3005 | 可选 SDK 助手 API 的端口 |
SDK_API_KEY | 没有 | (无) | 帮助 API 的 API 密钥; 需要作为 Authorization: Bearer <key> 每种方法,但 ping (方法在未设定时以 401 拒绝) |
CORS_ORIGIN | 没有 | 已禁用 | 允许帮助者 API 的来源 |
SDK_API_MAX_BATCH | 没有 | 20 | 最大 JSON- RPC 在一个阵列( 批量) 中调用 。 除正整数外的任何东西(1e3, (中文(简体) ), 50abc, (中文(简体) ), 0, (中文(简体) ), -5)还原为 20 并记录启动时的警告;没有值禁用上限 |
SDK_API_RATE_LIMIT | 没有 | 300 | 每个窗口每个证书的请求( 未经认证时每个源地址) 。 非数值或负数值回落到 300; 明示 0 禁用限制器, 这是关闭它的唯一方法 |
SDK_API_RATE_WINDOW_MS | 没有 | 60000 | 固定费率限制窗口的长度,以毫秒为单位。 除正整数毫秒外的任何东西(60s, (中文(简体) ), 1e5, (中文(简体) ), 1.5, (中文(简体) ), 0)还原为 60000 并记录启动时的警告 |
EXPLORER_URL 编号 : EXPLORER_PORT | 没有 | 127.0.0.1 编号 : 8080 | x链- 探索器位置 。 一个 explorerPort 选项,但无需 URL 指向探索者及其 WebSocket localhost 在每一个网络上,并把它们 与中枢发现。 API 和 REPL 通行证 EXPLORER_PORT 所以在主网和测试网, EXPLORER_PORT 无 EXPLORER_URL 点数 localhost;在图书馆使用中, EXPLORER_PORT 让公共探险家独处 |
ENCODER_URL 编号 : ENCODER_PORT | 没有 | 127.0.0.1 编号 : 3003 | xchain- 编码器位置 |
ENCODER_API_KEY | 没有 | (无) | API 密钥发送为 x-api-key 到一个x链编码器,其操作员设置 API_KEY; 也可以以 encoderApiKey 选项。 只有一个 encoderUrl 或者说 encoderPort 构造器选项给编码器打上针:如果没有一个,中枢发现可以重新给编码器客户端指针,然后键去任何主机中枢名称的编码器. 一个 encoderPort 选项,但无需 URL 指向编码器 localhost 每个网络。 帮助者 API(npm run api(a) 赔偿要求npm run repl(通过) ENCODER_URL 财务报告和审定财务报表 ENCODER_PORT 作为这些选项,所以有1个指针;在图书库使用中,只有变量没有。 当作证书 |
HUB_URL | 没有 | (无) | 全xchain-hub URL 仅由 REPL 读取(npm run repl)),其优于 HUB_API_HOST; 库和助手 API 忽略它 |
HUB_API_HOST 编号 : HUB_PORT | 没有 | https://hub.xchain.io/<COIN> 主网和测试网; 重新测试时没有中枢 | xchain-hub 位置由库和助手API读取. 使用裸体主机( 与 HUB_PORT默认值 10000或全数 http:// 或者说 https:// URL,在这种情况下 HUB_PORT 被忽略。 助手API通过 HUB_PORT 作为 hubPort 在主网和测试网, HUB_PORT 无 HUB_API_HOST 在中心点上 localhost;在图书馆使用中, HUB_PORT 独自离开公共中心 |
HUB_API_KEY | 没有 | (无) | API 密钥用于 getallconfigs 对按键的枢纽; 公开的零配置发现应使用枢纽的链式注册端点代替 |
WEBSOCKET_URL 编号 : WEBSOCKET_PORT | 没有 | 127.0.0.1 编号 : 3007 | 探索者 WebSocket 更新的结束点 。 与裸体主机连接 WEBSOCKET_PORT; 满 ws:// 或者说 wss:// 按给定使用 URL, 并全 http:// 或者说 https:// URL变成 ws:// 或者说 wss://,在两种情况下均未添加端口 |
脚本
| 命令 | 说明 |
|---|---|
npm run api | 启动 JSON- RPC 服务器( 端口来自 SDK_API_PORT,默认3005 |
npm test | 运行单元测试(6 351个测试) |
npm run repl | 用预配置的 SDK 实例启动交互 REPL |
npm run build | 生产浏览器捆绑 - > dist/xchain_sdk.min.js |
npm run build:dev | 开发浏览器捆绑 - > dist/xchain_sdk.js |
API 服务器模块
npm run api (单位:千美元)node ./src/api/index.js)运行 JSON-RPC 服务器作为一个独立进程,打开一个收听器 SDK_API_PORT 满载。 消费者想要拥有服务器,将服务器安装在现有快件下,选择自己的收听路径,或者从测试开始并阻止它,则需要模块直接而不是轰出脚本:
const { createApp, startApi } = require('@dankest-llc/xchain-sdk/src/api');
// createApp(sdk) is synchronous and listener-free: it wires the same guard
// stack (rate limit, auth gate, batch cap, /openrpc.json, JSON-RPC router)
// as the CLI entry and returns the express app to mount yourself.
const app = createApp(sdk);
// startApi({ port }) builds the SDK from the environment, runs hub discovery,
// and resolves to the listening http.Server (port 0 for an ephemeral port).
const server = await startApi({ port: 0 });
await new Promise((resolve) => server.close(resolve));
请求 src/api 永不打开套接字;只打开 CLI 条目(npm run api 编号 : node ./src/api/index.js)开始自动收听.
测试套件
| 类型 | 测试 |
|---|---|
| 单位: 动作、 验证器、 格式选择、 方便方法、 探索器、 编码器、 重试、 WebSocket、 钱包、 认证、 合同、 联合签名人 | 3206+ (韩语) |
| 整合:跨模块流动、VM/合同整合、枢纽发现 | 98岁以上 |
| 安全:输入攻击表面、认证门 | 18岁以上 |
| 后退: 配置的临界路径套件,包括回转序列化 - > 剖析 - > 校验 | 23岁以上 |
| 边界:精确编码界限 | 35岁以上 |
| 模糊:垃圾类型,单码,原型污染 | 65岁以上 |
| 混乱: 反应错误、 HTTP 错误、超时 | 27岁以上 |
| 烟:靴子API服务器,端到端的JSON-RPC | 9个+ |
| 业绩 | 3个 |
| 共计 | 3484+ (英语) |
版权:2025-2026 Dankest, LLC
依据创用CC授权使用 页:1
凭 GNU 阿费罗通用公共许可证 v3.0 (AGPL-3.0-或-后期) 拥有可供专有使用的商业许可证.
您可以根据许可证的规定使用、修改和分发这些材料. 见 自由主义 财务报告和审定财务报表 通知 满期. 见 许可概览。 。 。 .