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

cnwbcb6i  于 2023-08-02  发布在  Java
关注(0)|答案(2)|浏览(101)

使用Hedera SDK JS,我可以将Account ID转换为“long-zero”格式的EVM地址。例如0.0.3996280--> 0x00000000000000000000000000000000003cfa78
(See相关问题:"How to convert a Hedera native address into an EVM address?" .)
如何转换为“非长零”格式的EVM地址?例如0.0.3996280--> 0x7394111093687e9710b7a7aeba3ba0f417c54474
(See 0.0.3996280 on Hashscan .)
我需要这个,因为当您通过Hedera SDK发送ContractCallQuery时,在调用的任何智能合约函数中可见的msg.sender的值是“非长零”格式的EVM地址。
我目前正在做的事情:

const operatorId = AccountId.fromString(process.env.OPERATOR_ID);
const operatorEvmAddress = operatorId.toSolidityAddress();

字符串
然而,operatorEvmAddress是“长零”格式,因此我不能在后续的智能合约交互中使用它。

t9aqgxwy

t9aqgxwy1#

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

const operatorId = AccountId.fromString(process.env.OPERATOR_ID);
const operatorPrivateKey = PrivateKey.fromString(process.env.OPERATOR_KEY);
const operatorPublicKey = operatorPrivateKey.publicKey;
​
// AccountId.toSolidityAddress --> long-zero
const operatorEvmAddressLongZero = operatorId.toSolidityAddress();
​
// PublicKey.toEvmAddress --> non-long-zero
const operatorEvmAddressNonLongZero = operatorPublicKey.toEvmAddress();

字符串

osh3o9ms

osh3o9ms2#

正如在Ashe's answer中提到的,并在大卫的评论中要求:
如果您无法访问帐户的公钥...您需要查询网络状态,例如通过Hedera镜像节点查询。
这里有一种方法,通过镜像节点:

curl \
  --silent \
  -X 'GET' \
  -H 'accept: application/json' \
  'https://testnet.mirrornode.hedera.com/api/v1/accounts/0.0.3996280?limit=1' \
  | jq --raw-output ".evm_address"

字符串
这将输出:

0x7394111093687e9710b7a7aeba3ba0f417c54474


其实际上是对应于该帐户的非长零EVM地址。
参考:上述API的镜像节点Swagger:https://testnet.mirrornode.hedera.com/api/v1/docs/#/accounts/getAccountByIdOrAliasOrEvmAddress

相关问题