Polygon与以太坊通信机制研究
Polygon 架构
Polygon 是一个区块链应用平台,提供POS共识和Plasma的侧链,
从架构上,它有一个通用的验证层,与各种不同的执行环境隔离。例如,支持Plasma的侧链,完全兼容EVM的侧链,以及在未来,其他的类似
Optimistic Rollups 的layer2.
为了在链上启用PoS机制,Polygon在以太坊上部署了一组Staking合约,以及一组运行Heimdall和Bor节点的激励验证器。以太坊是Polygon支持的第一个基链,但Polygon打算根据社区建议和共识,提供对其他基链的支持,以实现可互操作的去中心化的第2层区块链平台。
Polygon 有三层架构:
- 在以太坊上部署的Staking 合约和 Plasma 合约
- Heimdall (PoS Layer)
- Bor (Block producer layer)
Polygon 合约(on ethereum)
Polygon 在以太坊上维护了一组合约,用于处理以下内容:
- PoS 共识的Staking 管理
- 授权管理,包括验证器共享
- MoreVP的Plasma合约,包括侧链状态的checkout/snapshots
Heimdall (PoS Validator layer)
Heimdall 是独立的一条PoS链,验证着节点与以太坊上的staing合约协同工作实现Polygon的PoS机制。
在架构中,它负责块验证、块生产者委员会选择、侧链区块检查点向以太坊同步,以及其他各种职责。
Heimdall层处理由Bor生成的块聚合到Merkle树中,并定期将Merkle根发布到根链。这种定期发布称为checkpoints。对于Bor上的每几个块,一个验证器(在Heimdall层):
- 验证自上一个检查点以来的所有区块
- 使用区块哈希创建Merkle树
- 将Merkle树发布到 root chain(以太坊层)
Chackpoints 有两点原因很重要:
- 在RootChain提供终结性
- 提供取款时的销毁证明
整个过程如下:
从所有验证者中选择一个活跃的子集作为一段时间的区块生产者。这些区块生产者负责创建区块和广播区块到网络中。
创建一个检查点(checkpoint)包含任意间隔内所有区块merkleroot, 所有节点验证相同并附加签名.
从验证者集合中选出的提议者负责收集特定检查点的所有签名,并在main-chain (基链,目前指以太坊,将来可能有更多其他的基链)上提交相同的签名。
创建块和提议检查点的责任取决于验证者在整个池中的持股比例。
Bor (Block Producer Layer)
Bor 是polygon的区块生产层- 负责将交易打包成区块。它是基于 geth 实现的,进行了共识算法的自定义修改。
区块生产者通过 Heimdall 的委员选举周期性地洗牌,其持续时间在Polygon中称为Span(跨度)。块在Bor节点产生,并且侧链VM是evm兼容的。在Bor上产生的块还由Heimdall节点定期验证,由Bor上一组块的Merkle树哈希组成的检查点定期提交给以太坊。
State Sync Mechanism
Heimdall 层的验证者从以太坊层监听StateSynced 事件并传递到 Bor 层.
/**
* Emits `stateSynced` events to start sync process on Ethereum chain
* @param id State id
* @param contractAddress Target contract address on Bor
* @param data Data to send to Bor chain for Target contract address
*/
event StateSynced (
uint256 indexed id,
address indexed contractAddress,
bytes data
);
一旦StateSynced 事件在以太坊链上触发,Heimdall 就能监听到事件,通过验证者2/3 同意后,会记录到Heimdall状态中.
经过64个区块后,Bor 收集 state sync记录并更新到state中.
func (gc *GenesisContractsClient) CommitState(event *EventRecordWithTime,state *state.StateDB,header *types.Header,chCtx chainContext,
) error {eventRecord := event.BuildEventRecord()recordBytes, err := rlp.EncodeToBytes(eventRecord)if err != nil {return err}method := "commitState"t := event.Time.Unix()data, err := gc.stateReceiverABI.Pack(method, big.NewInt(0).SetInt64(t), recordBytes)if err != nil {log.Error("Unable to pack tx for commitState", "error", err)return err}log.Info("→ committing new state", "eventRecord", event.String())msg := getSystemMessage(common.HexToAddress(gc.StateReceiverContract), data)if err := applyMessage(msg, state, header, gc.chainConfig, chCtx); err != nil {return err}return nil
}
在commitState时, Bor 使用 stateId 和 data 作为参数,在目标合约上执行 onStateReceive方法。Bor链上的receiver合约必须实现 onStateReceive 方法.
Eth <—> Polygon 桥
Polygon 通过引入具有Plasma和PoS安全性的跨链桥,为您带来Polygon和以太坊之间的双向可信交易通道。有了它,用户可以在Polygon之间转移代币,而不会招致第三方风险和市场流动性限制。
当token过桥时,流通供应量不会发生变化。
离开以太坊网络的token被锁定,并且在Polygon上以1:1的比例铸造相同数量的token
为了将代币移回以太坊网络,代币将在Polygon网络上销毁,并在此过程中在以太坊网络上解锁。
Plasma Bridge/PoS Bridge
提供了两种采用不同方式实现的token跨链兑换桥,不详细描述.
L1 <-> L2 通信
这部分是Polygon基于StateSync机制,为开发者提供的Ethereum和Polygon间合约通信的机制。
State Transfer
Polygon 验证者不断的监控以太坊链上StateSender合约, 每当以太坊链上注册的合约调用它时,会产生一个事件. 通过这个事件,Polygon 验证者传递数据到Polygon链上的另一个合约. StateSync 机制用于从以太坊传输数据到Polygon.
Polygon 验证者向以太坊链定期提交Polygon上交易的哈希.
这个检查点可以用来验证在Polygon上发生的任何交易。
一旦一笔交易在Polygon链上被验证,就可以在以太坊上采取相应的行动。
这两种机制可以一起使用,实现以太坊和Polygon之间的双向数据(状态)传输。
为了抽象出这些交互,开发者可以直接继承
FxBaseRootTunnel (on Ethereum)和FxBaseChildTunnel合约。
RootTunnelContract 和 ChildTunnelContract 封装好了以太坊和Polygon状态转换操作。
StateTransfer from Ethereum to Polygon
1. 在以太坊上的合约中调用 _sendMessageToChild 发送数据
2. 在Polygon链上的合约中实现 _processMessageFromRoot 来检索以太坊链上发过来的数据
StateTransfer from Polygon to Ethereum
1. 在Polygon链上调用合约的 _sendMessageToRoot 方法发送数据
2. 在交易被包含到检查点之后,交易的哈希将会用于生成一个Proof。
3. 在以太坊链上的合约中实现 _processMessageFromChild
4. 使用第二步中的Proof作为参数,调用合约的 receiveMessage 获取Polygon向以太坊传输的数据.
Fx-Portal
Fx-Portal 也是基于Polygon的StateSync机制实现的跨链交互. FxRoot 和 FxChild 是 FxPortal 工作的主要合约。
它调用数据并将数据传递给另一个链上的用户定义方法,而不用使用状态同步机制进行任何映射。要使用部署的主合约,你可以在你部署的智能合约中实现FxPortal的基础合约——FxBaseRootTunnel和FxBaseChildTunnel。通过构建这些合约,您部署的合约将能够使用数据隧道机制相互通信。
详见 https://docs.polygon.technology/docs/develop/l1-l2-communication/fx-portal ,主要是合约的集成和方法使用,不过多描述。
总结
Polygon 依靠三层架构,实现了以太坊-Polygon之间的双向通信.
以太坊->Polygon: 依靠验证者实时监听以太坊链上的StateSender合约事件得到数据后传递给Polygon上的其他合约.
Polygon->以太坊:通过验证者定期的上传检查点实现数据传输.
在此底层机制之上,封装了 Fx-Portal 和 State Transfer 合约,方便开发者使用.
Polygon与以太坊通信机制研究相关推荐
- 【刘文彬】以太坊RPC机制与API实例
原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/eth-rpc.html 上一篇文章([刘文彬]探路以太坊)介绍了以太坊的基础知识,我们了解了web3.j ...
- linux 进程通信机制,LINUX内核进程高效通信机制研究
摘要:进程间的通信是多任务.多用户操作系统必须考虑的重大问题,Linux继承了Unix的基本设计思想,其安全性和稳定性得到了人们的认可,但随着其应用领域的不断拓展,其通信机制已经不能满足用户的需求.本 ...
- 区块链学习之Web3j入门(七): 以太坊通知机制
1.通知机制 以太坊的通知机制是建立在日志基础之上,如果智能合约触发了一个事件,那么该事件将写入以太坊日志:如果外部应用订阅了这个事件,那么应用就可以在日志中出现该事件后及时监测到,进而获取日志信息. ...
- 以太坊RLP机制分析
目录 1 RLP 定义 2 RLP 编码规则 3 RLP 编码实例 4 RLP 分析 1 RLP 定义 RLP,即 Recursive Length Prefix, 递归长度前缀编码,是以太坊数据序列 ...
- [以太坊源代码分析] VI. 基于p2p的底层通信(上篇)
以太坊作为一个去中心化的系统,其底层个体相互间的通信显然非常重要,所有数据的同步,各个个体状态的更新,都依赖于整个网络中每个个体相互间的通信机制.以太坊的网络通信基于peer-to-peer(p2p) ...
- 智能合约安全(一):以太坊机制及安全问题
在本系列中,我们将对以太坊现有的安全问题和前沿的各类型漏洞挖掘方法进行综述.本文是本系列的第一篇文章,主要介绍以太坊的机制和存在的安全问题的分类. 01 什么是以太坊智能合约? 以太坊智能合约基于区块 ...
- DeFi之道丨从总锁定价值(TVL)看以太坊、BSC、Polygon等DeFi生态“大乱斗”
2021 年第一季度标志着期待已久的生态系统战争的开始.随着加密市场继续吸引主流关注,新发现的散户进入者将以太坊的费用推高至历史新高.需求的激增对该行业来说是一个净利好消息,但使大多数散户无法使用以太 ...
- 以太坊完整工作原理和运行机制!
以太坊完整工作原理和运行机制! 2018年04月28日 00:00:00 阅读数:26 作者 | Preethi Kasireddy 编译 | 老曹.Aholiab 链圈的人提起「以太坊」三个字想必是 ...
- 【转】以太坊分片:Overview and Finality
在 Ethereum Casper 101 (编者按:EthFans中译见文末)中,Jon Choi 对 Casper 做了一个很棒很清晰的综述,并解释了为什么显式最终确定性(explicit fin ...
- 以太坊简史:因暴雪削弱术士而诞生的千亿美元巨兽
撰文:Eric,Foresight News 2013 年 11 月,在比特币创世区块诞生近 5 年之后,以太坊白皮书问世. 2013 年的 Vitalik Buterin 「这份初稿是我对我们称之为 ...
最新文章
- Pulltorefresh使用中碰到的问题
- 一篇绝好的讲sql server索引的文章,值得收藏
- MYSQL:多表联合查询的例子
- pyDash : Linux 性能监测工具
- java 对象的定义是_浅析Java编程中类和对象的定义
- Windows Azure 真实案例:CCH 财政服务独立软件开发商(ISV)通过托管服务获得了灵活性并节省成本...
- Kibana:数据分析的可视化利器
- pyqt 界面关闭信号_PyQt从类(子窗口)发送信号返回到MainWindow(类)
- 查看oracle表空间的碎片,Oracle 数据库表空间碎片查询和整理
- hdu 4365 瞎涂颜色 数论
- 用 Python 分析《长安十二时辰》
- EasyPoiUtil纯代码生成excel进行下载
- Java项目:基于ssm汽车配件管理系统(计算机毕业设计)
- 我在linux主机用arm-linux-gcc编译后,复制到开发板根目录运行,出现/bin/sh: ./hello not found
- uniapp推出小程序SDK,会是一场技术驱动的行业变革吗?
- HihoCoder 1245:王胖浩与三角形 三角形边长与面积
- Java中isBlank()和isEmpty()的区别
- 传奇服务器开启生肖系统,英雄合击十二生肖商业版[带补丁]
- 晒图赢大奖 | 这个十一,烤仔陪你看世界!
- 树莓派VNC远程桌面使用,包含静态IP设置与窗口大小调整 (附软件链接)