PlatON网络对双ChaiID的支持 | 技术云图

PlatON网络对双ChaiID的支持 | 技术云图

PlatON网络已升级至1.2.0版本,其中包含了2个重要更新,同时支持100和210425两个ChainID与支持智能合约获得随机数,本文将详解PlatON网络对双ChainID的支持。

背景

此前PlatON主网的ChainID值是100,在ethereum-lists/chains 登记的链ID中与其他网络冲突了,为了更好的对DApp(如MetaMask)进行支持,需要再确定一个在EVM框架下由统一的第三方平台注册过唯一的链ID。

因PlatON主网已运行近一年,已有的生态工具(钱包、浏览器等)不能立即迁移或适配新的链ID,因此提议在一段时期内PlatON主网络同时支持双ChainID。

概述

PlatON主网络ChainID值和其他网络冲突,存在以下问题:

  • 存在不同链上的交易在PlatON网络上重放风险
  • 如MetaMask之类的第三方应用不能唯一适配到PlatON网络上

因此,我们的最终目标是将主网络的ChainID由当前的100更新为210425,为达成这个目标需要分3步进行:

01 支持新ChainID210425

可以通过PlatON特有的升级提案先在主网络确保对新链ID210425的支持,同时兼容旧ChainID100,这样既可以很好的适配诸如MetaMask之类的工具,方便新DApp的快速开发,又可以同时兼容当前已经在运行中的应用。

考虑到大部分应用都是从节点上读取的ChainID,在提案没生效前,静态(硬编码)的ChainID必须是同一个,因此必须在这一阶段沿用旧ChainID。同时,P2P链接也是使用ChainID校验,必须在升级期间保证新、旧节点相互兼容。

02 将默认ChainID改为新值

当大部分旧应用已经做好切换后,通过patch版本(小版本)升级,将默认ChainID改为新值210425,以便于新应用直接使用新的ChainID。

03 未来停止对ChainID100的支持

在完成第一阶段升级后,所有新的应用将直接使用新ChainID开发和运行,对于旧的DApp来说(只针对使用了ChainID的应用),可以有充足的时间进行适配和升级,在经历充分的适配调整时间以后,需要再发起新的升级提案,停止使用旧ChainID。

原理

在PlatON网络中ChainID主要有以下作用:

  • 防止交易重放

交易签名加入了ChainID,用于区分不同的链,避免将其他链的交易在PlatON网络中执行,因v值除了记录ChainID外还用于标记椭圆曲线y值的奇偶性,因此只要两个ChainID不是连续整数则可以根据v值获取到用户签名时填入的ChainID。

  • 防止异形攻击

P2P握手消息中加入ChainID,用于验证节点是否是属于同一个链,可以通过判断握手消息中携带的ChainID是否为PlatON所支持的2个ChainID中的一个来适配。

实现

设新ChainID为210425

01 交易验证

解析交易签名后,Transaction->ChainId()->deriveChainId()

v = v – 2*100(原ChainID)

v = v – 8

if v > 28

then

v = v – 2*(210425 – 100)

endif

判断v是否为27或28

ValidateSignatureValues()

签名非法

02 P2P握手

handle处理ping、pong、findnode、neighbors消息时,直接对Rest字段判断,

ChainID ∈ (100,210425) 则验证通过

当收到的ping消息带的chainid是旧值,则pong返回的消息也返回旧值,同理适用于findnode、neighbors消息。

03 opCode(0x46)

NewEVM的时候根据状态初始化chainConfig,EVM执行CHAINID指令时,按原逻辑返回chainconfig.chainid不变,本指令将在第三阶段实施。

本文转载自https://mp.weixin.qq.com/s/0e4ViXzaOeWbXYam1RFG7w

(0)
上一篇 27 4 月, 2022 14:23
下一篇 28 4 月, 2022 09:58

相关推荐

发表回复

登录后才能评论