名称:午夜工具:合约部署
描述:用于将Compact合约部署到Midnight测试网或主网,配置网络端点,处理部署确认,排查部署失败问题,或为CI/CD设置部署脚本。
合约部署
将Compact智能合约部署到Midnight测试网或主网,并进行正确的配置、验证和错误处理。
使用时机
- 首次部署已编译的Compact合约
- 为部署配置网络端点
- 处理部署交易确认
- 排查失败的部署
- 为CI/CD设置部署脚本
核心概念
部署流程
- 编译合约 - 使用
compact compile 生成构件
- 配置网络 - 设置索引器、证明器和节点端点
- 为部署者注资 - 确保账户有足够的tDUST(测试网)或DUST(主网)
- 提交交易 - 部署合约并等待确认
- 验证部署 - 在链上查询合约地址
网络配置
| 网络 |
索引器 |
证明器 |
使用场景 |
| 测试网 |
indexer.testnet.midnight.network |
prover.testnet.midnight.network |
开发、测试 |
| 主网 |
indexer.midnight.network |
prover.midnight.network |
生产环境 |
合约构件
使用 compact compile 后,输出目录包含:
contract.cjs - 合约字节码和电路
contract.d.cts - 合约接口的TypeScript类型定义
circuit-keys/ - ZK电路证明密钥
参考文档
示例
快速开始
1. 配置网络
import { NetworkConfig } from '@midnight-ntwrk/midnight-js-types';
const config: NetworkConfig = {
indexer: 'https://indexer.testnet.midnight.network',
indexerWs: 'wss://indexer.testnet.midnight.network/ws',
prover: 'https://prover.testnet.midnight.network',
};
2. 加载合约构件
import { Contract } from './contract.cjs';
import type { ContractTypes } from './contract.d.cts';
const contractArtifact = Contract;
3. 部署
import { deployContract } from '@midnight-ntwrk/midnight-js-contracts';
const deployedContract = await deployContract({
wallet,
artifact: contractArtifact,
initialState: { /* 初始账本状态 */ },
config,
});
console.log('部署地址:', deployedContract.address);
常见模式
基于环境的配置
const getNetworkConfig = (): NetworkConfig => {
const network = process.env.MIDNIGHT_NETWORK || 'testnet';
if (network === 'mainnet') {
return {
indexer: 'https://indexer.midnight.network',
indexerWs: 'wss://indexer.midnight.network/ws',
prover: 'https://prover.midnight.network',
};
}
return {
indexer: 'https://indexer.testnet.midnight.network',
indexerWs: 'wss://indexer.testnet.midnight.network/ws',
prover: 'https://prover.testnet.midnight.network',
};
};
带重试机制的部署
async function deployWithRetry(
config: DeployConfig,
maxRetries = 3
): Promise<DeployedContract> {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await deployContract(config);
} catch (error) {
if (attempt === maxRetries) throw error;
console.log(`第 ${attempt} 次尝试失败,正在重试...`);
await new Promise(r => setTimeout(r, 2000 * attempt));
}
}
throw new Error('重试后部署失败');
}
部署验证
async function verifyDeployment(
address: string,
indexer: IndexerClient
): Promise<boolean> {
try {
const contractInfo = await indexer.getContractInfo(address);
return contractInfo !== null;
} catch {
return false;
}
}
相关技能
midnight-setup - 部署前的环境准备
contract-calling - 调用已部署的合约
lifecycle-management - 部署后的合约管理
midnight-ci - CI/CD中的自动化部署
相关命令
/midnight:check - 验证环境是否已准备好进行部署