ETH-EIP-4337
EIP-4337首先声明以下几点:
用户钱包都采用 contract 实现,每个用户对应一个合约地址
用户初次发起交易时,会自动创建合约
用户可以指定一个 payment 合约地址,用该地址中的余额支付手续费
整体架构
ERC-4337 定义了一个基于 ETH 的账户抽象标准,以下为简单介绍。
UserOperation:类比原生交易,不过为另一种格式的交易,比如支持携带自定义签名、交易的基础信息(gas、sender、limit等)
UserOperation mempool:专门的一些节点搭建的P2P网络构成的交易缓存池,用于接受UserOperation
Bundler:负责收集、校验、打包UserOperation,并将打包好的交易发送给产块人,交易上链的费用由Bundler支付,但是Bundler会从UserOperation中获取用户的手续费作为奖励。
Note:本质上是启动了一个独立于主链的P2P网络,用于接收抽象账户的交易并打包上链。
https://github.com/ethereum/EIPs/blob/3fd65b1a782912bfc18cb975c6 ...
Cosmos 普通交易手续费调研
背景分析 cosmos 的交易手续费的实现细节,以了解其实现手续费模型用于实现参考。在 cosmos 中,gas 用于跟踪执行期间的资源消耗。普通交易消耗的也是 gas。gas 通常在对存储进行读取和写入时使用,但如果需要执行昂贵的计算,也可以使用。
重点关注的两件事情:
如果计算、校验,即交易做了哪些操作,是否合法
每个操作的收费是如何定价的,包括:读取、存储、计算。
tx 会产生所有状态读取/写入、签名验证以及与 tx 大小成比例的成本的 gas 成本。运营商在启动节点时会设定最低 gas 价格。
需要消耗 gas的交易类型每个交易在执行过程中都会消耗一定数量的Gas,该Gas用于跟踪执行过程中的资源消耗。在Cosmos SDK应用程序中,交易可以是发送消息(Message)的操作,例如
发送代币
执行智能合约
当执行这些消息时,相关的Gas会被消耗,并且可能会生成相应的费用(Fees)。
请注意,Gas的消耗和费用的生成通常由应用程序开发者定义和管理,可以根据具体的应用逻辑和需求进行设置。
Cosmos SDK提供了Gas计量器(GasMeter)(主要就是通过个是来记录 ...
EIP-4844-blob 简单说明
简述Blob交易是专门为Rollups而设计的特殊交易。它从 EVM 执行环境中分离出来,并以状态最小化的方式,来促进rollup机制原生嵌入以太坊网络中的实施(包括 optimistic 和 zk)的方式大幅增加交易吞吐量。大白话就是,为了省钱(手续费)专门设计的一种交易类型。
第一阶段EIP4844 主要即为第一个阶段所要完成的工作。主要包括:
1.新增一种交易类型,该交易类型新增了一种字段:blob,为该字段设置单独的gas收费标准,且收费较低,rollup 可采用该字段存储数据
2.新增blob会增大区块数据量,新增历史数据清理功能,超过30天的blob数据可以从节点移除,或迁移至第三方去中心化存储
3.blob与 tx 存储分离,并通过一个 commitment 来进行关联,commitment采用 KZG 算法来实现,KZG 算法可以看做类似 merkle 树的证明算法
4.KZG 在 sharding 中扮演着重要的角色,Rollup 校验中除了 KZG,采用别的验证算法都无法达到很好的效果。
数据结构
1.消息与签名12345678910111213141516clas ...
rust 继承、封装、多态
封装(encapsulation)rust 的封装是基于结构体,而不是对象,结构体就是 rust 的对象,这个和go一样。默认情况下,结构体只有字段。注意,结构体自身被标记为 pub,这样其他代码就可以使用这个结构体,但是在结构体内部的字段仍然是私有的!!!!可以通过实现结构体,来为结构体添加方法,也是和go一样的特性!!
123456789101112131415161718192021222324252627282930313233343536373839404142pub struct AveragedCollection { list: Vec<i32>, average: f64,}impl AveragedCollection { // 这个 self 是不是有熟悉的感觉,python 中大量使用 self pub fn add(&mut self, value: i32) { self.list.push(value); self.update_average( ...
以太坊 EIP-4844 简述
简述是由Vitalik Buterin和其他来自以太坊生态系统的程序员共同创建的,它关注的是分片技术。
目的EIP-4844的主要目的是在不牺牲去中心化的情况下,降低网络上的gas费用,特别是对rollup解决方案。Arbitrum和Optimism等rollup解决方案可以将gas费用降低100到1000倍。
EIP-4844 提案是作为以太坊2.0更新完成之前的临时解决方案。该提案解释了一种新方法,以帮助划分交易中所需的信息,如验证规则和交易格式,而无需实际实现任何分片。
这是一个很大的EIP,细分下来,需要用很多篇文章才能讲完整个EIP的细节经及EIP-4844要做的事。
背景每个区块 12 秒的出块时间 TPS 大概为 13~30 笔交易左右,但根据目前已知以太坊的 TPS 最高可以达到每秒 45 笔交易。以太坊做为最主流的区块链,这个TPS就非常拉夸,还要号称世界计算机。
所以想要成为 “世界计算机” 的以太坊每秒最多处理 45 笔交易的性能实在是太弱了。所以以太坊迫切需要扩容来解决性能问题。
以太坊由于智能合约的存在,每个交易的内容各不相同,所以每个区块可以处理多少笔交易( ...
使用IDEA开发rust提示file is not included in module tree
问题用了很长一段时间nvim写rust,还没有用IDEA这样的IDE来写rust。就准备用一下,一用发现,还不太会在IDEA上用rust。碰到的第一个问题就是 IDEA 提示:
file is not included in module tree, analysis is not available
fn main 也没有可以运行的按钮,但是命令行使用 cargo run 正常。这个说明应该是IDEA的配置的问题。
解决IDEA 用 rust 我也不熟,猜测应该是跟项目构建有关,就类似IDEA 使用 maven 的构建,也需要对应的设置一样。
右键一下 Cargo.toml看一下,还真有一个Attach Cargo Project这一项,然后只要把项目添加到 IDEA 中就可以:
右键--> Cargo.toml-->Attach Cargo Project
之后运行就正常了,记录一下,虽然是个小问题,但是可能也会帮助到同样出现这个问题的小伙伴。
rust-生命周期
前言先说大白话,rust 的生命周期标注,是为了明确多个变量的生命周期是否一致,仅此而已,因为如果rust不知道多个变量的生命周期是否一致,它无法确的知道这个变量是否已经被释放。这个下面再细说,先说有什么用。
rust当中,的两个重要概念:借用和生命周期分别代是在:
栈变量,需要关注【所有权】
引用(指针),需要关注【生命周期】
Rust 的每个引用都有自己的生命周期,生命周期指的是引用保持有效的作用域。大多数情况下,引用是隐式的、可以被推断出来的,但当引用可能以不同的方式互相关联时,则需要手动标注生命周期。这里重点就是以不同的方式互相关联时。
大多数情况下,rust 可以自己推断出引用的生拿周期,也就是只有在一些rust无法自行推断的情况下,才需要手动标注生命周期。
生命周期Rust 中的每一个引用都有其生命周期(lifetime),也就是引用保持有效的作用域。大部分时候生命周期是隐含并可以推断的,正如大部分时候类型也是可以推断的一样。类似于当因为有多种可能类型的时候必须注明类型,也会出现引用的生命周期以一些不同方式相关联的情况,所以 Rust 需要我们使用泛型生命周期参数来注明 ...
rust-vim 整合基于vimspector的debug调试环境
前言前面配置好rust开发环境后,还需要一个调试功能就能用了。不清楚的可以回看我的rust-vim安装记录调试器,找了几款,最后还是觉得还是使用vimspector这个用的习惯,捣鼓两个整合了一下基于vimspector的调试环境,快捷键不用重新再配置。
效果图:
这几天换了mac M2,把功能都迁移过来,完可用,这图就是M2上载图的。另外补全相关的配置,需要coc的一些额外配置。vim CocConfig参数设置说明
流程
安装vimspector插件: puremourning/vimspector
添加配置文件:
lldb-vscode.json
.vimspector.json
安装vimspector插件添加插件,然后执行PlugInstall,路径:
~/.config/nvim/init.vim
--enable-rust 表示要启用的语言支持,可以从官网查看支持的语言。
1Plug 'puremourning/vimspector', {'do': './install_gadget.py --en ...
coc-java无法启动和lombok报错解决
问题一问时间不写java,这两天写java程序发现vim-java相关配置失效了,症状就是:
语法提示服务jdt不启动
lombok 失效
排查了一圈发现启动后官方的插件配置名都变了,改用合结vs-code的配置,又折腾了好一会。
解决更新jdt从官方jdt下载一个新包:https://github.com/eclipse/eclipse.jdt.ls备分:~/.config/coc/extensions/coc-java-data/server/ 目录,把下载的新包,内容放到 server下。
解决 lombok 报错问题还没完,启动后发现lombok报错,首先coc-java-lombok必须安装,没装的可以装一下
1CocInstall coc-java-lombok
然后安装OpenJDK,这个已验证必须使用OpenJDK才能解决这个问题。最后清理一下项目,很多人发现改完也没有效果,就是因为没有清理:
1CocCommand java.clean.workspace
rust-泛型generics
泛型(generics)rust 也有泛型,这种最早出现1970年代的Ada语言中,后来被许多基于对象和面向对象的语言所采用,包括BETA、 C++、java。rust 也借鉴了这一特性。这种特性让程序有更好的通用性。
1.简单示例-结构体泛型给结构体 Point 定义一个泛型 T
123456789struct Point<T> { x: T, y: T,}fn main() { let integer = Point { x: 5, y: 10 }; let float = Point { x: 1.0, y: 4.0 };}
不同类型泛型
12345678910struct Point<T, U> { x: T, y: U,}fn main() { let both_integer = Point { x: 5, y: 10 }; let both_float = Point & ...