Polygon POS 桥实现原理

这篇具有很好参考价值的文章主要介绍了Polygon POS 桥实现原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

名词解释

RootChain polygon的基链,部署了polygon的staking等一系列合约,指 EthereumMainnet 或 Goerli
ChildChain Polygon 主网或 Mumbai 测试网
RootToken 桥的 RootChain 侧对应的token,即在以太坊链上部署的token
ChildToken 桥的ChildChain 侧对应的token,即在Polygon链上部署的token

PoS-Bridge & Plasma Bridge

桥是用来帮助资产在 RootChain 和ChildChain 之间转移的,由一系列合约实现。
Polygon 提供了两种桥, Plasma Bridge 和 PoS Bridge.
由于Plasma的退出机制,Plasma桥更加安全, 并且从Polygon到Etherum方向的withdraw 有七天的提现周期.
相应的,PoS Bridge 只需要一个 checkpoint 周期.

PoS Bridge 实现原理

PoS Bridge 由一系列合约实现,合约链接 https://github.com/maticnetwork/contracts/blob/main/contracts .

1. 创建token映射

如果你的token需要PoS Bridge 支持以太坊-Polygon间传输,需要添加一个映射,即 RootToken 与 ChildToken 的对应关系.
Polygon 提供了操作页面 https://mapper.polygon.technology/ ,帮助你提交映射请求。提交请求之后,由Polygon Team 帮助你在合约中加入映射关系。

映射的合约代码在 https://github.com/maticnetwork/contracts/blob/main/contracts/common/Registry.sol

	/**
     * @dev Map root token to child token
     * @param _rootToken Token address on the root chain
     * @param _childToken Token address on the child chain
     * @param _isERC721 Is the token being mapped ERC721
     */
    function mapToken(
        address _rootToken,
        address _childToken,
        bool _isERC721
    ) external onlyGovernance {
        require(_rootToken != address(0x0) && _childToken != address(0x0), "INVALID_TOKEN_ADDRESS");
        rootToChildToken[_rootToken] = _childToken;
        childToRootToken[_childToken] = _rootToken;
        isERC721[_rootToken] = _isERC721;
        IWithdrawManager(contractMap[WITHDRAW_MANAGER]).createExitQueue(_rootToken);
        emit TokenMapped(_rootToken, _childToken);
    }

只有Polygon团队有权限调用这个接口。

2. token从以太坊转至Polygon

当需要将token从以太坊转到Polygon时,由以太坊上部署的Depositmanager合约来处理.
https://github.com/maticnetwork/contracts/blob/main/contracts/root/depositManager/DepositManager.sol

rootchain

以ERC20为例, 当用户将token从以太坊转移至Polygon时,在以太坊的合约中进行了锁定,并通过StateSender机制,将此消息发送到了 Polygon 的 ChildERC20合约中. StateSender 机制在其他文档中有描述,是Polygon实现的一种 以太坊和Polygon之间的双向通信机制。

	function depositERC20(address _token, uint256 _amount) external {
        depositERC20ForUser(_token, msg.sender, _amount);
    }
    
	function depositERC20ForUser(
        address _token,
        address _user,
        uint256 _amount
    ) public {
        require(_amount <= maxErc20Deposit, "exceed maximum deposit amount");
        IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
        _safeCreateDepositBlock(_user, _token, _amount);
    }
	
    function _safeCreateDepositBlock(
        address _user,
        address _token,
        uint256 _amountOrToken
    ) internal onlyWhenUnlocked isTokenMapped(_token) {
        _createDepositBlock(
            _user,
            _token,
            _amountOrToken,
            rootChain.updateDepositId(1) /* returns _depositId */
        );
    }
	
    function _createDepositBlock(
        address _user,
        address _token,
        uint256 _amountOrToken,
        uint256 _depositId
    ) internal {
        deposits[_depositId] = DepositBlock(keccak256(abi.encodePacked(_user, _token, _amountOrToken)), now);
        stateSender.syncState(childChain, abi.encode(_user, _token, _amountOrToken, _depositId));
        emit NewDepositBlock(_user, _token, _amountOrToken, _depositId);
    }
