如何查询Hedera中TransferTransaction创建的懒加载账户对应有序账户ID?
如何获取Hedera懒加载创建的EVM地址对应账户ID并保证映射顺序?
已完成以下步骤:
- 本地生成多个无Hedera对应账户的EVM地址(
evmAddress*) - 通过
TransferTransaction从已有账户(operatorId)向这些EVM地址转账,代码示例:
const tinyBarsPerHbar = 100_000_000; const multiTransferTx = new TransferTransaction() .addHbarTransfer(operatorId, -30 * tinyBarsPerHbar) .addHbarTransfer(evmAddress1, 10 * tinyBarsPerHbar) .addHbarTransfer(evmAddress2, 10 * tinyBarsPerHbar) .addHbarTransfer(evmAddress3, 10 * tinyBarsPerHbar) .freezeWith(client) .sign(operatorKey); const transferTxResponse = await multiTransferTx.execute(client);
- 转账交易执行后,这些EVM地址在Hedera中被懒加载创建关联账户
现需实现步骤4:生成EVM地址与对应账户ID的映射,且保证映射顺序与转账时的EVM地址顺序完全一致。
可靠实现方案
核心思路是利用转账交易的完整交易记录,结合预先保存的转账EVM地址顺序,逐个匹配生成映射,确保顺序完全对应。
代码实现
// 1. 获取交易收据(确保交易已确认),再获取完整交易记录 const transferTxReceipt = await transferTxResponse.getReceipt(client); const transferTxRecord = await transferTxResponse.getRecord(client); // 2. 提前保存转账时使用的EVM地址列表,顺序必须和addHbarTransfer时完全一致 const targetEvmAddresses = [evmAddress1, evmAddress2, evmAddress3]; // 3. 生成顺序正确的映射对象 const evmToAccountIdMap = {}; targetEvmAddresses.forEach(evmAddr => { // 在交易记录的转账列表中匹配对应EVM地址的账户 const transferEntry = transferTxRecord.transferList.find(entry => { // 统一转小写避免大小写匹配问题 return entry.accountId.toEvmAddress() === evmAddr.toLowerCase(); }); if (transferEntry) { // 若需要AccountId对象而非字符串,直接存transferEntry.accountId即可 evmToAccountIdMap[evmAddr] = transferEntry.accountId.toString(); } }); // 最终输出符合要求的映射 console.log(evmToAccountIdMap);
方案说明
- 交易记录(
transferTxRecord)包含了所有转账对象的详细信息,其中每个transferEntry的accountId就是懒加载生成的账户ID - 通过预先保存的
targetEvmAddresses遍历,严格按照转账时的顺序匹配,彻底避免顺序混乱问题 - 利用
accountId.toEvmAddress()转换后对比,确保EVM地址与账户ID的对应关系准确无误
内容的提问来源于stack exchange,提问作者bguiz
相关产品推荐
相关产品推荐

