地址格式#
X Layer 是一个兼容 EVM 的区块链网络,支持两种地址格式:标准 EVM 地址格式和 XKO 前缀地址格式。
支持的地址格式#
标准 EVM 地址格式#
- 格式:
0x+ 40 位十六进制字符 - 示例:
0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625 - 特点:
- 符合 EIP-55 校验和标准(大小写混合)
- 与所有以太坊工具和钱包完全兼容
XKO 前缀地址格式#
- 格式:
XKO+ 40 位十六进制字符 - 示例:
XKO70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625 - 特点:
- X Layer 专有地址格式
- 前缀不区分大小写(XKO、xko、Xko 均有效)
- 保留 EIP-55 校验和大小写
- 便于识别 X Layer 生态地址
地址等价性#
同一账户可以用两种格式表示,均指向链上同一账户:
标准 EVM: 0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625
XKO 地址: XKO70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625
xko70586beeb7b7aa2e7966df9c8493c6cbfd75c625 ✓ 有效
Xko70586beeb7b7aa2e7966df9c8493c6cbfd75c625 ✓ 有效无效格式示例:
XKO0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625 ✗ 不能同时包含 XKO 和 0xXKO 前缀地址设计#
XKO 地址本质上是标准 EVM 地址的另一种表示形式:
- 地址核心:40 位十六进制字符(与 EVM 地址相同)
- 前缀替换:
XKO替代0x前缀 - 校验和保留:保持基于 Keccak-256 哈希的大小写校验和
- 链上存储:在链上以标准 20 字节地址形式存储
SDK 集成指南#
X Layer 提供多语言 SDK 用于地址格式转换,支持以下语言:
- JavaScript
- TypeScript
- Python
- Go
- Rust
- Java
核心 API#
所有 SDK 均提供两个核心函数:
| 函数 | 用途 | 输入 | 输出 |
|---|---|---|---|
toEvmAddress | 转换为标准 EVM 地址 | 0x... / XKO... / 裸地址 | 0x + 40 字符(EIP-55 校验和) |
fromEvmAddress | 转换为 XKO 地址 | 0x... / 裸地址 | XKO + 40 字符(保留校验和) |
部分 SDK 还提供工具函数:
| 函数 | 用途 | 可用语言 |
|---|---|---|
isXlayerAddress | 检查地址是否为 XKO 格式 | Java |
JavaScript SDK#
安装:
bash
npm install js-sha3
使用示例:
javascript
const { toEvmAddress, fromEvmAddress } = require('./multiAddress.js');
// XKO 转标准 EVM 地址
const evmAddr = toEvmAddress('XKO70586beeb7b7aa2e7966df9c8493c6cbfd75c625');
console.log(evmAddr);
// Output: 0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625
// 标准 EVM 转 XKO 地址
const xkoAddr = fromEvmAddress('0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625');
console.log(xkoAddr);
// Output: XKO70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625
// 支持多种输入格式
toEvmAddress('0x70586beeb7b7aa2e7966df9c8493c6cbfd75c625'); // ✓
toEvmAddress('70586beeb7b7aa2e7966df9c8493c6cbfd75c625'); // ✓
toEvmAddress('XKO70586beeb7b7aa2e7966df9c8493c6cbfd75c625'); // ✓
错误处理:
javascript
try {
toEvmAddress('invalid');
} catch (error) {
console.error(error.message);
// Output: Invalid address length: expected 40 hex chars, got 7
}
TypeScript SDK#
安装:
bash
npm install js-sha3
使用示例:
typescript
import { toEvmAddress, fromEvmAddress } from './multiAddress';
// 类型安全的地址转换
const evmAddr: string = toEvmAddress('XKO70586beeb7b7aa2e7966df9c8493c6cbfd75c625');
const xkoAddr: string = fromEvmAddress('0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625');
// 类型检查
toEvmAddress(123); // TypeScript 编译错误
Python SDK#
安装:
bash
pip install eth-utils
使用示例:
python
from multi_address import to_evm_address, from_evm_address
# XKO 转 EVM
evm_addr = to_evm_address('XKO70586beeb7b7aa2e7966df9c8493c6cbfd75c625')
print(evm_addr)
# Output: 0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625
# EVM 转 XKO
xko_addr = from_evm_address('0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625')
print(xko_addr)
# Output: XKO70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625
# 错误处理
try:
to_evm_address('invalid')
except ValueError as e:
print(e)
# Output: Invalid address length: expected 40 hex chars, got 7
Go SDK#
安装:
bash
go get golang.org/x/crypto/sha3
使用示例:
go
package main
import (
"fmt"
"log"
address "your-module/multi_address"
)
func main() {
// XKO 转 EVM
evmAddr, err := address.ToEvmAddress("XKO70586beeb7b7aa2e7966df9c8493c6cbfd75c625")
if err != nil {
log.Fatal(err)
}
fmt.Println(evmAddr)
// Output: 0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625
// EVM 转 XKO
xkoAddr, err := address.FromEvmAddress("0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625")
if err != nil {
log.Fatal(err)
}
fmt.Println(xkoAddr)
// Output: XKO70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625
}
Rust SDK#
添加依赖(Cargo.toml):
toml
[dependencies]
multi_address = { path = "path/to/address/rust" }
使用示例:
rust
use multi_address::{to_evm_address, from_evm_address};
fn main() {
// XKO 转 EVM
match to_evm_address("XKO70586beeb7b7aa2e7966df9c8493c6cbfd75c625") {
Ok(evm_addr) => println!("{}", evm_addr),
// Output: 0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625
Err(e) => eprintln!("Error: {}", e),
}
// EVM 转 XKO
match from_evm_address("0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625") {
Ok(xko_addr) => println!("{}", xko_addr),
// Output: XKO70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625
Err(e) => eprintln!("Error: {}", e),
}
}
Java SDK#
Maven 依赖:
xml
<dependency>
<groupId>com.okcoin</groupId>
<artifactId>xlayer-sdk</artifactId>
<version>0.2.1</version>
</dependency>
使用示例:
java
import com.okcoin.MultiAddress;
public class Example {
public static void main(String[] args) {
// XKO 转 EVM
String evmAddr = MultiAddress.toEvmAddress("XKO70586beeb7b7aa2e7966df9c8493c6cbfd75c625");
System.out.println(evmAddr);
// Output: 0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625
// EVM 转 XKO
String xkoAddr = MultiAddress.fromEvmAddress("0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625");
System.out.println(xkoAddr);
// Output: XKO70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625
// 检查是否为 XKO 地址
boolean isXko = MultiAddress.isXlayerAddress("XKO70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625");
System.out.println(isXko); // true
boolean isNotXko = MultiAddress.isXlayerAddress("0x70586BeEB7b7Aa2e7966DF9c8493C6CbFd75C625");
System.out.println(isNotXko); // false
// 错误处理
try {
MultiAddress.toEvmAddress("invalid");
} catch (IllegalArgumentException e) {
System.err.println(e.getMessage());
// Output: Invalid address length: expected 40 hex chars, got 7
}
}
}
安全注意事项#
重要:XKO 地址仅用于链下交互(UI 展示等)。
在交易 RLP 编码中:
- ❌ 不能使用 XKO 格式地址
- ✅ 必须使用标准 20 字节地址格式
- 链会自动拒绝包含 XKO 格式地址的交易
SDK 会自动处理此转换,但如果手动构造交易,请使用标准格式。
常见问题(FAQ)#
Q1:XKO 地址和 EVM 地址有什么区别?#
A:两者在链上完全等价,仅前缀不同。XKO 地址使用 XKO 前缀,EVM 地址使用 0x 前缀。
Q2:可以在交易中直接使用 XKO 地址吗?#
A:不可以。在构造 RLP 编码的交易时,必须使用标准 20 字节地址。XKO 格式仅用于链下交互(RPC 查询、UI 展示)。
Q3:大小写重要吗?#
A:XKO 前缀不区分大小写(XKO、xko、Xko 均有效)。但地址主体保留了 EIP-55 校验和大小写,用于错误检测。
Q4:如何验证地址格式?#
A:使用 SDK 转换函数。如果地址格式无效,函数将抛出异常。
资源#
- GitHub 仓库:xlayer-sdk
许可证#
本 SDK 基于 MIT 许可证发布。
支持#
如有问题:
- GitHub Issues:提交 issue
