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