Polygon 是一个区块链应用平台,提供POS共识和Plasma的侧链,
从架构上,它有一个通用的验证层,与各种不同的执行环境隔离。例如,支持Plasma的侧链,完全兼容EVM的侧链,以及在未来,其他的类似
Optimistic Rollups 的layer2.
为了在链上启用PoS机制,Polygon在以太坊上部署了一组Staking合约,以及一组运行Heimdall和Bor节点的激励验证器。以太坊是Polygon支持的第一个基链,但Polygon打算根据社区建议和共识,提供对其他基链的支持,以实现可互操作的去中心化的第2层区块链平台。
Polygon 有三层架构:
Polygon 在以太坊上维护了一组合约,用于处理以下内容:
Heimdall 是独立的一条PoS链,验证着节点与以太坊上的staing合约协同工作实现Polygon的PoS机制。
在架构中,它负责块验证、块生产者委员会选择、侧链区块检查点向以太坊同步,以及其他各种职责。
Heimdall层处理由Bor生成的块聚合到Merkle树中,并定期将Merkle根发布到根链。这种定期发布称为checkpoints。对于Bor上的每几个块,一个验证器(在Heimdall层):
Chackpoints 有两点原因很重要:
整个过程如下:
从所有验证者中选择一个活跃的子集作为一段时间的区块生产者。这些区块生产者负责创建区块和广播区块到网络中。
创建一个检查点(checkpoint)包含任意间隔内所有区块merkleroot, 所有节点验证相同并附加签名.
从验证者集合中选出的提议者负责收集特定检查点的所有签名,并在main-chain (基链,目前指以太坊,将来可能有更多其他的基链)上提交相同的签名。
创建块和提议检查点的责任取决于验证者在整个池中的持股比例。
Bor 是polygon的区块生产层- 负责将交易打包成区块。它是基于 geth 实现的,进行了共识算法的自定义修改。
区块生产者通过 Heimdall 的委员选举周期性地洗牌,其持续时间在Polygon中称为Span(跨度)。块在Bor节点产生,并且侧链VM是evm兼容的。在Bor上产生的块还由Heimdall节点定期验证,由Bor上一组块的Merkle树哈希组成的检查点定期提交给以太坊。
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 方法.
Polygon 通过引入具有Plasma和PoS安全性的跨链桥,为您带来Polygon和以太坊之间的双向可信交易通道。有了它,用户可以在Polygon之间转移代币,而不会招致第三方风险和市场流动性限制。
当token过桥时,流通供应量不会发生变化。
离开以太坊网络的token被锁定,并且在Polygon上以1:1的比例铸造相同数量的token
为了将代币移回以太坊网络,代币将在Polygon网络上销毁,并在此过程中在以太坊网络上解锁。
提供了两种采用不同方式实现的token跨链兑换桥,不详细描述.
这部分是Polygon基于StateSync机制,为开发者提供的Ethereum和Polygon间合约通信的机制。
Polygon 验证者不断的监控以太坊链上StateSender合约, 每当以太坊链上注册的合约调用它时,会产生一个事件. 通过这个事件,Polygon 验证者传递数据到Polygon链上的另一个合约. StateSync 机制用于从以太坊传输数据到Polygon.
Polygon 验证者向以太坊链定期提交Polygon上交易的哈希.
这个检查点可以用来验证在Polygon上发生的任何交易。
一旦一笔交易在Polygon链上被验证,就可以在以太坊上采取相应的行动。
这两种机制可以一起使用,实现以太坊和Polygon之间的双向数据(状态)传输。
为了抽象出这些交互,开发者可以直接继承
FxBaseRootTunnel (on Ethereum)和FxBaseChildTunnel合约。
RootTunnelContract 和 ChildTunnelContract 封装好了以太坊和Polygon状态转换操作。
1. 在以太坊上的合约中调用 _sendMessageToChild 发送数据
2. 在Polygon链上的合约中实现 _processMessageFromRoot 来检索以太坊链上发过来的数据
1. 在Polygon链上调用合约的 _sendMessageToRoot 方法发送数据
2. 在交易被包含到检查点之后,交易的哈希将会用于生成一个Proof。
3. 在以太坊链上的合约中实现 _processMessageFromChild
4. 使用第二步中的Proof作为参数,调用合约的 receiveMessage 获取Polygon向以太坊传输的数据.
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 合约,方便开发者使用.