我已完成以下步骤 1 到 3,并弄清楚如何完成步骤 4。
(1) 在本地生成几个EVM地址(
evmAddress*
),这些EVM地址在Hedera网络上还没有账户。
(2) 创建一个
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);
(3) 当
multiTransferTx
完成时,EVM 地址现在在 Hedera 网络上延迟创建帐户并与之关联
(4) 现在需要找出每个 EVM 地址映射到的帐户 ID,即生成如下内容:
{
evmAddress1: accountId1,
evmAddress2: accountId2,
evmAddress3: accountId3,
}
第4步如何完成?
注意:
我在下面进行了自我回答,但有一个警告,不幸的是,这使它成为一个不够好的解决方案。希望收到另一个不受此警告约束的答案,其中保证顺序/映射。
可以使用以下代码完成第 4 步,但需要注意如下所述
// obtain `transferTxId` from `multiTransferTx`
// convert transaction ID to a Mirror Node API URL
const [idPart1, idPart2] = transferTxId.split('@');
const transferTxIdMnFormat = `${idPart1}-${idPart2.replace('.', '-')}`;
const transferTxMnResponse = await fetch(`https://testnet.mirrornode.hedera.com/api/v1/transactions/${transferTxIdMnFormat}?nonce=0`);
const transferTxMnResult = await transferTxMnResponse.json();
// parse
const transfers = transferTxMnResult.transactions[0].transfers;
这会产生与此类似的输出:
[
{ account: '0.0.5', amount: 4547, is_approval: false },
{ account: '0.0.98', amount: 96793, is_approval: false },
{ account: '0.0.800', amount: 10754, is_approval: false },
{ account: '0.0.1521', amount: -2000112094, is_approval: false },
{ account: '0.0.1529253', amount: 1000000000, is_approval: false },
{ account: '0.0.1529255', amount: 1000000000, is_approval: false },
{ account: '0.0.1530238', amount: 1000000000, is_approval: false }
]
随后,通过
amount === 1000000000
过滤此列表,得到我想要的帐户 ID。
警告:
上述方法有效,但是,它没有说明哪些帐户 ID 映射到哪些 EVM 地址。 我们可以假设这些账户ID出现的顺序 与创建
addHbarTransfer
时调用multiTransferTx
的顺序相同。
手动测试似乎证实了这一点 - 顺序确实匹配。
然而,这没有记录在案的行为,因此不能得到保证。
我们甚至不知道顺序是否是确定性的。