热门标签

欧博会员开户(www.aLLbet8.vip):以太坊高度(www.326681.com)_跨链桥警钟常鸣:Polygon 若何预防「潘多拉魔盒」的开启

时间:3周前   阅读:3

皇冠网址www.hg108.vip)是皇冠体育官网线上直营平台。皇冠网址面向亚太地区招募代理,开放皇冠信用网代理申请、皇冠现金网代理会员开户等业务。皇冠网址可下载皇冠官方APP,皇冠APP包括皇冠体育最新代理登录线路、皇冠体育最新会员登录线路。

深度剖析 Polygon 网络结构、互操作性与跨链新闻转达方式,再谈双花破绽平安事宜。

1 Polygon 是谁?

Polygon 是以太坊的 layer2 扩容方案,其愿景是制作以太坊的区块链互联网。Polygon 提供了一个通用框架,允许开发职员行使以太坊的平安性确立定制的,专注于应用程序的链,并提供一个互操作性网络,连系了种种差其余扩展方案,如:zk-rollup、PoS 等。其中,Polygon PoS 是现在 Polygon 上最成熟和广为人知的扩容方案。它行使侧链举行生意处置,实现提升生意速率并节约 Gas 消耗的目的,网络结构主要包罗以下三层:

Ethereum 层:

以太坊主网上的一系列合约,主要包罗:Staking、Checkpoint、Reward 合约,认真 PoS 权益相关的质押治理功效,包罗:提供 MATIC 原生代币的质押功效,使得任何质押该代币的人可以作为验证者加入系统;验证 Polygon 网络的转态转换获得质押奖励;责罚验证者的双重署名、验证者停机等不正当行为;保留 checkpoint。

Heimdall 层:

权益证实验证节点层,包罗一组 PoS Heimdall 节点,认真将 Polygon 网络的检查点提交给以太坊主网,同时监听部署在以太坊上的一组质押合约。主要流程为:首先选择验证者池中的一部门活跃的验证者作为块生产者,它们将认真在 Bor 层确立区块并广播;接着凭证 Bor 提交的检查点,验证 Merkle 根哈希并附加署名;最后,提议者将认真网络指定检查点的所有验证者署名,若是署名数目到达 2/3 以上,则在以太坊上提交该检查点。

Bor 层:

出块节点层,包罗一组由 Heimdall 层上的验证者委员会定期选取的区块生产者,它们是一个验证者子集,认真将 Polygon 侧链上的生意聚合并天生区块。该层会定期向 Heimdall 层宣布检查点(checkpoint),其中检查点代表 Bor 链上的一个快照,如下图所示。

2 Polygon 互操作性

2.1 检查点(checkpoint)

检查点机制是一种将 Bor 层的数据同步到以太坊上的机制,其中同步的数据是检查点,即在一个检查点距离的时间段内包罗的 Bor 层区块数据快照,源码如下:

以下是编号 1 到 n 的 Bor 块天生 RootHash 值的伪码:

综上,该值是 Bor 区块头中的区块号 number、区块时间戳 time、生意树根 Hash 值 tx hash、收条树根 Hash 值 receipt hash 盘算获得的 keccak256 哈希值组成的 Merkel tree 的根哈希值。

AccountRootHash:需要将每个检查点发送到以太坊上的验证者相关账户信息的 Merkle Hash,单个账户信息的哈希值盘算方式如下:

由账户 Merkle tree 根哈希值天生 AccountRootHash 的方式与 RootHash 值相同。

2.2 StateSync

状态同步机制(StateSync)是指将以太坊数据同步到 Polygon Matic 链,主要分为以下几个步骤:

  • syncState() 函数将发出一个 event 事宜,如下:

  • Heimdall 层的所有验证者都市收到该事宜,其中一个验证者会将该生意打包到 heimdall 区块中,并添加到待处置的状态同步列表中;

  • bor 层节点会通过 API 获取到上述待同步列表,交给 bor 层的合约举行进一步的营业逻辑处置。

