交易提交
交易提交是将已签名的 Cardano 交易广播到网络的过程。本示例展示了如何使用不同的方法提交交易。
使用 cardano-wallet-js
安装依赖
npm install cardano-wallet-js axios
基本提交
import axios from 'axios';
import { Seed, WalletServer } from 'cardano-wallet-js';
async function main() {
// 生成恢复短语(可选)
// let recoveryPhrase = Seed.generateRecoveryPhrase();
// console.log('Recovery Phrase: ', recoveryPhrase);
// 转换为助记词列表
// let mnemonic_sentence = Seed.toMnemonicList(recoveryPhrase);
// 设置密码和名称
// let passphrase = 'tangocrypto';
// let name = 'namet';
// 准备交易数据
const buffer = Buffer.from('0x....', 'hex');
// 提交到测试网
const response = await axios({
headers: {
'Content-Type': 'application/cbor',
},
method: 'post',
url: 'https://submit-api.testnet.dandelion.link/api/submit/tx',
data: buffer,
});
console.log(response);
}
提交端点
测试网端点
// Dandelion 测试网
const TESTNET_SUBMIT_URL = 'https://submit-api.testnet.dandelion.link/api/submit/tx';
// IOHK 测试网
const IOHK_TESTNET_URL = 'https://testnet.cardano.org/api/submit/tx';
主网端点
// 主网提交端点
const MAINNET_SUBMIT_URL = 'https://submit-api.mainnet.dandelion.link/api/submit/tx';
交易格式
CBOR 格式
Cardano 交易以 CBOR (Concise Binary Object Representation) 格式提交:
// 从十六进制字符串转换为 Buffer
const hexString = '0x...'; // 你的交易十六进制字符串
const buffer = Buffer.from(hexString, 'hex');
// 或者从 Base64 字符串转换
const base64String = '...'; // 你的交易 Base64 字符串
const buffer = Buffer.from(base64String, 'base64');
请求头设置
const headers = {
'Content-Type': 'application/cbor',
'Accept': 'application/json',
};
错误处理
基本错误处理
try {
const response = await axios({
headers: {
'Content-Type': 'application/cbor',
},
method: 'post',
url: submitUrl,
data: buffer,
timeout: 30000, // 30 秒超时
});
console.log('Transaction submitted successfully:', response.data);
return response.data;
} catch (error) {
if (error.response) {
// 服务器响应了错误状态码
console.error('Submission failed:', error.response.status, error.response.data);
} else if (error.request) {
// 请求已发出但没有收到响应
console.error('No response received:', error.request);
} else {
// 设置请求时发生错误
console.error('Request setup error:', error.message);
}
throw error;
}
常见错误码
- 400: 请求格式错误
- 403: 交易验证失败
- 500: 服务器内部错误
- 503: 服务不可用
交易状态检查
检查交易确认
async function checkTransactionStatus(txHash: string) {
try {
const response = await axios.get(
`https://explorer.cardano-testnet.iohkdev.io/api/transactions/${txHash}`
);
const status = response.data;
console.log('Transaction status:', status);
return status;
} catch (error) {
console.error('Failed to check transaction status:', error);
throw error;
}
}
批量提交
多个交易提交
async function submitMultipleTransactions(transactions: Buffer[]) {
const results = [];
for (let i = 0; i < transactions.length; i++) {
try {
console.log(`Submitting transaction ${i + 1}/${transactions.length}`);
const response = await axios({
headers: { 'Content-Type': 'application/cbor' },
method: 'post',
url: submitUrl,
data: transactions[i],
});
results.push({
index: i,
success: true,
data: response.data
});
// 添加延迟避免过载
await new Promise(resolve => setTimeout(resolve, 1000));
} catch (error) {
results.push({
index: i,
success: false,
error: error.message
});
}
}
return results;
}
完整示例
查看 examples/cardano/tx/submit.ts
文件获取完整的交易提交示例代码。
注意事项
- 确保交易已正确签名
- 检查网络参数(主网/测试网)
- 设置适当的超时时间
- 处理提交失败的情况
- 验证交易哈希确认提交成功
- 考虑网络拥堵时的重试机制