深度解析Polygon网络结构、互操作性与跨链消息传递方式,再谈双花漏洞安全事件。1?Polygon是谁?
Polygon是以太坊的layer2扩容方案,其愿景是建造以太坊的区块链互联网。Polygon提供了一个通用框架,允许开发人员利用以太坊的安全性创建定制的,专注于应用程序的链,并提供一个互操作性网络,结合了各种不同的扩展方案,如:zk-rollup、PoS等。其中,PolygonPoS是目前Polygon上最成熟和广为人知的扩容方案。它利用侧链进行交易处理,实现提升交易速度并节省Gas消耗的目的,网络结构主要包含以下三层:
Ethereum层:
以太坊主网上的一系列合约,主要包括:Staking、Checkpoint、Reward合约,负责PoS权益相关的质押管理功能,包括:提供MATIC原生代币的质押功能,使得任何质押该代币的人可以作为验证者加入系统;验证Polygon网络的转态转换获得质押奖励;惩罚验证者的双重签名、验证者停机等不合法行为;保存checkpoint。
Heimdall层:
权益证明验证节点层,包括一组PoSHeimdall节点,负责将Polygon网络的检查点提交给以太坊主网,同时监听部署在以太坊上的一组质押合约。主要流程为:首先选择验证者池中的一部分活跃的验证者作为块生产者,它们将负责在Bor层创建区块并广播;接着根据Bor提交的检查点,验证Merkle根哈希并附加签名;最后,提议者将负责收集指定检查点的所有验证者签名,如果签名数量达到2/3以上,则在以太坊上提交该检查点。
Bor层:
出块节点层,包括一组由Heimdall层上的验证者委员会定期选取的区块生产者,它们是一个验证者子集,负责将Polygon侧链上的交易聚合并生成区块。该层会定期向Heimdall层发布检查点,其中检查点代表Bor链上的一个快照,如下图所示。
2?Polygon互操作性
2.1检查点
检查点机制是一种将Bor层的数据同步到以太坊上的机制,其中同步的数据是检查点,即在一个检查点间隔的时间段内包含的Bor层区块数据快照,源码如下:
Proposer:提议者,它也是由验证者选取的,区块生产者和提议者都是验证者的子集,且他们的责任取决于其在整个池子中的股权比例。
RootHash:是由StartBlock到EndBlock之间的Bor块生成的MerkleHash。
以下是编号1到n的Bor块生成RootHash值的伪码:
综上,该值是Bor区块头中的区块号number、区块时间戳time、交易树根Hash值txhash、收据树根Hash值receipthash计算得到的keccak256哈希值构成的Merkeltree的根哈希值。
AccountRootHash:需要将每个检查点发送到以太坊上的验证者相关账户信息的MerkleHash,单个账户信息的哈希值计算方式如下:
Binance Labs向Web3游戏平台和发行商Xterio投资1500万美元:7月13日消息,币安发布公告称,Binance Labs向Xterio投资1500万美元,以发展其在AI和Web3方面游戏开发能力。据悉,Xterio为Web3游戏平台和发行商,计划利用该投资加速其孵化的游戏开发、将AI融入其技术以及发行代币等。[2023/7/13 10:52:12]
由账户Merkletree根哈希值生成AccountRootHash的方式与RootHash值相同。
2.2StateSync
状态同步机制是指将以太坊数据同步到PolygonMatic链,主要分为以下几个步骤:
首先以太坊上的合约会触发StateSender.sol中的syncState()函数进行状态同步
syncState()函数将发出一个event事件,如下:
Heimdall层的所有验证者都会收到该事件,其中一个验证者会将该交易打包到heimdall区块中,并添加到待处理的状态同步列表中;
bor层节点会通过API获取到上述待同步列表,交给bor层的合约进行进一步的业务逻辑处理。
2.3PolygonBridge
PolygonBridge实现了Polygon和Ethereum之间的双向跨链通道,使得用户可以在两个不同链平台之间更为方便地转移代币而不会产生第三方威胁和市场流动性限制。PolygonBridge有PoS和Plasma两种类型,二者在Polygon和Ethereum之间的资产转移都有以下相同之处:
1)首先需要将Ethereum上的代币映射到Polygon,如下图所示:
2)同样采用双向锚定技术,即
a:从以太坊上转移的代币资产都会先在Ethereum上被锁定,且相同数量的映射代币会在Polygon上被铸造;
b:为了将代币资产提取到Ethereum,首先需要将这些映射代币在Polygon上burn掉,之后再解锁锁定在Ethereum上的资产;
下图为PoSBridge和PlasmaBridge的对比:
由上图可知,安全性方面,PoSBridge依赖于外部验证者集合的安全性,而Plasma依赖于Ethereum主链的安全性。同时在用户进行跨链资产转移时,PoS仅需要一个检查点的间隔时间,大约20分钟到3小时;而Plasma则需要一个7天的争议挑战期。同时PoS支持更多的标准代币,而Plasma仅支持三种类型,包括:ETH、ERC20、ERC721。
3?跨链消息传递—PoSBridge
PoSBridge主要包含两个功能:Deposit和Withdrawals,其中Deposit指的是将用户在以太坊上的资产转移到Polygon,Withdrawals则指的是将资产从Polygon提取到以太坊上。
Deposit
数据:只有8%的美国人对加密货币持正面看法,远低于3月份的19%:金色财经报道,CNBC全美经济调查数据显示,截至11月底,只有8%的美国人对加密货币持正面看法,远低于3月份的19%,而对加密货币持负面看法的人迅速增长,从3月份的25%增加到11月的43%。[2022/12/8 21:30:40]
下面以用户Alice使用PoSBridge将其以太坊账户上的代币资产发送到其在Polygon账户中为例进行介绍:
1、如果用户想转移的代币资产为ERC20、ERC721、ERC1155类型,则首先需要用户将要转移的代币通过approve函数授权。如下所示:通过调用以太坊上token合约中的approve方法将对应数量的token授权给erc20Predicate合约。
其中approve函数有两个参数:
spender:用户授权允许花费代币的目标地址
amount:可以被花费的代币数量
2、上述授权交易被确认后,用户接着通过调用RootChainManager合约的depositFor()方法将代币锁定到以太坊上的erc20Predicate合约中。此处,如果转移的资产类型是ETH,则调用depositEtherFor()。具体如下:
其中depositFor函数有三个参数:
user:接收Polygon上deposit代币的用户地址
rootToken:以太坊主链上的token地址
depositData:ABI编码后的代币数量
以下是RootChainManager合约中depositFor函数的具体代码:
分析源码可知,该函数首先获取到token对应的predicate合约地址,接着调用其lockTokens()函数将token锁定在该合约中。最后_stateSender将调用syncState()进行状态同步,该函数只有admin设置的状态发送者才能调用。
3、StateSender.sol中的syncState()函数将提交事件StateSynced,具体为:
其中第一个参数为该log的序号索引,第二个参数用于校验调用者是否是已注册的合法合约地址,第三个是需要进行状态同步的数据。该交易会被添加到Heimdall块中,并被添加到挂起的状态同步列表中。
Web2.5创作者经济初创公司Moneyy APP完成天使轮融资,GSFAccelerator领投:6月9日消息,面向创作者的金融科技 Moneyy App宣布完成了一笔天使轮融资,具体金额暂未对外披露,GSF Accelerator 领投,IndiaMart 创始人 Dinesh Agarwal、Nazara Technologies 创始人 Nitesh Mittersain、Fluid Ventures 的 Amit Singhal、U2opia Mobiles 的 Sumesh Menon、Pras Hanuma 等参投。
MoneyyApp是一款通过提供金融科技工具帮助创作者管理业务的金融科技应用程序,希望成为创造者经济从Web2.0向Web3.0转变的桥梁,因此自称是一家Web2.5初创公司。据悉,MoneyyApp将利用这笔资金扩大其业务,同时致力于产品开发并围绕该应用程序建立知名度。(freepressjournal)[2022/6/9 23:02:47]
4、接着PolygonMatic链上的bor节点通过API获取到状态同步列表中的StateSynced事件后,该链上的ChildChainManager合约会调用onStateReceive()函数,该函数用于接收从以太坊上传过来的同步数据,根据状态同步的业务逻辑类型进行下一步处理:
data:包括bytes32类型的syncType、bytes类型的syncData。其中,syncType代表业务类型,包括deposit和mapping代币映射;当syncType为mapping时,syncData为编码后的rootToken地址、childToken地址和bytes32类型的tokenType;当syncType为deposit时,syncData为编码后的user地址、rootToken地址和bytes类型的depositData。depositData在REC20中是数量,ERC721中指的是tokenId。
5、由于此处进行的是Deposit业务,所以接着会调用_syncDeposit()函数。该函数会首先将syncData按照对应格式解码,得到对应的rootToken、user地址、depositData。接着校验rootToken在polygon上是否有对应的映射代币childToken,如果有则调用childToken的deposit()函数。
6、此处我们以ERC20的代币合约为例,介绍映射代币合约如何deposit。该函数将mint对应数量的代币到用户账户中。
该函数有两个参数:
user:正在进行存款的用户地址
depositData:用ABI编码的amount
Withdrawals
下面以用户Alice使用PoSBridge将其在Polygon账户中存放的资金提取到以太坊账户为例进行介绍:
1、当用户withdraw时,需要首先在Polygon链上通过调用映射token合约的withdraw()函数,burn掉对应数量的映射代币。
安全团队:约5750万美元USDC已从Mango开发者地址转移:10月12日消息,据派盾(PeckShield)检测,约5750万美元USDC已从Mango开发者地址转移到新地址41zCUJsKk...TwePu。
此前报道,Solana生态去中心化金融平台Mango因闪电贷攻击潜在损失达1亿美元,官方称正对此采取措施。[2022/10/12 10:32:23]
withdraw仅包含一个参数:将要被burn掉的token数量。对应的token合约中的withdraw()函数如下:
2、上述交易将经过大约20分钟到3小时将被包含到checkpoint中,被验证者提交到以太坊。
3、一旦交易被添加到检查点中并提交到了以太坊,将调用以太坊上的RootChainManager合约的exit()函数,该函数将通过验证提交的检查点内容确认在Polygon上withdraw交易的有效性,并触发对应的Predicate合约解锁用户deposit的代币。
其中,传入该函数的Proof证明inputData包括以下数据:
headerNumber:包含了withdraw交易的检查点区块header
blockProof:证明子链中的区块头是提交的merkleroot的叶子节点
blockNumber:子链上包含withdraw交易的区块号
blockTime:withdraw交易的区块时间戳
txRoot:区块交易树的root值
receiptRoot:区块收据树的root值
receipt:withdraw交易的收据
receiptProof:withdraw交易收据的默尔克证明
branchMask:收据树中32位表示的收据路径
receiptLogIndex:从收据树中读取的日志索引
下面是该函数的核心逻辑,主要包括三部分:第一部分是校验withdraw交易收据的有效性,第二部分是校验检查点是否包含了交易区块,第三部分是调用predicate合约中的exitTokens()函数将锁定的代币发送给用户。
4、以ERC20Predicate合约为例,即从log中解码出接收者、发送者、发送代币数量后,将给定数量的代币发送给用户。
由PoSBridge跨链消息传递过程源码分析可知,整个过程的函数调用都只有验证者指定的角色才能调用,所以跨链的安全性仅由PoS保证。
4?跨链消息传递—PlasmaBridge
PlasmaBridge同样包含两个功能:Deposit和Withdrawals,具体流程如下图所示:
韩国OK金融集团公布加密资产启动计划:金色财经报道,韩国的OK 金融集团公布了创建加密资产的计划。OK Financial Group 也可以选择在国外推出其代币,该公司表示其硬币将在今年年底前准备就绪。该公司将通过其OK Investment Partners (OKIP) 子公司发行该代币,并将标志着所谓的“二级”金融行业的“第一”。该公司已邀请区块链公司提交合作提案,并将听取愿意开发其将命名为 OK Coin 的公司的投标。该公司可能会被许多其他国内金融业参与者追随进入 ICO 和加密市场。(cryptonews)[2022/6/12 4:19:42]
PolygonPlasma与我们跨链桥系列第一篇文章介绍的比特币PlasmaMVP实现略有差别,主要采用基于账户模型的PlasmaMoreVP。该算法与Plasma相比,主要在withdraw部分做了部分改进。
由于ERC20、ERC721的代币传输,是通过类似比特币UTXO的event日志实现的,所以我们首先介绍一下该事件:
input1:转账前发送者的账户余额
input2:转账前接收者的账户余额
output1:转账后发送者的账户余额
output2:转账后接收者的账户余额
其次,原先的PlasmaMVP,由于区块是由单个或者少数的区块生产者生成,因此在Polygon上存在以下两种攻击场景:
Operator作恶:
上一篇文章提到,当用户的交易被Operator打包为Plasma区块后,存在链下数据的不可用性问题。因此,用户在进行exit交易时,如果从较旧的交易开始退出,Operator可以使用其最近的一笔交易对其发起挑战,则会挑战成功。同时,由于Plasma中采用了PoS的检查点机制,Operator如果勾结验证者作恶,甚至可以伪造一些状态转换并提交到以太坊。
用户作恶:
用户在发起exit交易后,继续在Polygon上花费代币,类似于跨链的双花。
综上,Polygon的PlasmaMoreVp算法采用了另一种计算退出优先级的算法,即从最近的交易开始退出。该方式由于使用了类似UTXO的LogTransfer事件,只要用户的合法交易使用了正确的input1、input2,即使Operator一些恶意交易打包在用户交易之前,由于用户交易仅来自有效的input,所以也能被正确处理。相关伪代码如下:
Deposit
下面以用户Alice使用PlasmaBridge将其以太坊账户上的代币资产发送到其在Polygon账户中为例进行介绍:
1、首先用户同样需要将其需要转移的代币资产通过approve函数授权给主链上的Polygon合约depositManager。
2、同样等到授权交易被确认后,用户调用erc20token.deposit()函数,触发depositManager合约的depositERC20ForUser()函数,存入用户的ERC20代币资产。
3、当以太坊主网确认了该deposit交易,接下来会创建一个仅包含这笔交易的区块,并将其采用状态同步机制发送到Polygon网络上的childChain合约中,mint相同数量的映射币并存入用户在Polygon上的账户。
注:由childChain合约源码分析可知,Plasma仅支持三种类型,包括:ETH、ERC20、ERC721。
Withdraw
当用户想使用Plasmabridge从Polygon上提取资产到以太坊上,会经历以下几个步骤:
1、用户通过调用Polygon上映射币的withdraw()函数,burn掉Polygon链上的映射代币资产:
也可以调用Polygon上的PlasmaClient的withdrawStart()接口实现。
2、用户可以调用ERC20Predicate合约中startExitWithBurntTokens()函数,该函数首先会调用WithdrawManager.verifyInclusion()校验checkpoint是否包含withdraw交易和对应的收据,代码如下:
验证通过后,将调用WithdrawManager.addExitToQueue()将其按照优先级排序插入到消息队列中:
最后,addExitToQueue()调用_addExitToQueue()铸造一个NFT作为退款凭证:
3、用户等待7天的挑战期
4、挑战期完成,可以调用WithdrawManager.processExits()函数将代币发送给用户。
该函数主要分为两个步骤:首先确认消息队列中的withdraw交易是否已经过了7天挑战期,如果已经超过挑战期则将其该交易移除队列:
接着,判断退款凭证NFT是否在挑战期内被删除,未被删除则将该NFT销毁并将对应资产退还给用户:
5?PolygonPlasmaBridge双花漏洞
2021年10月5日,白帽子GerhardWagner提交了一个Polygon漏洞,该漏洞可能导致双花攻击,涉及到的金额为8.5亿美元,白帽子因此获得了Polygon官方的2,000,000美元漏洞赏金。
在前文PlasmaBridge的介绍中我们知道,完整的一次Withdraw交易过程为:
用户在Polygon上发起Withdraw交易,该交易会burn掉用户在Polygon的代币;
经过一个检查点间隔,等待该withdraw交易被包含到检查点中;
超过2/3的验证者签名后将其提交到以太坊,此时用户调用ERC20PredicateBurnOnly合约中的startExitWithBurntTokens()校验checkpoint是否包含burn交易;
校验通过,则铸造一个NFT退款凭证发给用户
用户等待7天挑战期
调用WithdrawManager.processExits()销毁NFT,并退款给用户
注意:Polygon为了防止交易重放,使用NFT作为退款凭证,来唯一标识一笔Withdraw交易。但是,由于NFT的ID生成缺陷,造成了攻击者可以构造参数利用同一笔有效的Withdraw交易,生成多个不同ID的NFT,再利用这些NFT进行退款交易,从而实现「双花攻击」。
下面将对如何如何生成NFT进行详细介绍:
1、由上文中的源码解析可知,addExitToQueue()会调用_addExitToQueue()铸造一个NFT:
由传参分析可知,exitid=priority,则NFT的ID即为PlasmaBridge中的age优先级左移一位生成。
2、上文的源码解析可知,age是WithdrawManager.verifyInclusion()函数的返回值,该函数会首先校验withdraw交易的有效性,校验通过则生成对应的age。其中,校验的逻辑中使用了可控参数data解码出的值branchMaskBytes:
同时生成age时也使用了该值:
3、跟踪交易验证逻辑中的调用的MerklePatriciaProof.verify()函数,发现该函数调用_getNibbleArray()对branchMaskBytes进行了转码操作:
4、继续跟踪该解码函数,该函数对branchMaskBytes转码时存在丢弃部分值的情况,这种数值丢失的方式会造成不同的值转码后获得同样的解码值。具体为:如果传入的hp编码后的值b的第一个十六进制位是1或3,就解析第二个十六进制位。否则,就直接忽略第一个字节。
那么如果攻击者构造一个branchMaskBytes参数,使得其第一个十六进制位不等于1和3,则共有14*16=224种方式,能够获得相同的转码后的值。
具体的攻击流程为:
通过PolygonPlasma向Polygon存入大量ETH/代币
在Polygon上发起Withdraw交易,等待7天的挑战期
修改withdraw交易中branchMaskBytes参数的第一个字节,重复发起Withdraw交易
综上,该漏洞主要是由于生成防止重放的退款凭证NFT的ID算法设计存在问题,导致相同的退款交易可以生成不同的NFT,造成双花攻击。事实证明,编码分支掩码的第一个字节应该始终是0x00.修复方法是检查编码的分支掩码的第一个字节是否是0x00并且不要将其视为不正确的掩码。
原文标题:《跨链桥安全研究(三)|多边形战士Polygon安全透析,如何预防「潘多拉魔盒」的开启?》
撰文:成都链安
来源:ForesightNews
来源:金色财经
标签:GONPOLPolygonOLYPuzzle And Dragons XPOLI价格polygon币当前行情polydoge币会不会万倍币
区块链领域正不断尝试突破发展,致力于通过DApp来在Web3世界中发挥重要作用。随着我们向Web3的进一步迁移,开发者们也渐渐意识到区块链存在一个数字隐私的问题,这个问题是区块链迈向Web3不可.
1900/1/1 0:00:00近年来,区块链技术风靡全球,其极高的生态赋能特性、数据安全性与丰富的应用场景,吸引着大量资本和创业者纷纷涌入这个领域,许多区块链爱好者也对此产生了浓厚兴趣,试图以区块链技术解决行业壁垒.
1900/1/1 0:00:00安士百科,致力于成为区块链领域的百科全书,是业内卓越一流的知识库,安士百科深度整合了区块链行业多方面知识、区块链安全经典案例以及政策法规.
1900/1/1 0:00:009.18比特币行情解析大饼昨日处于横盘阶段,上下波动都不大,低位跌至19750一线支撑反弹,最高至20200附近,文中给出的多单到达第一止盈附近获利400美刀,恭喜跟上的币友.
1900/1/1 0:00:00各位朋友大家好,我是老舍,永远,不要让别人偷走你的梦想,这个世界上不缺乏贩卖焦虑者,永远,不要让震荡磨灭你的激情,这个市场不缺乏震荡洗盘.
1900/1/1 0:00:001)全球政策:1.1美国财政部将建议政府采用数字美元;1.2印度央行将与公共银行和金融科技公司启动CBDC试点;1.3俄罗斯财政部宣布加密货币跨境支付可能即将合法化;2)项目进展:2.
1900/1/1 0:00:00