2.3 Polygon Bridge

Polygon Bridge 实现了 Polygon 和 Ethereum 之间的双向跨链通道,使得用户可以在两个差异链平台之间更为利便地转移代币而不会发生第三方威胁和市场流动性限制。Polygon Bridge 有 PoS 和 Plasma 两种类型,二者在 Polygon 和 Ethereum 之间的资产转移都有以下相同之处:

1)首先需要将 Ethereum 上的代币映射到 Polygon,如下图所示:

2)同样接纳双向锚定手艺(Two-way Peg),即

  • a:从以太坊上转移的代币资产都市先在 Ethereum 上被锁定,且相同数目的映射代币会在 Polygon 上被铸造;

  • b:为了将代币资产提取到 Ethereum,首先需要将这些映射代币在 Polygon 上 burn 掉,之后再解锁锁定在 Ethereum 上的资产;

下图为 PoS Bridge 和 Plasma Bridge 的对比:

由上图可知,平安性方面,PoS Bridge 依赖于外部验证者聚集的平安性,而 Plasma 依赖于 Ethereum 主链的平安性。同时在用户举行跨链资产转移时(如将代币从 Polygon 转移到 Ethereum),PoS 仅需要一个检查点的距离时间,约莫 20 分钟到 3 小时;而 Plasma 则需要一个 7 天的争议挑战期。同时 PoS 支持更多的尺度代币,而 Plasma 仅支持三种类型,包罗:ETH、ERC20、ERC721。

3 跨链新闻转达—PoS Bridge

PoS Bridge 主要包罗两个功效:Deposit 和 Withdrawals,其中 Deposit 指的是将用户在以太坊上的资产转移到 Polygon,Withdrawals 则指的是将资产从 Polygon 提取到以太坊上。

Deposit

下面以用户 Alice 使用 PoS Bridge 将其以太坊账户上的代币资产发送到其在 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 设置的状态发送者(state sender)才气挪用。

3、StateSender.sol 中的 syncState() 函数将提交事宜 StateSynced,详细为:

其中第一个参数为该 log 的序号索引,第二个参数用于校验挪用者是否是已注册的正当合约地址,第三个是需要举行状态同步的数据。该生意会被添加到 Heimdall 块中,并被添加到挂起的状态同步列表中。

4、接着 Polygon Matic 链上的 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 使用 PoS Bridge 将其在 Polygon 账户中存放的资金提取到以太坊账户为例举行先容:

1、当用户 withdraw 时,需要首先在 Polygon 链上通过挪用映射 token 合约的 withdraw() 函数,burn 掉对应数目的映射代币。

withdraw 仅包罗一个参数:将要被 burn 掉的 token 数目。对应的 token 合约中的 withdraw() 函数如下:

2、上述生意将经由约莫 20 分钟到 3 小时将被包罗到 checkpoint 中,被验证者提交到以太坊。

3、一旦生意被添加到检查点中并提交到了以太坊,将挪用以太坊上的 RootChainManager 合约的 exit() 函数,该函数将通过验证提交的检查点内容确认在 Polygon 上 withdraw 生意的有用性,并触发对应的 Predicate 合约解锁用户 deposit 的代币。

其中,传入该函数的 Proof 证实 inputData 包罗以下数据:

  • headerNumber:包罗了 withdraw 生意的检查点区块 header

  • blockProof:证实子链中的区块头是提交的 merkle root 的叶子节点

  • blockNumber:子链上包罗 withdraw 生意的区块号

  • blockTime:withdraw 生意的区块时间戳

  • txRoot:区块生意树的 root 值

  • receiptRoot:区块收条树的 root 值

  • receipt:withdraw 生意的收条

  • receiptProof:withdraw 生意收条的默尔克证实

  • branchMask:收条树中 32 位示意的收条路径

    ,

    以太坊高度数据

    ,

    欧博会员开户www.aLLbet8.vip)是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

    ,

    www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

    ,
  • receiptLogIndex:从收条树中读取的日志索引

下面是该函数的焦点逻辑,主要包罗三部门:第一部门是校验 withdraw 生意收条的有用性,第二部门是校验检查点是否包罗了生意区块,第三部门是挪用 predicate 合约中的 exitTokens() 函数将锁定的代币发送给用户。

4、以 ERC20Predicate 合约为例,即从 log 中解码出吸收者、发送者、发送代币数目后,将给定数目的代币发送给用户。

由 PoS Bridge 跨链新闻转达历程源码剖析可知,整个历程的函数挪用都只有验证者指定的角色才气挪用,以是跨链的平安性仅由 PoS 保证(评判人)。

4 跨链新闻转达—Plasma Bridge

Plasma Bridge 同样包罗两个功效:Deposit 和 Withdrawals,详细流程如下图所示:

Polygon Plasma 与我们跨链桥系列第一篇文章先容的比特币 Plasma MVP 实现略有差异,主要接纳基于账户模子的 Plasma MoreVP。该算法与 Plasma 相比,主要在 withdraw 部门做了部门改善。

由于 ERC20、ERC721 的代币传输,是通过类似比特币 UTXO 的 event 日志实现的,以是我们首先先容一下该事宜:

  • input1:转账前发送者的账户余额

  • input2:转账前吸收者的账户余额

  • output1:转账后发送者的账户余额

  • output2:转账后吸收者的账户余额

其次,原先的 Plasma MVP,由于区块是由单个(Operator)或者少数的区块生产者天生,因此在 Polygon 上存在以下两种攻击场景:

Operator 作恶:

上一篇文章(《跨链桥平安回首:Nomad 去中央化抢劫事宜带给我们什么启发?》)提到,当用户的生意被 Operator 打包为 Plasma 区块后,存在链下数据的不能用性问题。因此,用户在举行 exit 生意时,若是从较旧的生意最先退出,Operator 可以使用其最近的一笔生意对其提议挑战,则会挑战乐成。同时,由于 Plasma 中接纳了 PoS 的检查点机制,Operator 若是勾通验证者作恶,甚至可以伪造一些状态转换并提交到以太坊。

用户作恶:

用户在提议 exit 生意后,继续在 Polygon 上破费代币,类似于跨链的双花。

综上,Polygon 的 Plasma MoreVp 算法接纳了另一种盘算退出优先级的算法,即从最近的生意最先退出。该方式由于使用了类似 UTXO 的 LogTransfer 事宜,只要用户的正当生意使用了准确的 input1、input2,纵然 Operator 一些恶意生意打包在用户生意之前,由于用户生意仅来自有用的 input,以是也能被准确处置。相关伪代码如下:

Deposit

下面以用户 Alice 使用 Plasma Bridge 将其以太坊账户上的代币资产发送到其在 Polygon 账户中为例举行先容:

1、首先用户同样需要将其需要转移的代币资产通过 approve 函数授权给主链(Ethereum)上的 Polygon 合约 depositManager。

2、同样等到授权生意被确认后,用户挪用 erc20token.deposit() 函数,触发 depositManager 合约的 depositERC20ForUser() 函数,存入用户的 ERC20 代币资产。

3、当以太坊主网确认了该 deposit 生意,接下来会确立一个仅包罗这笔生意的区块,并将其接纳状态同步机制发送到 Polygon 网络上的 childChain 合约中,mint 相同数目的映射币并存入用户在 Polygon 上的账户。

注:由 childChain 合约源码剖析可知,Plasma 仅支持三种类型,包罗:ETH、ERC20、ERC721。

Withdraw

当用户想使用 Plasma bridge 从 Polygon 上提取资产到以太坊上,会履历以下几个步骤:

1、用户通过挪用 Polygon 上映射币的 withdraw() 函数,burn 掉 Polygon 链上的映射代币资产:

也可以挪用 Polygon 上的 Plasma Client 的 withdrawStart() 接口实现。

2、用户可以挪用 ERC20Predicate 合约中 startExitWithBurntTokens() 函数,该函数首先会挪用 WithdrawManager.verifyInclusion() 校验 checkpoint 是否包罗 withdraw 生意和对应的收条,代码如下:

验证通事后,将挪用 WithdrawManager.addExitToQueue() 将其根据优先级排序插入到新闻行列中:

最后,addExitToQueue() 挪用_addExitToQueue() 铸造一个 NFT 作为退款凭证:

3、用户守候 7 天的挑战期

4、挑战期完成,可以挪用 WithdrawManager.processExits() 函数将代币发送给用户。

该函数主要分为两个步骤:首先确认新闻行列中的 withdraw 生意是否已经由了 7 天挑战期,若是已经跨越挑战期则将其该生意移除行列:

接着,判断退款凭证 NFT 是否在挑战期内被删除,未被删除则将该 NFT 销毁并将对应资产退还给用户:

5 Polygon Plasma Bridge 双花破绽

2021 年 10 月 5 日,白帽子 Gerhard Wagner 提交了一个 Polygon 破绽,该破绽可能导致双花攻击,涉及到的金额为 8.5 亿美元,白帽子因此获得了 Polygon 官方的 2,000,000 美元破绽赏金。

在前文 Plasma Bridge 的先容中我们知道,完整的一次 Withdraw 生意历程为:

  1. 用户在 Polygon 上提议 Withdraw 生意,该生意会 burn 掉用户在 Polygon 的代币;

  2. 经由一个检查点距离(约莫 30 分钟),守候该 withdraw 生意被包罗到检查点中;

  3. 跨越 2/3 的验证者署名后将其提交到以太坊,此时用户挪用 ERC20PredicateBurnOnly 合约中的 startExitWithBurntTokens() 校验 checkpoint 是否包罗 burn 生意;

  4. 校验通过,则铸造一个 NFT 退款凭证发给用户

  5. 用户守候 7 天挑战期

  6. 挪用 WithdrawManager.processExits() 销毁 NFT,并退款给用户

注重:Polygon 为了防止生意重放(双花攻击),使用 NFT 作为退款凭证,来唯一标识一笔 Withdraw 生意。然则,由于 NFT 的 ID 天生缺陷,造成了攻击者可以组织参数行使统一笔有用的 Withdraw 生意,天生多个差异 ID 的 NFT,再行使这些 NFT 举行退款生意,从而实现「双花攻击」。

下面将对若何若何天生 NFT 举行详细先容:

1、由上文中的源码剖析可知,addExitToQueue() 会挪用_addExitToQueue() 铸造一个 NFT:

由传参剖析可知,exitid = priority,则 NFT 的 ID 即为 Plasma Bridge 中的 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 种方式,能够获得相同的转码后的值。

详细的攻击流程为:

  • 通过 Polygon Plasma 向 Polygon 存入大量 ETH/ 代币

  • 在 Polygon 上提议 Withdraw 生意,守候 7 天的挑战期

  • 修改 withdraw 生意中 branchMaskBytes 参数的第一个字节(统一有用生意最多可以重新提交 223 次),重复提议 Withdraw 生意

综上,该破绽主要是由于天生防止重放的退款凭证 NFT 的 ID 算法设计存在问题,导致相同的退款生意可以天生差其余 NFT,造成双花攻击。事实证实,编码分支掩码的第一个字节应该始终是 0x00. 修复方式是检查编码的分支掩码的第一个字节是否是 0x00 而且不要将其视为不准确的掩码。

原文题目:《跨链桥平安研究 ( 三 ) | 多边形战士 Polygon 平安透析,若何预防「潘多拉魔盒」的开启?》

撰文:成都链安

泉源:ForesightNews

查看更多

上一篇:欧博手机版:小确幸

下一篇:皇冠投注平台出租:美国ISM制造业PMI什么时候公布,它会如何影响欧元/美元?  作者:Fxstreet 2022-09-01 21:41

网友评论