温斯多克
用于JavaScript和TypeScript的Dash平台WebAssembly SDK. 该核心在Rust中实施并被编译为WebAssembly;一薄的无害环境管理包装器暴露出一个方便的JS API,它同时在Node.js和现代浏览器中工作.
SDK规定:
- 密码学的公用设施:元能生成/验证,密钥衍生,密钥对生成,地址验证,信件签名.
- 平台状态过渡和查询:身份,文档,数据合同,令牌,组,时代/系统,投票,证明(当支持时).
- 构建者模式( E)
WasmSdkBuilder)为网络支持的查询配置和构建客户端.
本套装载有单一档案的无害环境管理材料(dist/sdk.js) 由Wasm内置并编译出浏览器主线程. 高级用户还可以选择在下列情况下单独使用原始文物: dist/raw/*。 。 。 .
安装
从 npm( 消费者应用程序) :
npm install @dashevo/wasm-sdk
# or
yarn add @dashevo/wasm-sdk
从这个单列波(贡献者):
# fast for development
yarn build
# or optimized
yarn run build:release
套件为只使用无害环境管理("类型":"模块"). 在CommonJS中,使用动态导入 ().
使用量
总是打电话 await init() 在使用 API 之前的一次。 拨打多次电话是天真而安全的.
节点.js(ESM)
import init, * as sdk from '@dashevo/wasm-sdk';
// Initialize Wasm (Node uses an inlined binary; no assets to load)
await init();
// Crypto helpers
const { address } = sdk.generate_key_pair('testnet');
console.log('Address:', address);
// Optional: enable logs (silent by default)
await sdk.WasmSdk.setLogLevel('warn'); // or 'info' | 'debug' | full filter
// Platform queries via a client
let builder = sdk.WasmSdkBuilder.testnetTrusted();
builder = builder.withSettings(5000, 10000, 3, true);
const client = await builder.withLogs('warn').build();
const DPNS = 'GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec';
const docs = await client.getDocuments({
dataContractId: DPNS,
documentTypeName: 'domain',
limit: 5,
});
console.log('Docs:', docs.length);
client.free();
浏览器( Bundler, 无害环境管理)
import init, * as sdk from '@dashevo/wasm-sdk';
// Initialize Wasm (browser compiles in a Web Worker; no separate .wasm files)
await init();
const ok = sdk.validate_address('yXXX...', 'testnet');
高级:原始文物(分离.wasm)
如果你喜欢管理 .wasm 通过您的捆绑器导入原始条目:
import init, * as sdk from '@dashevo/wasm-sdk/raw';
await init(); // wasm-bindgen will resolve and fetch wasm_sdk_bg.wasm
配置您的捆绑器 。 网络包装5:
// webpack config
module.exports = {
experiments: { asyncWebAssembly: true },
module: { rules: [{ test: /\.wasm$/, type: 'asset/resource' }] },
};
如何捆绑
可出版的建筑提供了两种消费SDK的方法:
- 单个文件( 默认) :
import '@dashevo/wasm-sdk'
dist/sdk.js将瓦斯姆(基数64)纳入避免资产管道和MIME问题.- 浏览器:在Web Worker中编译出内嵌字节来避免主行行道摊位和8MB同步限制;再用主线程进行即时处理.
- 节点: 内部使用 inlined 字节; 您仍然调用
await init()为一致的API. - 包装器导入了一种已消毒的原生胶的变体,所以捆绑者不会"看到"任何
new URL('…wasm')因而不能释放出一个.wasm资产.
- 原始文物(选入):
import '@dashevo/wasm-sdk/raw'
dist/raw/wasm_sdk.js(未修改的同位素输出)+dist/raw/wasm_sdk_bg.wasm。 。 。 .- 您的捆绑者必须服务于
.wasm与正确的内容类型和 URL 重写.
为什么是这个设计?
- 在测试/测试中消除Flashy Wasm资产处理,并简化消费者设置.
- 为资产管道用户保留一个逃生舱口.
构建(贡献者)
先决条件: Rust工具链, wasm-pack,和(可选的)二进制结构.
命令( 在 repo 根或内部运行) packages/wasm-sdk:
# Development build (fast)
yarn workspace @dashevo/wasm-sdk build
# Release build (optimized)
yarn workspace @dashevo/wasm-sdk build:release
测试(贡献者)
单位测试(节点+浏览器/Karma):
yarn workspace @dashevo/wasm-sdk test:unit
功能测试( 联网; 离线时可能跳过一些 ) :
yarn workspace @dashevo/wasm-sdk test:functional
API 要点
实例(见下文) await init():
// Addresses & keys
const { address, private_key_wif } = sdk.generate_key_pair('mainnet');
sdk.validate_address(address, 'mainnet');
const addr = sdk.pubkey_to_address('02...pubkeyHex', 'testnet');
// Mnemonics & derivation
const m = sdk.generate_mnemonic(12);
const r = sdk.derive_key_from_seed_with_path(m, undefined, "m/44'/5'/0'/0/0", 'mainnet');
// Network client
let b = sdk.WasmSdkBuilder.testnetTrusted();
const client = await b.withSettings(5000, 10000, 3, true).withLogs('info').build();
const status = await client.getStatus();
// Enumerate contracts one page at a time, ascending by id (pass the last key as startAfter)
const contracts = await client.getDataContractsByRange({ limit: 100 });
// Check that contracts held locally are still current (versions only; the contracts themselves only with includeContracts)
const versions = await client.getDataContractsLatestVersions({ contractIds: ['GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec'] });
// Contract groups: a group's owner/admins/name, its members one kind at a time (page with nextStartAfter), and the groups a contract is in
const contractGroupId = '8Y4NJ3bDgNvWm6tMMXAdEWQEvkqbCiCSwK9KpQTPMFZ2'; // a contract group id, not a contract id
const groupInfo = await client.getContractGroupInfo(contractGroupId);
const members = await client.getContractGroupMembers({ contractGroupId, kind: 'contracts', limit: 50 });
const memberships = await client.getContractGroupsForContract('GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec');
// What is left of the budgets of an identity's keys: a bigint per budgeted key (0n = spent), null for a key without a budget
const budgets = await client.getIdentityKeysRemainingBudgets('5mjGWa9mruHnLBht3ntBi8CZ6sNk3hZZsQMgTvgQobjS', [3, 4]);
// Raise the limits of a key: add credits to its budget, or move its expiry later (signed by a MASTER key or an unlimited CRITICAL key)
const key = await client.identityUpdateKeyLimits({ identity, keyId: 5, addBudget: 100000000n, signer });
// Seed a contract the app already holds (a bundled snapshot); pair with the versions check above
client.addKnownContract(contract);
client.free();
整个表面包括身份、文件、合同、信使、群体、时代/系统以及证明助手.
日志
默认SDK是无声的. 您可以在全球或通过构建者启用追踪日志 :
// Globally
await sdk.WasmSdk.setLogLevel('info');
// Or on the builder (applies immediately)
await sdk.WasmSdkBuilder.new_testnet().withLogs('wasm_sdk=debug,rs_dapi_client=warn').build();
接受值是简单的等值 ('off''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''.
环境兼容性
- 仅限无害环境管理包 ("类型":"模块"). 在 CJS 中使用动态导入 .
- 节点.js:16+推荐(18+首选).
- 浏览器:有WebAssembly + Web Workers的现代引擎.
解决问题
-
在浏览器中
- 确保您导入默认条目( E)
@dashevo/wasm-sdk除非您已经配置了瓦斯姆资产. - 永远
await init()在调用函数之前.
- 确保您导入默认条目( E)
-
提供错误的Karma/webpack:
- 默认的单文件构建不适用 。 如果你选择加入
@dashevo/wasm-sdk/raw配置一个.wasm资产规则和正确 MIME 类型.
- 默认的单文件构建不适用 。 如果你选择加入
贡献许可( L)
这个包是Dash平台单列波的一部分. 遵循存储处的贡献准则,不犯秘密。 有关许可详情,请参见根库.
国家过渡
除了只读查询之外,SDK还会让帮助者去构建和提交状态过渡(需要网络客户端和有效输入):
import init, * as sdk from '@dashevo/wasm-sdk';
await init();
const builder = sdk.WasmSdkBuilder.testnetTrusted();
const client = await builder.build();
// Identity create (example — requires a valid proof and keys)
const proofJson = JSON.stringify({ /* platform-provided proof object */ });
const assetLockWif = 'Kx...';
const pubKeysJson = JSON.stringify([
{ keyType: 'ECDSA_SECP256K1', purpose: 'AUTHENTICATION', securityLevel: 'MASTER', privateKeyHex: '...' },
]);
await sdk.identityCreate(proofJson, assetLockWif, pubKeysJson)
.then(() => {/* submitted */})
.catch((e) => {/* handle error */});
// Token transfer (negative example if parameters are invalid)
await sdk.tokenTransfer('contractId', 0, '1000', 'senderIdentityId', 'recipientIdentityId', assetLockWif, null)
.catch(() => {});
client.free();