Kaia 以太坊兼容性解析:交易类型与 RLP 编码详解

·

Kaia 通过封装的交易类型实现与以太坊的兼容性。除引入名为 EthereumTxTypeEnvelope 的单字节类型分隔符外,Kaia 中的以太坊交易类型在属性与 RLP 编码方案上与以太坊保持一致。这意味着开发者可直接使用以太坊工具生成交易,并在 Kaia 网络上成功部署。

当使用 eth 命名空间 API 时,类型分隔符会被自动忽略,用户体验与以太坊高度一致。而通过 kaia 命名空间 API,用户既能部署和检索以太坊格式的交易,又能避免与 Kaia 原生交易类型混淆。

EthereumTxTypeEnvelope:兼容性关键设计

EthereumTxTypeEnvelope 是一个单字节前缀,用于标识以太坊交易类型。由于以太坊采用的 EIP-2718 交易类型编号系统与 Kaia 存在冲突,Kaia 引入此分隔符以实现未来以太坊交易类型的独立扩展。

需注意:

关键标识:

TxTypeEthereumAccessList:支持 EIP-2930

TxTypeEthereumAccessList 对应以太坊 EIP-2930 标准,包含访问列表(地址和存储密钥的集合)。该类型专为兼容性设计,仅适用于使用 AccountKeyLegacy 的外部账户(EOA)。其他账户类型应使用 Kaia 原生交易类型(如 TxTypeValueTransfer)。

注意:此类型自 EthTxTypeCompatibleBlock 区块高度起可用。但与以太坊不同,使用访问列表不会降低交易费用

核心属性

属性类型说明
typeuint8 (Go)固定为 0x7801(由 EthereumTxTypeEnvelopeEthereumTransactionType 连接而成)
chainId*big.Int (Go)目标链 ID
nonceuint64 (Go)交易唯一标识符
gasPrice*big.Int (Go)Gas 单价,费用计算为 gas * gasPrice
gasuint64 (Go)交易允许消耗的最大 Gas 量
to*common.Address (Go)接收方地址
value*big.Int (Go)转账金额(以 kei 为单位)
data[]byte (Go)附加数据,用于合约部署或调用
accessListtype.AccessList (Go)访问列表,结构为 [](common.Address, []common.Hash)
v, r, s*big.Int (Go)交易签名数据

RLP 编码规范

签名哈希计算

SigRLP = EthereumTransactionType || encode([chainId, nonce, gasPrice, gas, to, value, data, accessList])
SigHash = keccak256(SigRLP)
Signature = sign(SigHash, privateKey)

SenderTxHash 计算

SenderTxHashRLP = EthereumTransactionType || encode([chainId, nonce, gasPrice, gas, to, value, data, accessList, v, r, s])
SenderTxHash = keccak256(SenderTxHashRLP)

交易哈希计算

TxHashRLP = EthereumTransactionType || encode([chainId, nonce, gasPrice, gas, to, value, data, accessList, v, r, s])
TxHash = keccak256(TxHashRLP)

原始交易编码

RawTx = EthereumTxTypeEnvelope || EthereumTransactionType || encode([chainId, nonce, gasPrice, gas, to, value, data, accessList, v, r, s])

示例与 RPC 输出

RLP 编码示例

RPC 返回示例

TxTypeEthereumDynamicFee:支持 EIP-1559

TxTypeEthereumDynamicFee 对应以太坊 EIP-1559 标准,使用 gasTipCapgasFeeCap 替代 gasPrice。同样,该类型仅适用于 AccountKeyLegacy 账户。

注意:Kaia 网络采用固定 Gas 价格,因此 gasTipCapgasFeeCap 应设置为当前网络 Gas 价格(撰写时为 250 Gkei)。访问列表同样不带来费用优惠。

核心属性

属性类型说明
typeuint8 (Go)固定为 0x7802
chainId*big.Int (Go)目标链 ID
nonceuint64 (Go)交易唯一标识符
gasTipCap*big.Int (Go)优先费参数,需设置为网络 Gas 价格
gasFeeCap*big.Int (Go)费用上限参数,需设置为网络 Gas 价格
gasuint64 (Go)交易允许消耗的最大 Gas 量
to*common.Address (Go)接收方地址
value*big.Int (Go)转账金额(以 kei 为单位)
data[]byte (Go)附加数据
accessListtype.AccessList (Go)访问列表
v, r, s*big.Int (Go)交易签名数据

RLP 编码规范

签名哈希计算

SigRLP = EthereumTransactionType || encode([chainId, nonce, gasTipCap, gasFeeCap, gas, to, value, data, accessList])
SigHash = keccak256(SigRLP)
Signature = sign(SigHash, privateKey)

SenderTxHash 计算

SenderTxHashRLP = EthereumTransactionType || encode([chainId, nonce, gasTipCap, gasFeeCap, gas, to, value, data, accessList, v, r, s])
SenderTxHash = keccak256(SenderTxHashRLP)

交易哈希计算

TxHashRLP = EthereumTransactionType || encode([chainId, nonce, gasTipCap, gasFeeCap, gas, to, value, data, accessList, v, r, s])
TxHash = keccak256(TxHashRLP)

原始交易编码

RawTx = EthereumTxTypeEnvelope || EthereumTransactionType || encode([chainId, nonce, gasTipCap, gasFeeCap, gas, to, value, data, accessList, v, r, s])

示例与 RPC 输出

RLP 编码示例

RPC 返回示例

常见问题

问:Kaia 为何需要 EthereumTxTypeEnvelope?
答:因为以太坊与 Kaia 使用不同的交易类型编号系统,直接兼容会导致冲突。EthereumTxTypeEnvelope 作为前缀分隔符,使两套系统能够共存且互不干扰。

问:在 Kaia 上使用以太坊交易类型有何优势?
答:开发者可直接复用为以太坊开发的工具链(如 Hardhat、Truffle),无需修改代码即可部署交易,大幅降低迁移和开发成本。👉 查看实时兼容性工具

问:AccessList 在 Kaia 上是否能降低 Gas 费用?
答:不能。Kaia 目前固定 Gas 价格机制,访问列表仅用于格式兼容,不会实际影响费用计算。费用优化需通过其他机制实现。

问:如何处理动态费用交易中的 gasTipCap 和 gasFeeCap?
答:Kaia 采用固定 Gas 价格,建议将这两项参数设置为当前网络 Gas 价格(如 250 Gkei)。设置其他值可能导致交易失败。

问:Kaia 和以太坊的 RPC 返回数据有何主要区别?
答:Kaia 的 kaia 命名空间 API 返回数据包含 typeIntsenderTxHash 等扩展字段,而 eth 命名空间 API 返回数据与以太坊完全一致,确保兼容性。

问:是否所有账户类型都支持以太坊交易格式?
答:否。仅支持使用 AccountKeyLegacy 的外部账户(EOA)。其他账户类型需使用 Kaia 原生交易类型以实现完整功能。