child chain

在Polygon链上的 ChildChain 合约代码地址
https://github.com/maticnetwork/contracts/blob/main/contracts/child/ChildChain.sol

当root chain 通过stateSender 发送了deposit消息后,经过一个 checkpoint周期 ,在childchain合约中会收到该信息. 并调用相应的childToken合约的deposit接口.

function onStateReceive(
        uint256, /* id */
        bytes calldata data
    ) external onlyStateSyncer {
        (address user, address rootToken, uint256 amountOrTokenId, uint256 depositId) = abi
            .decode(data, (address, address, uint256, uint256));
        depositTokens(rootToken, user, amountOrTokenId, depositId);
    }
	
	function depositTokens(
        address rootToken,
        address user,
        uint256 amountOrTokenId,
        uint256 depositId
    ) internal {
        // check if deposit happens only once
        require(deposits[depositId] == false);

        // set deposit flag
        deposits[depositId] = true;

        // retrieve child tokens
        address childToken = tokens[rootToken];

        // check if child token is mapped
        require(childToken != address(0x0));

        ChildToken obj;

        if (isERC721[rootToken]) {
            obj = ChildERC721(childToken);
        } else {
            obj = ChildERC20(childToken);
        }

        // deposit tokens
        obj.deposit(user, amountOrTokenId);

        // Emit TokenDeposited event
        emit TokenDeposited(
            rootToken,
            childToken,
            user,
            amountOrTokenId,
            depositId
        );
    }

ChildChain 是由Polygon 团队部署的,不必每个token开发者部署。token开发者必须在合约中实现 deposit 和 withdraw 方法.

当在childchain 中调用deposit方法时,token合约为该跨链用户 mint 出相应数量的token.

示例如下:文章来源地址https://www.toymoban.com/news/detail-680758.html

pragma solidity 0.6.6;

import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";

contract ChildERC20 is ERC20,
{
    using SafeMath for uint256;

    constructor(string memory name, string memory symbol, uint8 decimals) public ERC20(name, symbol) {
        
        _setupDecimals(decimals);
        // can't mint here, because minting in child chain smart contract's constructor not allowed
        // _mint(msg.sender, 10 ** 27);
    
    }

    function deposit(address user, bytes calldata depositData) external {
        uint256 amount = abi.decode(depositData, (uint256));

        // `amount` token getting minted here & equal amount got locked in RootChainManager
        _totalSupply = _totalSupply.add(amount);
        _balances[user] = _balances[user].add(amount);
        
        emit Transfer(address(0), user, amount);
    }

    function withdraw(uint256 amount) external {
        _balances[msg.sender] = _balances[msg.sender].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        
        emit Transfer(msg.sender, address(0), amount);
    }

}

资产从 Polygon 转移到 以太坊的实现原理和上面的过程基本一致.

