如何将 Hedera 本机地址转换为非长零 EVM 地址?

bgu*_*uiz 5 javascript solidity hedera-hashgraph

使用 Hedera SDK JS,我可以将帐户 ID 转换为“长零”格式的 EVM 地址。例如0.0.3996280-->0x00000000000000000000000000000000003cfa78

(参见相关问题:“如何将 Hedera 本机地址转换为 EVM 地址?”。)

如何转换为“非长零”格式 EVM 地址?例如0.0.3996280-->0x7394111093687e9710b7a7aeba3ba0f417c54474

(参见0.0.3996280Hashscan。)

我需要这个,因为当您ContractCallQuery通过 Hedera SDK 发送时,在调用的任何智能合约函数中可见的值msg.sender是“非长零”格式的 EVM 地址。

我目前在做什么:

const operatorId = AccountId.fromString(process.env.OPERATOR_ID);
const operatorEvmAddress = operatorId.toSolidityAddress();
Run Code Online (Sandbox Code Playgroud)

但是,operatorEvmAddress它采用“长零”格式,因此我无法在后续的智能合约交互中使用它。

小智 6

答案取决于您是否有权访问该帐户的公钥。\n请注意,如果您有私钥,则可以从中提取公钥。\n\xe2\x80\x8b\n如果您没有访问帐户的公钥:\n\xe2\x80\x8b\n您可以使用 SDK 获取长零 EVM 地址,\n这是一个数学转换。\n\xe2\x80\x8b\n但是,您无法单独使用 SDK 获取非长零 EVM 地址,\n这不是数学转换。\n您需要查询网络状态,\n例如通过 Hedera 镜像节点查询。\n\xe2 \x80\x8b\n如果您确实有权访问帐户的公钥:\n\xe2\x80\x8b\n您可以使用以下命令获取长零 EVM 地址\n非长零 EVM 地址SDK。\n\xe2\x80\x8b

\n
const operatorId = AccountId.fromString(process.env.OPERATOR_ID);\nconst operatorPrivateKey = PrivateKey.fromString(process.env.OPERATOR_KEY);\nconst operatorPublicKey = operatorPrivateKey.publicKey;\n\xe2\x80\x8b\n// AccountId.toSolidityAddress --> long-zero\nconst operatorEvmAddressLongZero = operatorId.toSolidityAddress();\n\xe2\x80\x8b\n// PublicKey.toEvmAddress --> non-long-zero\nconst operatorEvmAddressNonLongZero = operatorPublicKey.toEvmAddress();\n
Run Code Online (Sandbox Code Playgroud)\n