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与以太坊通信机制研究_第1张图片

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层):

  1. 验证自上一个检查点以来的所有区块
  2. 使用区块哈希创建Merkle树
  3. 将Merkle树发布到 root chain(以太坊层)

Chackpoints 有两点原因很重要:

  1. 在RootChain提供终结性
  2. 提供取款时的销毁证明

整个过程如下:

  • 从所有验证者中选择一个活跃的子集作为一段时间的区块生产者。这些区块生产者负责创建区块和广播区块到网络中。

  • 创建一个检查点(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 合约,方便开发者使用.

你可能感兴趣的:(以太坊,区块链)