地址格式#

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 和 0x

XKO 前缀地址设计#

XKO 地址本质上是标准 EVM 地址的另一种表示形式:

  1. 地址核心:40 位十六进制字符(与 EVM 地址相同)
  2. 前缀替换XKO 替代 0x 前缀
  3. 校验和保留:保持基于 Keccak-256 哈希的大小写校验和
  4. 链上存储:在链上以标准 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 转换函数。如果地址格式无效,函数将抛出异常。


资源#

许可证#

本 SDK 基于 MIT 许可证发布。

支持#

如有问题: