1 Polygon 是谁?
Polygon 是以太坊的 layer2 扩容方案,其愿景是建造以太坊的区块链互联网。Polygon 提供了一个通用框架,允许开发人员利用以太坊的安全性创建定制的,专注于应用程序的链,并提供一个互操作性网络,结合了各种不同的扩展方案,如:zk-rollup、PoS 等。其中,Polygon PoS 是目前 Polygon 上最成熟和广为人知的扩容方案。它利用侧链进行交易处理,实现提升交易速度并节省 Gas 消耗的目的,网络结构主要包含以下三层:
以太坊主网上的一系列合约,主要包括:Staking、Checkpoint、Reward 合约,负责 PoS 权益相关的质押管理功能,包括:提供 MATIC 原生代币的质押功能,使得任何质押该代币的人可以作为验证者加入系统;验证 Polygon 网络的转态转换获得质押奖励;惩罚验证者的双重签名、验证者停机等不合法行为;保存 checkpoint。
权益证明验证节点层,包括一组 PoS Heimdall 节点,负责将 Polygon 网络的检查点提交给以太坊主网,同时监听部署在以太坊上的一组质押合约。主要流程为:首先选择验证者池中的一部分活跃的验证者作为块生产者,它们将负责在 Bor 层创建区块并广播;接着根据 Bor 提交的检查点,验证 Merkle 根哈希并附加签名;最后,提议者将负责收集指定检查点的所有验证者签名,如果签名数量达到 2/3 以上,则在以太坊上提交该检查点。
出块节点层,包括一组由 Heimdall 层上的验证者委员会定期选取的区块生产者,它们是一个验证者子集,负责将 Polygon 侧链上的交易聚合并生成区块。该层会定期向 Heimdall 层发布检查点(checkpoint),其中检查点代表 Bor 链上的一个快照,如下图所示。
检查点机制是一种将 Bor 层的数据同步到以太坊上的机制,其中同步的数据是检查点,即在一个检查点间隔的时间段内包含的 Bor 层区块数据快照,源码如下:
Proposer:提议者,它也是由验证者选取的,区块生产者和提议者都是验证者的子集,且他们的责任取决于其在整个池子中的股权比例。
RootHash:是由 StartBlock 到 EndBlock 之间的 Bor 块生成的 Merkle Hash。
以下是编号 1 到 n 的 Bor 块生成 RootHash 值的伪码:
综上,该值是 Bor 区块头中的区块号 number、区块时间戳 time、交易树根 Hash 值 tx hash、收据树根 Hash 值 receipt hash 计算得到的 keccak256 哈希值构成的 Merkel tree 的根哈希值。
AccountRootHash:需要将每个检查点发送到以太坊上的验证者相关账户信息的 Merkle Hash,单个账户信息的哈希值计算方式如下:
Pepe Chain:跨链桥现已正常运行,即将推出新版本:7月21日消息,Pepe Chain发推称,跨链桥现已正常运行,到目前为止,已有1600多个钱包地址桥接至Pepe Chain,即将推出新版本。
此前消息,多名社区用户反馈Pepe Chain跨链资产长时间无法跨回。[2023/7/21 15:51:05]
由账户 Merkle tree 根哈希值生成 AccountRootHash 的方式与 RootHash 值相同。
状态同步机制(StateSync)是指将以太坊数据同步到 Polygon Matic 链,主要分为以下几个步骤:
首先以太坊上的合约会触发 StateSender.sol 中的 syncState() 函数进行状态同步
syncState() 函数将发出一个 event 事件,如下:
Heimdall 层的所有验证者都会收到该事件,其中一个验证者会将该交易打包到 heimdall 区块中,并添加到待处理的状态同步列表中;
bor 层节点会通过 API 获取到上述待同步列表,交给 bor 层的合约进行进一步的业务逻辑处理。
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。
PoS Bridge 主要包含两个功能:Deposit 和 Withdrawals,其中 Deposit 指的是将用户在以太坊上的资产转移到 Polygon,Withdrawals 则指的是将资产从 Polygon 提取到以太坊上。
MetaMask现已推出跨链桥功能,支持以太坊、Avalanche等网络:金色财经报道,加密钱包MetaMask现已在其Portfolio界面推出跨链桥功能,用户可以使用推荐的跨链桥或通过价格和速度估算比较所有可用选项来找到满足需求的跨链桥,目前集成的跨链桥包括 Connext、Hop、Celer cBridge 和 Polygon Bridge,当前在测试期间支持EVM兼容链,如Ethereum、Avalanche、BSC 和Polygon,并允许ETH/WETH、普通稳定币和原生gas代币的1:1桥接转移,允许用户在每次转账中桥接最高 10,000 美元。
此前,MetaMask 在上个月推出 Portfolio Dapp,允许用户跨多个账户和网络聚合他们的资产。[2022/11/9 7:23:11]
下面以用户 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,具体为:
研究:2022年跨链桥盗窃案金额达10亿美元:金色财经报道,区块链分析和合规公司Elliptic的研究显示,今年“桥梁黑客”盗取的资金已超过10亿美元。跨链桥允许资产在不同的区块链协议之间移动,这意味着网络包含大量加密资产。
Harmony, Sky Mavis和Wormhole今年都遭受了超过1亿美元的区块链漏洞。Polygon的首席信息安全官Mudit Gupta认为,桥梁安全问题是整个行业的问题。(blockworks)[2022/6/29 1:39:37]
其中第一个参数为该 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
下面以用户 Alice 使用 PoS Bridge 将其在 Polygon 账户中存放的资金提取到以太坊账户为例进行介绍:
NEW ERA跨链桥已正式上线,可桥接以太坊和币安智能链生态:10月21日消息,以太坊二层项目NEW ERA跨链桥已正式上线,可将以太坊生态和币安智能链生态桥接起来,提升双方的互操作性和Token的流动性。目前其第二阶段也已开始,届时用户可以通过该资产桥实现跨层资产转移,且无需等待原生桥的挑战期。在Beta版本阶段,NEC将以优惠手续费的方式向社区提供资产跨层服务。[2021/10/21 20:46:27]
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 位表示的收据路径
receiptLogIndex:从收据树中读取的日志索引
下面是该函数的核心逻辑,主要包括三部分:第一部分是校验 withdraw 交易收据的有效性,第二部分是校验检查点是否包含了交易区块,第三部分是调用 predicate 合约中的 exitTokens() 函数将锁定的代币发送给用户。
4、以 ERC20Predicate 合约为例,即从 log 中解码出接收者、发送者、发送代币数量后,将给定数量的代币发送给用户。
由 PoS Bridge 跨链消息传递过程源码分析可知,整个过程的函数调用都只有验证者指定的角色才能调用,所以跨链的安全性仅由 PoS 保证(公证人)。
YouSwap将于4月10日12时开启ETH/HECO跨链桥兑换:据YouSwap最新消息,平台将于4月10日12:00上线ETH/HECO跨链桥兑换功能,具体时间以官网为准。
去中心化交易所YouSwap于3月26日,正式上线并开启流动性挖矿,第一条公链搭建在以太坊网络上,第二条公链HECO将于4月10日18:00上线。12时左右,YouSwap会率先开启“From ETH to HECO”的跨链桥兑换功能,用户可以通过跨链桥功能实现资产从ETH主网到火币主链HECO的跨链转换。
截至4月10日10时,平台挖矿产出市值总计392627.85(USDT),当前流动性为2097863.21(USDT),YOU 价格报$0.59,涨幅达1180%。[2021/4/10 20:04:51]
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,所以也能被正确处理。相关伪代码如下:
下面以用户 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。
当用户想使用 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 销毁并将对应资产退还给用户:
2021 年 10 月 5 日,白帽子 Gerhard Wagner 提交了一个 Polygon 漏洞,该漏洞可能导致双花攻击,涉及到的金额为 8.5 亿美元,白帽子因此获得了 Polygon 官方的 2,000,000 美元漏洞赏金。
在前文 Plasma Bridge 的介绍中我们知道,完整的一次 Withdraw 交易过程为:
用户在 Polygon 上发起 Withdraw 交易,该交易会 burn 掉用户在 Polygon 的代币;
经过一个检查点间隔(大约 30 分钟),等待该 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 即为 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
ForesightNews
个人专栏
阅读更多
财经法学
金色早8点
Bress
链捕手
PANews
Odaily星球日报
标签:POLYGONPOLPolygonPolyShield.FinanceARGONPolkaPartyPolygon Ecosystem Index
今天,不仅仅加密领域甚至财经和科技领域都在关注一件大事,没错,以太坊合并。刚刚传来的消息显示,以太坊已经于区块高度 15537393(北京时间9月15日14时42分左右)完成了人们期待已久的合并.
1900/1/1 0:00:00这次美联储 FOMC 会议很有趣,一如既往,真正的「魔鬼」隐藏在细节中,让我们来看看一些最有趣的细微差别和市场影响。原文:Alf推特这次美联储 FOMC 会议很有趣.
1900/1/1 0:00:00摘要:TVL如此重要,但我竟然发现最大的DeFi协议Uniswap V3 TVL的数据存在一些错误。官方的Uniswap 图表也存在一些问题.
1900/1/1 0:00:00原文标题:《除了加息 75 基点 本周美联储会议还有啥看点?看加息代价多「痛苦」 鲍威尔多鹰派 》撰文:李丹来源:华尔街见闻本周美联储公布的预期利率水平点阵图比以往更重要.
1900/1/1 0:00:00在移动端上,鲜有Web3.0产品。如果将交易所App、行情站App、资讯App排除在Web3.0应用之外,那么在移动端上其实只剩下钱包产品了.
1900/1/1 0:00:00继上海、深圳、武汉、重庆、厦门、沈阳、北京等多地政府陆续出台关于元宇宙的专项产业发展计划后,河南省也正式加入其中.
1900/1/1 0:00:00