编辑
2024-09-08
blockchain
00

本文主要针对Plogyon 链进行介绍

Polygon Chain 链分类

image.png

Polygon Pos

Polygon PoS 是以太坊的 EVM 兼容型权益证明侧链,具有高吞吐量和低成本的特点。

双层结构

Polygon PoS 是锚定在以太坊上的第二层(L2)记账证明网络,由以下两层组成:

  • Heimdall 层,共识层,由一组记账证明 Heimdall 节点组成,用于监控部署在以太坊主网上的记账合约,并将 Polygon PoS 网络检查点提交到以太坊主网。 新版 Heimdall 基于 CometBFT
  • Bor 层是一个执行层,由一组由 Heimdall 节点洗牌的区块生成 Bor 节点组成。 Bor 基于 Go Ethereum (Geth)。

CometBFT CometBFT 由两个主要技术组件组成:区块链共识引擎和通用应用程序接口。 共识引擎基于 Tendermint 共识算法,可确保每台机器上记录的交易顺序相同。 被称为应用区块链接口(ABCI)的应用接口将交易传送给应用程序进行处理。 与其他预装内置状态机(如花哨的键值存储或古怪的脚本语言)的区块链和共识解决方案不同,开发人员可以使用 CometBFT 对以任何编程语言和开发环境编写的应用程序进行 BFT 状态机复制。

相关链接: https://docs.cometbft.com/v0.38/introduction/#consensus-overview:~:text=Consensus-,Overview,-CometBFT%20adopts

image.png

交易周期

以下循环工作流程概述了当今 Polygon PoS 架构的运行机制:

  • 用户发起交易: 在 Polygon PoS 链上,通常通过智能合约函数调用。
  • 由公共检查点节点进行验证: 这些节点根据 Polygon 链的当前状态验证交易。
  • 创建和提交检查点: 创建已验证交易的检查点,并提交给以太坊主网上的核心合约。
  • 核心合约验证: 核心合约验证检查点有效性
  • 交易执行: 验证成功后,执行交易,并将状态更改提交到 Polygon PoS。
  • 资产转移(可选): 如有需要,可通过核心合约中的退出队列将资产转回以太坊主网。 循环重演: 用户可再次启动流程,返回步骤 1。

参考链接

https://docs.polygon.technology/pos/

Polygon zkEVM

Polygon zkEVM 是以太坊虚拟机(EVM)的第 2 层网络,是一种零知识(ZK)滚动扩展解决方案。

编辑
2024-09-08
blockchain
00

目前使用Optimistic Rollup 的layer网络

  • Arbitrum one
编辑
2024-09-06
Web3技术栈
00

EVM 存储结构

image.png

  1. non-volatile (不容易丢失的)存储在code和storage 里的数据
  2. volatile(容易丢失的) 存储在stack, args, memory里的话数据

各个存储位置的含义

  • Code: 专门存储只能合约的二进制源码的空间;
  • Storage: 合约持久化存储数据的地方;Storage 是一个巨大的map, 一共22562^{256}个插槽,每个插槽有32byte;
  • Stack 及所说的运行栈,用来保存EVM 的输入输出,可以免费使用,没有gas消耗,用来保存函数的局部变量,数量被限制在16个,stack的最大深度为1024,其中每个单元是32bytes;
  • Args 也叫calldata, 是一段只读的可寻址的保存函数调用参数的空间,与栈不同的地方是,如果要使用calldata 里面的数据,必须手动指定偏移量和读取的字节数。
  • Memory 一个简单的字节数组,用于在运行期间存储数据,将参数传递给内部函数。基于32byte 进行寻址和扩展。

状态变量如何存储

  • 对于大小在32字节以内的变量(常量),以其定义的顺序作为它的索引值存储。
  • 对于连续较小的值,可能被优化存储在同一个位置

合约中前四个状态变量都是 uint64 类型的,则四个状态变量的值会被打包成一个 32 字节的值存储在 0 位置。

结构体

对于代下载32字节以内的结构体同样也是顺序存储。

例如结构体变量索引定义在位置 0,结构体内部有两个成员,则这两个成员的依序为 0 和 1

映射(map)

map 存储位置是通过 keccak256 (bytes32(key) + bytes32(position) ) 计算得到的,position 表示 key 对应 storage 类型变量存储的位置。

数组

定长数组

同上,只要在 32 字节以内也是顺序存储,不过在编译时编译器会进行边界检查防止越界。

可变长度素组

由于可变长度数组长度不定,一般在编译可变长度数组时候会提前预留存储空间,所以就会使用状态变量的位置存储数组的长度。 具体的数据地址会通过keccak256(bytes32(position))算出数组首地址,再加数组长度偏移量获得具体的元素。

理论的最大值是225612^{256}-1

字节数组和字符串

  1. 对于定长字节数组则是同定长数组一样;
  2. 对于可变字节数组和字符串,会在存储值位置补0一直到32字节,并用补0的最后一个字节存储字符串的编码长度。

当节数组和字符串长度大于31字节时

  1. 变量位置存储编码长度,并且编码长度公式更换为编码长度 = 字符数 * 2 + 1
  2. 真实存储值第一个位置通过公式 keccak256(bytes32(position)) 获取,剩余值在获取到的位置顺序存储,同样在最后存储位置补0到32字节。
编辑
2024-09-03
Web3技术栈
00

viem 是一个用于与以太坊区块链进行交互的 JavaScript 库。它提供了一个简单且高效的 API,用于执行各种以太坊相关操作,如发送交易、调用智能合约、监听事件等。