到了这里,关于Polygon POS 桥实现原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 元宇宙区块链协议Meta0宣布与Polygon建立合作关系

    Meta0 由TikTok游戏部门前负责人执掌,将利用Polygon庞大的GameFi生态系统和开发者工具来帮助推动Web3扩张和互操作性 致力于通过Layer 0协议连接元宇宙与区块链生态系统的新区块链初创企业Meta0宣布与Polygon建立正式的合作关系。 Polygon是极具成本效益、基于EVM的区块链之一,而且

    2023年04月08日
    浏览(70)
  • 区块链必知基础知识、POS、POW、DPOS、公有链、私有链、联盟链

    从不同的技术⻆度来剖析,我们可以这样来看待区块链,它是: 分布式数据库(本质) 每个⽤户都可以通过合法⼿段进⾏读写,不存储于某⼀辆个特定的服务器或安全节点上,⽽是分布式地存放于⽹络上所 有的完整节点上,每个节点保留⼀个备份。 ⽹络底层协议(抽象)

    2024年02月02日
    浏览(34)
  • 用Java来实现区块链原理并简单模拟开发一个小工具

    前几天心血来潮,用Java模拟实现了一个区块链小工具,该工具是单机版的,没有实现联网功能,属于是单节点的工具,但是对于区块链的核心wk逻辑功能都实现了,如:wk、钱包、转账、记账等功能。界面实现用到了Java的swing包。 下面先看下运行的效果: 主界面: 转账:  

    2024年02月11日
    浏览(31)
  • 【CicadaPlayer】seek :SeekInCache(int64_t pos)的实现

    seek的pos就是pts值。 缓冲是list,那么插入的包是按照到达的顺序插入到list的,也就是无排序的。 包的pts 正常应该单调连续, 即使不单调连续,缓存也不在意。 seek的操作主要是先比较pos与mCurrentPos , pos 比 mCurrentPos 小,那么向后,向后就是从cache里查找pts 向前也是在cache里

    2024年02月11日
    浏览(30)
  • DApp创建本地钱包并实现签名转账(BSC,Polygon,ETH)

    安装ether.js 引入ether.js:的三种方法 es3: es5/es6 javascript/typescript es6 这里默认为你已经了解 地址、密码、私钥、助记词、Keystore 之间的关系,所以不再过多介绍,只列出他们之间的关联: 使用到的ethers的Wallet类: createRandom 返回一个带有随机私钥的新钱包,由加密安全的熵源生成。如

    2024年02月09日
    浏览(32)
  • uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!)

    用户需求:需要在填写表单信息时,在地图上标绘自己房屋的位置信息。 这个问题处理了很久,在网上也没有找到全面的相关案例,所以我将我的思路分享给大家,希望可以解决大家遇到的问题。如果大家有更好的思路,欢迎评论区留言,大家一起学习,共同进步! 实现最

    2024年02月04日
    浏览(43)
  • css 属性 clip-path:polygon实现任意图形、多边形

    最近画看板,要求点击客户自定义的不规则图形内的任意地方都可以展示相应的提示, 刚开始让UI 提供切好的不规则背景图,切换位置替换不同的图形,判断是哪个图展示对应的提示 后来查到css这个属性,太好用了 clip-path CSS 属性使用裁剪方式创建元素的可显示区域,类似

    2024年02月12日
    浏览(30)
  • 区块链基础原理和以太坊工作原理

    当我们谈论区块链的基础原理时,我们指的是一种分布式账本技术,它采用去中心化的方式记录和验证交易。区块链的核心概念包括分布式账本、区块、共识机制和加密算法。 1.分布式账本: 2.区块链是一种分布式账本,它将数据存储在多个计算机节点上,而不是集中存储在

    2024年02月20日
    浏览(42)
  • 《区块链原理与技术》学习笔记(一)——区块链概念和区块链共识机制

    《区块链原理与技术》专业课学习笔记 第一部分 一、概论 1.什么是区块链 2.区块链与比特币的关系 2.1 区块链是比特币的底层技术,是比特币的核心基础与架构 2.2 区块链不止是比特币 3 区块链的特点 3.1去中心化 3.2 透明性 3.3 不可篡改性 3.4 多方共识 4 区块链的分类 二、区

    2024年02月04日
    浏览(34)
  • 区块链基础知识(上):区块链基本原理、加密哈希、公钥加密

    目录 基本原理 加密哈希: 公钥加密: 希望有人向你发送只有你才能打开的加密文档/消息时使用 PKC 希望向其他人发送加密文档/消息并证明它确实由你发送时使用 PKC 使用 PKC 和加密哈希对文档/消息进行数字签名 交易哈希链使用数字签名转让数字资产所有权;每个交易记录

    2024年03月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包