Kaia 通过封装的交易类型实现与以太坊的兼容性。除引入名为 EthereumTxTypeEnvelope 的单字节类型分隔符外,Kaia 中的以太坊交易类型在属性与 RLP 编码方案上与以太坊保持一致。这意味着开发者可直接使用以太坊工具生成交易,并在 Kaia 网络上成功部署。
当使用 eth 命名空间 API 时,类型分隔符会被自动忽略,用户体验与以太坊高度一致。而通过 kaia 命名空间 API,用户既能部署和检索以太坊格式的交易,又能避免与 Kaia 原生交易类型混淆。
EthereumTxTypeEnvelope:兼容性关键设计
EthereumTxTypeEnvelope 是一个单字节前缀,用于标识以太坊交易类型。由于以太坊采用的 EIP-2718 交易类型编号系统与 Kaia 存在冲突,Kaia 引入此分隔符以实现未来以太坊交易类型的独立扩展。
需注意:
EthereumTxTypeEnvelope仅用于原始交易和类型编号,不参与交易哈希或签名哈希计算。- 交易哈希与签名哈希仍遵循以太坊 EIP 标准中定义的
EthereumTransactionType。
关键标识:
EthereumTxTypeEnvelope:0x78TxHashRLP:EthereumTransactionType || TransactionPayloadRawTransaction:EthereumTxTypeEnvelope || EthereumTransactionType || TransactionPayload
TxTypeEthereumAccessList:支持 EIP-2930
TxTypeEthereumAccessList 对应以太坊 EIP-2930 标准,包含访问列表(地址和存储密钥的集合)。该类型专为兼容性设计,仅适用于使用 AccountKeyLegacy 的外部账户(EOA)。其他账户类型应使用 Kaia 原生交易类型(如 TxTypeValueTransfer)。
注意:此类型自 EthTxTypeCompatibleBlock 区块高度起可用。但与以太坊不同,使用访问列表不会降低交易费用。核心属性
| 属性 | 类型 | 说明 |
|---|---|---|
| type | uint8 (Go) | 固定为 0x7801(由 EthereumTxTypeEnvelope 和 EthereumTransactionType 连接而成) |
| chainId | *big.Int (Go) | 目标链 ID |
| nonce | uint64 (Go) | 交易唯一标识符 |
| gasPrice | *big.Int (Go) | Gas 单价,费用计算为 gas * gasPrice |
| gas | uint64 (Go) | 交易允许消耗的最大 Gas 量 |
| to | *common.Address (Go) | 接收方地址 |
| value | *big.Int (Go) | 转账金额(以 kei 为单位) |
| data | []byte (Go) | 附加数据,用于合约部署或调用 |
| accessList | type.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 编码示例:
- 交易哈希:
3a3ab67168de40b1f8a2141a70a4e2f551f90d7814b2fbcb3ac99ad8d8d0b641 - 编码数据:
7801f8a1028204d219830f4240947b65b75d204abed71587c9e519a89277766ee1d00a8431323334f838f7940000000000000000000000000000000000000001e1a0000000000000000000000000000000000000000000000000000000000000000001a0bfc80a874c43b71b67c68fa5927d1443407f31aef4ec6369bbecdb76fc39b0c0a0193e62c1dd63905aee7073958675dcb45d78c716a9a286b54a496e82cb762f26
RPC 返回示例:
eth_getTransactionByHash返回包含type: "0x1"和accessList字段的以太坊标准格式。kaia_getTransactionByHash返回包含type: "TxTypeEthereumAccessList"和typeInt: 30721的 Kaia 扩展格式。
TxTypeEthereumDynamicFee:支持 EIP-1559
TxTypeEthereumDynamicFee 对应以太坊 EIP-1559 标准,使用 gasTipCap 和 gasFeeCap 替代 gasPrice。同样,该类型仅适用于 AccountKeyLegacy 账户。
注意:Kaia 网络采用固定 Gas 价格,因此gasTipCap和gasFeeCap应设置为当前网络 Gas 价格(撰写时为 250 Gkei)。访问列表同样不带来费用优惠。
核心属性
| 属性 | 类型 | 说明 |
|---|---|---|
| type | uint8 (Go) | 固定为 0x7802 |
| chainId | *big.Int (Go) | 目标链 ID |
| nonce | uint64 (Go) | 交易唯一标识符 |
| gasTipCap | *big.Int (Go) | 优先费参数,需设置为网络 Gas 价格 |
| gasFeeCap | *big.Int (Go) | 费用上限参数,需设置为网络 Gas 价格 |
| gas | uint64 (Go) | 交易允许消耗的最大 Gas 量 |
| to | *common.Address (Go) | 接收方地址 |
| value | *big.Int (Go) | 转账金额(以 kei 为单位) |
| data | []byte (Go) | 附加数据 |
| accessList | type.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 编码示例:
- 交易哈希:
be74e122acf00c2f257e8698ecf01140b58b2880de3f24d0875730425eccb45a - 编码数据:
7802f8a1028204d21919830f4240947b65b75d204abed71587c9e519a89277766ee1d00a8431323334f838f7940000000000000000000000000000000000000001e1a0000000000000000000000000000000000000000000000000000000000000000080a0ca14aa0bada2da7ca1b143c16e2dd4a69f2a1e77ce54c7f6d440fe828a777f4f9f117f0f78aed398b2995b5ee7c67ace25d52be3c72c1384c2aaa9683b351556
RPC 返回示例:
eth_getTransactionByHash返回包含type: "0x2"、maxFeePerGas和maxPriorityFeePerGas的以太坊标准格式。kaia_getTransactionByHash返回包含type: "TxTypeEthereumDynamicFee"和typeInt: 30722的 Kaia 扩展格式。
常见问题
问:Kaia 为何需要 EthereumTxTypeEnvelope?
答:因为以太坊与 Kaia 使用不同的交易类型编号系统,直接兼容会导致冲突。EthereumTxTypeEnvelope 作为前缀分隔符,使两套系统能够共存且互不干扰。
问:在 Kaia 上使用以太坊交易类型有何优势?
答:开发者可直接复用为以太坊开发的工具链(如 Hardhat、Truffle),无需修改代码即可部署交易,大幅降低迁移和开发成本。👉 查看实时兼容性工具
问:AccessList 在 Kaia 上是否能降低 Gas 费用?
答:不能。Kaia 目前固定 Gas 价格机制,访问列表仅用于格式兼容,不会实际影响费用计算。费用优化需通过其他机制实现。
问:如何处理动态费用交易中的 gasTipCap 和 gasFeeCap?
答:Kaia 采用固定 Gas 价格,建议将这两项参数设置为当前网络 Gas 价格(如 250 Gkei)。设置其他值可能导致交易失败。
问:Kaia 和以太坊的 RPC 返回数据有何主要区别?
答:Kaia 的 kaia 命名空间 API 返回数据包含 typeInt 和 senderTxHash 等扩展字段,而 eth 命名空间 API 返回数据与以太坊完全一致,确保兼容性。
问:是否所有账户类型都支持以太坊交易格式?
答:否。仅支持使用 AccountKeyLegacy 的外部账户(EOA)。其他账户类型需使用 Kaia 原生交易类型以实现完整功能。