Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-7591: BLS 签名交易

引入一种使用 BLS 签名的新交易类型

Authors Marius van der Wijden (@MariusVanDerWijden)
Created 2024-01-10
Discussion Link https://ethereum-magicians.org/t/eip-7591-bls-signed-transactions/19911

摘要

本 EIP 引入了一种新的 EIP-2718 交易类型,该类型使用 BLS 签名进行签名。

动机

BLS 签名方案允许轻松聚合和验证聚合签名。 如果主网上大量的交易是 BLS 签名交易,我们可以聚合区块中的签名并对其进行批量验证。 这将减少链历史的增长。

规范

BLS_TX_TYPE = Bytes1(0x04)

交易类型

交易类型将具有以下格式:

[chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value, data, access_list, sender, signature]

其中 sender 是账户的 BLS 公钥,地址为 address = [0:20](keccak256(sender))

签名值 signature 通过构造以下摘要的 BLS 签名来计算:

tx_hash = keccak256(BLS_TX_TYPE || rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value, data, access_list, sender]))

头部更改

区块头将被修改为包含 aggregated_sig 字段,其中包含区块中所有 BLS 交易的聚合签名。

因此,生成的头部 RLP 编码为:

rlp([
    parent_hash,
    0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347, # ommers 哈希
    coinbase,
    state_root,
    txs_root,
    receipts_root,
    logs_bloom,
    0, # 难度
    number,
    gas_limit,
    gas_used,
    timestamp,
    extradata,
    prev_randao,
    0x0000000000000000, # nonce
    base_fee_per_gas,
    withdrawals_root,
    blob_gas_used,
    excess_blob_gas,
    aggregated_sig,
])

区块更改

需要更改区块构建算法,以便构建区块中所有 BLS 签名交易的聚合签名。 区块中的所有交易都将被添加,而无需设置签名字段。

包含 signature 字段的交易的区块必须被拒绝。

在区块验证时,verifyAggregate 算法的使用方式如下:

valid = verifyAggregate(sender_1, ... sender_n, tx_hash_1, ... tx_hash_n, aggregated_sig)

理由

从交易中删除 ECDSA 签名可以节省 65 个字节. BLS 公钥为 48 个字节,聚合签名 为 96 个字节。 因此,我们每个区块可以节省 -96 + (65-48)* #transactions 字节。 假设每天大约有 7000 个区块,每天有 1,000,000 个交易,则平均每个区块包含大约 150 个交易。

因此,我们每个区块可以节省 2454 字节或 2.4KB。 假设平均区块大小为 160KB,这相当于节省约 1.5%。

除了为完整节点节省(诚然很少的)大小之外,添加一种新的交易类型来利用不同的签名方案,这本身也具有一定的价值。 本提案表明,有可能向以太坊添加例如量子安全签名方案。

向后兼容性

此 EIP 向执行层的区块验证规则集引入了向后不兼容的更改,并引入了一种新的交易类型和一个新的头部字段。 因此,需要进行硬分叉。

安全考虑

通过 BLS 签名的消息是不同的(txhash 上没有哈希冲突),因此即使没有所有权证明,聚合也是安全的。 公钥不相同,这在 BLS 中不是问题。

我们假设 keccak256 和 ECDSA 以及 BLS 按预期工作。 假设我们有两个地址 address_1 = keccak256(pk_ecdsa)address_2 = keccak(pk_bls),其中 address_1 == address_2。 我们知道 pk_ecdsa 必须等于 pk_bls(从 keccak 得出)。 这意味着我们要么能够找到 x,对于给定的 y,使得 g_bls^x = y(违反了 BLS 的安全性) 要么找到 z,使得 d_ecdsa^z = y(违反了 ECDSA 的安全性)。

因此,找到两个私钥(一个在 ECDSA 中,一个在 BLS 中)来控制同一个帐户是不可能的(概率大于可忽略不计)。

版权

版权及相关权利通过 CC0 放弃。

Citation

Please cite this document as:

Marius van der Wijden (@MariusVanDerWijden), "EIP-7591: BLS 签名交易 [DRAFT]," Ethereum Improvement Proposals, no. 7591, January 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7591.