该提案旨在通过将网络标识符纳入交易签名的组成部分,缓解不同区块链上的交易重放问题。引入此网络标识符将限制重放攻击,保证每个交易仅在其对应的网络上有效,从而增强Lisk平台的安全性与可信度。实施该变更将会导致向后兼容性问题,因为新的交易签名方式将在旧版本节点上被拒绝。
本 LIP 提出了通过引入网络标识符作为交易签名的组成部分来减轻不同链上的交易重放。
本 LIP 依据 创意公用零 1.0 通用许可证 授权。
目前,包含在 Lisk 平台区块链中的交易 可以在其他链上重放。例如,在 Testnet 上发送的交易可以在 Mainnet 上重放,这个问题可能会因引入侧链而加剧。当前的缓解方法包括 (1) 不鼓励在不同区块链之间重用私钥,和 (2) 在不适用 (1) 的情况下,鼓励在不同区块链上注册不同的备份私钥。然而,Lisk 平台一个显著的优势是能够在多个区块链上重用私钥,包括主链和侧链,这与此策略相冲突。
本 LIP 提议在交易签名中包括网络标识符作为组成部分。这个网络标识符将是区块链的 nethash 和一个社区标识符的连接的哈希值。组合这两个组成部分旨在是唯一的,诚实的参与者应遵循这一要求。
该提案可避免从任何现有区块链到 Lisk Mainnet 或 Testnet(以及它们之间)的交易重放攻击。在签名函数中添加网络标识符将使得签名仅对特定网络有效。
此外,在实现了侧链的生态系统中,每个侧链将具有唯一的网络标识符,以减少不同链之间的交易重放。然而,在这种情况下情况会更复杂,因为恶意的侧链开发者可能会复制来自 Mainnet 或其他侧链的唯一标识符,并尝试在其自己的侧链上重放一个交易到那个原始链上。调用签名函数的侧链用户应检查交易对象中将被确切签名的内容,包括网络标识符。请注意,用于生成该函数输入的序列化对象的属性问题与网络上传输或存储的有关信息的问题是不同的,在后者中,由于效率/可扩展性原因可能会省略该标识符。
通过为整个 Lisk 生态系统定义一个通用且明确的签名过程,我们可以(强烈)建议侧链使用 Lisk Elements 中实现的函数(或至少符合该规范的函数),从而消除侧链开发者提供恶意签名函数的机会。用户(或第三方客户端)在签名交易对象时,可以直接使用 Lisk Elements(或等效第三方工具),如果侧链协议不允许这样做,用户的怀疑应被提高。
正如前面一节中介绍的,网络标识符将按以下方式构建:
网络标识符 = H(nethash + 社区标识符)
其中:
H()
- 加密哈希函数 SHA-256。
nethash
- 包含相关区块链创世区块的 SHA-256 哈希值的十六进制表示的 UTF-8 编码字符串。对于 Lisk Mainnet 和 Testnet,nethash
值保存在 源代码 中。在侧链的 nethash 情况下,我们假设 Lisk Elements 将提供一个标准的 nethash 计算函数。这样,侧链用户可以自行生成此值并验证侧链网络标识符是否正确。
社区标识符
- 作为 UTF-8 格式编码的字符串表示的相关社区名称。该标识符唯一地指定支持相关网络的社区。与 Lisk 基金会及其支持者相关的 社区标识符 将是 Lisk
。如果社区的一个子集决定分裂网络,他们可以选择例如 LiskCash
作为他们的社区标识符。一般来说,社区标识符字段应在 Lisk 生态系统中有良好的文档和定义(例如,在 SLIP-0044 中)涵盖其中的每个链。
请注意,上述公式中的加号符号 “+” 代表字符串连接运算符。在附录 B 中,可以找到构建网络标识符的简单示例。
为了实现提议的更改,网络标识符必须在交易签名过程输入的字节数组的首位置中包含(注意,用于生成交易 ID 的字节数组保持不变)。这将根据当前实现影响以下函数:
getBytes 函数。
下面有两个示例,展示了 Testnet 和 Mainnet 在网络的各种硬分叉节点上生成网络标识符的方式。
TG0 = Testnet 创世 nethash
NI1 = H(TG0 + ‘Lisk’)
NI2 = H(TG0 + ‘LiskCash’)
TG0-------|----T1--------------------Lisk------------> NI1
|
|--------------T2---------Liskcash---------> NI2
上述插图展示了硬分叉的可能场景,以及该提案将如何减轻交易重放攻击。如我们所见,我们从一个网络开始,最终分裂为两个网络,分别具有两个不同的网络标识符(NI1
和 NI2
)。假设我们由于社区的少数成员决定将已由 NI1
标识的网络进行硬分叉,结果形成了 NI2
。这些示例的网络标识符是使用相同的 nethash (TG0
) 生成的。当社区中的少数成员决定通过硬分叉(即 NI2
)分裂网络时,他们为其分叉定义了新的社区标识符(例如 LiskCash
)。由于新网络与旧网络共享历史,因此新网络的网络标识符应源自原始 nethash。
假设现在我们有来自 NI1
的交易 T1
。攻击者尝试从网络 NI1
重放交易 T1
到网络 NI2
。该交易将被拒绝,因为该交易的签名对于网络 NI1
是唯一的。更具体地说,NI2
的不同社区标识符生成了不同的网络标识符,导致在交易签名过程中签署不同的数据。如果攻击者尝试从网络 NI2
重放交易 T2
到网络 NI1
,则情况相同。
MG0 = Mainnet 创世 nethash
TG0 = Testnet 创世 nethash
MNI = H(MG0 + 'Lisk')
TNI = H(TG0 + 'Lisk')
TG0-------------T1------------------------------> TNI
MG0------------------------------T2-------------> MNI
上述插图展示了该提案如何避免在具有不同创世区块的网络之间(Testnet,Mainnet)进行交易重放攻击。如我们所见,我们有两个网络,Testnet 和 Mainnet,它们具有不同的 nethash (TG0
和 MG0
),生成两个不同的网络标识符(TNI
和 MNI
)。
假设我们有来自网络 TNI
的交易 T1
,和来自 MNI
的交易 T2
。当攻击者尝试从网络 TNI
重放交易 T1
到网络 MNI
时,该交易将被拒绝,因为 T1
的签名是唯一针对网络 TNI
的。如果用户尝试将来自网络 MNI
的交易 T2
重放到网络 TNI
,情况则相同。
此更改将引入硬分叉。在实施更改后,交易签名将根本不同。这意味着交易将以不同的方式进行验证,因此,旧协议版本的节点将拒绝已使用新协议签名的交易,反之亦然。
待定
在由 Lisk 基金会支持的原始 Lisk Mainnet 中构建新网络标识符的示例:
NH= 'ed14889723f24ecc54871d058d98ce91ff2f973192075c0155ba2b7b70ad2511'
'Lisk'
H()
是 SHA-256使用这些参数,网络标识符将计算为: network_ID = SHA-256(NH + ‘Lisk’)= '9ee11e9df416b18bf69dbd1a920442e08c6ca319e69926bc843a561782ca17ee'
。
- 原文链接: github.com/LiskHQ/lips/b...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!