Hedera原生地址与EVM地址互转方法及转账场景咨询
Hedera原生地址与EVM地址互转实现方法
一、原生地址(shard.realm.account)转EVM地址
转换逻辑:
- 将原生地址拆分为shard、realm、account三个数值部分
- 分别将三个部分转为十六进制字符串,按规则补零:shard补至8位、realm补至8位、account补至24位
- 拼接三个十六进制字符串并添加
0x前缀,得到标准EVM地址
手动实现代码(JavaScript)
function hederaNativeToEvm(nativeAddress) { const [shard, realm, account] = nativeAddress.split('.').map(Number); const shardHex = shard.toString(16).padStart(8, '0'); const realmHex = realm.toString(16).padStart(8, '0'); const accountHex = account.toString(16).padStart(24, '0'); return `0x${shardHex}${realmHex}${accountHex}`; } // 测试:0.0.12345 → 0x00000000000000000000000000003039 console.log(hederaNativeToEvm('0.0.12345'));
Hedera SDK简化实现(JavaScript)
import { AccountId } from '@hashgraph/sdk'; function nativeToEvmWithSdk(nativeAddress) { const accountId = AccountId.fromString(nativeAddress); return accountId.toSolidityAddress(); } // 测试 console.log(nativeToEvmWithSdk('0.0.12345'));
二、EVM地址转原生地址(shard.realm.account)
转换逻辑:
- 移除EVM地址的
0x前缀 - 将十六进制字符串拆分为三部分:前8位对应shard、中间8位对应realm、最后24位对应account
- 每部分转为十进制整数,用
.拼接得到原生地址格式
手动实现代码(JavaScript)
function evmToHederaNative(evmAddress) { const hex = evmAddress.replace('0x', ''); const shardHex = hex.slice(0, 8); const realmHex = hex.slice(8, 16); const accountHex = hex.slice(16, 40); const shard = parseInt(shardHex, 16); const realm = parseInt(realmHex, 16); const account = parseInt(accountHex, 16); return `${shard}.${realm}.${account}`; } // 测试:0x00000000000000000000000000003039 → 0.0.12345 console.log(evmToHederaNative('0x00000000000000000000000000003039'));
Hedera SDK简化实现(JavaScript)
import { AccountId } from '@hashgraph/sdk'; function evmToNativeWithSdk(evmAddress) { const accountId = AccountId.fromSolidityAddress(evmAddress); return accountId.toString(); } // 测试 console.log(evmToNativeWithSdk('0x00000000000000000000000000003039'));
注意事项
- 转换前需校验地址格式有效性:原生地址需为
数字.数字.数字格式,EVM地址需为带0x前缀的42位十六进制字符串 - 生产环境推荐使用Hedera SDK实现,可避免手动处理字节序、补零环节的潜在错误
内容的提问来源于stack exchange,提问作者Ryan Arndt
相关产品推荐
相关产品推荐

