阅读视图

发现新文章,点击刷新页面。
🔲 ☆

当下流动性池分析

在去中心化金融(DeFi)生态中,流动性池是自动做市商(AMM)机制的核心组成部分。它允许用户通过提供资产来赚取费用,同时为交易者提供即时交换服务,而无需依赖传统的订单簿。流动性池的设计直接影响交易滑点、资金效率和流动性提供者(LP)的风险回报比。随着 DeFi 的演进,不同协议不断优化池子模型,以应对永久性损失(Impermanent Loss, IL)、滑点和多资产支持等问题。本文将分析当下几个主流流动性池协议,包括 Uniswap V3、Balancer、Curve 和 Bancor V3。我们将通过通俗的解释、类比和 Python 代码模拟来剖析其原理,帮助读者理解这些机制如何在实际中运作。所有模拟均基于简化假设,旨在说明核心概念,而非精确预测。

🔲 ☆

Uniswap V4:更灵活、更高效的去中心化交易所

如果你是个 DeFi 爱好者,或者刚入门 Web3,肯定听说过 Uniswap 这个去中心化交易所(DEX)。它从 V1 到 V3 一步步进化,现在 V4 又带来了革命性的变化。简单来说,Uniswap V4 继承了 V3 的集中流动性模型,但引入了 hooks、单例架构等创新,让它变得更 customizable、更 gas 友好。

相信我,它真的很容易懂。我们会先快速回顾 Uniswap V3 的核心概念,让即使不懂 V3 的新人也能快速上手,然后拆解 V4 是什么,和 V3 的区别在哪里。文章会用 Python 代码来模拟原理,但别担心,我不会直接扔代码给你看。先用文字描述过程和原理,再给出代码,让你边看边理解。建议你本地跟着敲代码,实践出真知!如果 Python 不熟,用 ChatGPT 帮你翻译下注释就好。

最后,我们会用一个表格总结 V3 和 V4 的区别。

🔲 ☆

JS PageSwap PageReveal事件干嘛用的?

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=11717
本文可全文转载,但需要保留原作者、出处以及文中链接,AI抓取保留原文地址,任何网站均可摘要聚合,商用请联系授权。

JS PageSwap PageReveal事件封面图

一、总算有点眉目了

PageSwapEvent事件是一个新支持的全局事件,其兼容性如下:

PageSwapEvent事件

目前Safari和Chrome均支持此事件类型。

乍一看,这个事件与页面选项卡切换相关,对吧,Swap就是交换的意思,但是,如果你在页面中写下类似这样的测试代码,是看不到任何效果的。

window.addEventListener("pageswap", (event) => {
  console.log(event);
});

怎么回事,难道这个事件不是这样执行的?对,没错,不是这样执行的。

这个事件必须与页面级可视动画View Transitions API一同使用才有效果。

不知大家阅读过之前这篇热文没有:“页面级可视动画View Transitions API初体验

其中展示了一个案例,就是页面A调整到页面B(直接刷新的那种跳转),也是可以有transition过渡效果的。

这里有演示页面,您可以狠狠地点击这里:传统跳转页面变得单页一样滑来滑去demo

页面滑来滑去示意

而JS PageSwapEvent事件就是为了这个交互场景而设计的。

二、PageSwap事件语法与作用

如果我们的Web页面设置了页面级别的view-transition,包含下面这段CSS代码:

@view-transition {
  navigation: auto;
}

那么当页面准备卸载(unload)的时候,pageswap实践就会触发。

如果仅仅是普通的页面跳转,是不会有事件触发的。

我们可以对比下效果,比方说这个测试页面:纯粹的页面刷新跳转demo

页面中设置了pageswap事件代码:

window.addEventListener("pageswap", (event) => {
  console.log(event);
});

但是,我们点击链接跳转的时候,只有导航提示,并没有任何console输出,如下截图所示:

普通跳转控制台提示

但是,如果是上面的滑来滑去demo,我们可以在控制台看到PageSwapEvent对象的输出(需要开启Preserve log选项),如下图所示:

pageSwap对象输出截图示意

所以,PageSwapEvent事件是伴随View Transitions API一同出现的事物。

语法

PageSwapEvent对象支持两个只读属性,分别是:

activation
包含一个NavigationActivation对象,该对象包含同一源导航的导航类型以及当前和目标文档历史条目。如果导航在重定向链中的任何位置都有跨源URL,则返回null
viewTransition
返回表示入站跨文档视图转换的ViewTransition对象(如果事件触发时有一个处于活动状态)。若非如此,则返回null。

至于返回对象的细节,这里不深入。

三、PageReveal事件表示进入

pageswap表示当前页面离开,那么进入则是PageReveal事件。

window.addEventListener("pagereveal", (event) => {
  console.log(event);
});

pagereveal对象展示

不过语法上有所区别,仅支持viewTransition这个只读属性:

viewTransition
包含一个ViewTransition对象,表示跨文档导航的活动视图转换。

其他就没什么好讲的了。

三、好了,了解这么多足够了

一方面受制于兼容性,另一方面受制于PageSwapEvent事件的小众应用场景,再一方面受制于前端行业进入稳定期,再再一方面由于AI的出现,注定PageSwap事件是个很少有人会真正在生产环境使用的特性。

冷门知识,小众特性,虽然有设计价值,但注定无人问津。

大家了解下有这么个东西就好了。

其他就没什么好说的了,感谢大家的阅读,我们下一篇文章再见。

😉😊😇
🥰😍😘

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=11717

(本篇完)

🔲 ⭐

Web3 金融的基石 - Swap 和 Staking

web3 是一个非常流行的概念,它的基础是区块链技术。区块链技术是一种分布式账本技术,它的特点是去中心化、不可篡改、安全可靠。区块链技术的应用场景非常广泛,比如数字货币、智能合约、供应链金融等等。

网上关于区块链的资料非常多,但是从零开始构建的资料却很少。熟悉我的朋友应该知道,我经常从零实现一些东西帮助我理解,比如从零实现 git,从零实现 webpack 打包器,从零实现一个框架等等。

本文就是继上一篇 《从零开始构建区块链》 的文章,讲述什么是 swap,什么是滑点,什么是 staking,背后原理又是怎么样的?

🔲 ⭐

Debian / Ubuntu 创建、挂载 swap 分区文件

Debian 系推荐使用swap文件当作交换分区,无需像以往一样需要单独在磁盘上创建一个swap分区。 所以本文将使用swap文件来当作交换分区,步骤如下: 检查系统是否已经有 Swap 分区: lsw@rangotec.com:~$ swapon -s Filename Type Size Used Priority /swapfile file 8388604 0 -2 如上,则说明已经有交换分区了,或者: lsw@rangotec.com:~$ free -h total used free shared b […]

Debian / Ubuntu 创建、挂载 swap 分区文件最先出现在千古八方的博客

🔲 ☆

从 Manjaro 迁移到 Arch Linux

今天我把系统换成了 Arch Linux,用的是 Btrfs 文件系统,套上 LUKS 加密(加密包括 /boot)。由于我已经在虚拟机里面实验过整个过程,所以今天的安装过程非常顺利,一共只用了一两个小时。

背景

前几天用 btrfs-convert 把我的 Manjaro 的文件系统换成了 Btrfs,然后继续开发我的 Btrfs 快照管理工具 dosnap。奇怪的是,在出错的时候(如 panic!)程序不会退出 ,而是直接卡住。这还不是最致命的,过了几秒钟我发现我的 polybar 不见了,然后发现我的家目录里少了一些东西,包括 ~/.config。还好我之前有做快照,可以直接用 rsync 恢复数据。但是在我的一个 Arch Linux 虚拟机中程序如果出错会正确退出。不知道是为什么,可能是 btrfs-convert 的什么 bug。然后就想到用 Arch 虚拟机也有很长时间了,于是打算直接把物理机也换到 Arch Linux 上来。

备份

可以使用 Btrfs 的 send/receive 功能进行备份。注意备份的移动硬盘也需要是 Btrfs 文件系统。先对各个子卷做只读快照,然后对每个快照进行 btrfs send

sudo btrfs send /mnt/_snapshots/${SNAPSHOT_NAME?} | sudo btrfs receive ${EXTERNAL_DRIVE?}

然后再记录一下安装过的软件:

pacman -Qe >${EXTERNAL_DRIVE?}/pacman-qe

安装

启动 archiso,然后调整一下终端字体

setfont ter-v28b

Installation Guide

打开 installation guide,一直做到 Partition the disks 之前。

由于磁盘已经分区,所以不需要再分区了。直接上 LUKS 并格式化为 Btrfs。注意需要用 luks1,因为 GRUB 目前还不支持 LUKS2。

cryptsetup --type luks1 luksFormat /dev/nvme0n1p4
cryptsetup open /dev/nvme0n1p4 archlinux
mkfs.btrfs -L archlinux /dev/mapper/archlinux

然后创建子卷并挂载分区

mount /dev/mapper/archlinux /mnt
btrfs subv create /mnt/@
btrfs subv create /mnt/@home
btrfs subv create /mnt/@opt
btrfs subv create /mnt/@var
umount /mnt

opt='noatime,ssd,space_cache=v2,compress=zstd'
mount -o $opt,subvol=@ /dev/mapper/archlinux /mnt
mkdir /mnt/{efi,var,home,opt}
mount /dev/nvme0n1p1 /mnt/efi
mount -o $opt,subvol=@home /dev/mapper/archlinux /mnt/home
mount -o $opt,subvol=@opt /dev/mapper/archlinux /mnt/opt
mount -o $opt,subvol=@var /dev/mapper/archlinux /mnt/var

/var/log/journal 禁用 CoW:

mkdir -p /mnt/var/log/journal
chattr +C /mnt/var/log/journal

然后从 installation guide 的 Installation 一节开始继续一直做到结尾,记得要在 pacstrap 的时候加上 btrfs-progs

额外的操作

安装到这里还需一些额外的操作。更改 /etc/mkinitcpio.confBINARIES,然后在 HOOKS 中的 filesystems 之前加入 encrypt

BINARIES=(/usr/bin/btrfs)
HOOKS=(base udev autodetect modconf block encrypt filesystems keyboard fsck)

然后重新生成 initramfs

mkinitcpio -P

更改 /etc/default/grub 中的内核命令行,这里我还顺便打开了 cgroup v2。 PARTUUID 可以使用 blkid 命令查看。

GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet systemd.unified_cgroup_hierarchy=1"
GRUB_CMDLINE_LINUX="cryptdevice=PARTUUID=xxx:archlinux"

同步家目录

新建用户,并从备份中用 rsync 把家目录同步回来:

# run as wang
rsync -a ${EXTERNAL_DRIVE?}/home-snap/wang/* ~
rsync -a ${EXTERNAL_DRIVE?}/home-snap/wang/.* ~

安装软件包

安装我自己常用的软件

cd ~/.dotfiles/weirane-dotfiles-deps
makepkg -si

用下面的命令查看有哪些之前安装过而不在本机上的包,然后选择要安装的包并安装。

comm -23 <(cut -d' ' -f1 ${EXTERNAL_DRIVE?}/pacman-qe | sort) \
         <(pacman -Qq | sort) | less

配置

下面进行一些增加安全性或者便携性的配置。

加密 swap

为防止关机后 swap 中残留明文的内存数据,需要将 swap 加密。我不需要 hibernation,所以参考 ArchWiki,将以下内容加入 /etc/crypttab

swap  PARTUUID=xxx  /dev/urandom  swap,cipher=aes-xts-plain64,size=512

将原来 /etc/fstab 中 swap 的一行改为

/dev/mapper/swap        none            swap            defaults        0 0

Key in initramfs

可以在 initramfs 中放一个 LUKS key,这样在开机的时候就不需要输两次 LUKS 密码了。我一般将 key 放在 /etc 中。注意要调整 key file 和装有 key file 的 initramfs 的权限。

sudo dd bs=512 count=4 if=/dev/urandom of=/path/to/key
sudo cryptsetup luksAddKey /dev/nvme0n1p4 /path/to/key
chmod 000 /path/to/key
chmod -R g-rwx,o-rwx /boot

把 key 加入 /etc/mkinitcpio.conf 中的 FILES

FILES=(/path/to/key)

/etc/default/grub 中的内核命令行,加入 cryptkey=rootfs:/path/to/key

GRUB_CMDLINE_LINUX="cryptdevice=PARTUUID=xxx:archlinux cryptkey=rootfs:/path/to/key"

最后重新生成 initramfs 和 GRUB config

sudo mkinitcpio -P
sudo grub-mkconfig -o /boot/grub/grub.cfg

解决问题

xbacklight

进入图形界面后发现 polybar 中的亮度模块没有显示,xbacklight 命令没有输出。参考 ArchWiki 之后发现应该安装 xf86-video-intel 并将下面的配置写入 /etc/X11/xorg.conf.d/20-xbacklight.conf

Section "Device"
    Identifier  "Intel Graphics"
    Driver      "intel"
    Option      "Backlight"  "intel_backlight"
EndSection

redshift 无法使用 geoclue

运行 redshift 有如下报错

Trying location provider `geoclue2'...
Using provider `geoclue2'.
Using method `randr'.
Waiting for initial location to become available...
Unable to start GeoClue client: GDBus.Error:org.freedesktop.DBus.Error.AccessDenied: 'redshift' disallowed, no agent for UID 1000.
Access to the current location was denied by GeoClue!
Make sure that location services are enabled and that Redshift is permitted
to use location services. See https://github.com/jonls/redshift#faq for more
information.
Unable to get location from provider.

查阅 ArchWiki,将以下内容写入 ~/.config/systemd/user/geoclue-agent.service

[Unit]
Description=redshift needs to get a (geo)clue

[Service]
ExecStart=/usr/lib/geoclue-2.0/demos/agent

[Install]
WantedBy=default.target

运行命令 systemctl --user enable --now geoclue-agent.service 之后就可以使用 redshift 了。

~/.cache 单独分为一个子卷

我现在对我的家目录每两小时进行快照,用了一段时间后发现每个快照都有至少 30 MB 的 exclusive data。比较后发现主要是 ~/.cache 中的数据,所以想把它单独分为一个子卷。

登出当前用户,并在 tty 登陆 root 用户。把 ~/.cache 这个目录空出来,并创建子卷

cd /home/wang
mv .cache .cache2
btrfs subv create /home/wang/.cache

然后把数据复制回来,再恢复权限。

cp -a --reflink .cache2/* .cache
chown wang:wang .cache
rm -r .cache2

分开 ~/.cache 之后每两小时快照的 exclusive data 基本上在 20 MB 之下,效果还可以。

总结

整个过程挺顺利的,现在应该只剩一些之前在 /etc 中的配置没来得及同步了。由于家目录是直接 rsync 过来的,所以所有的数据都还在,家目录中的程序的配置也没有丢失, firefox 等程序也不需要重新登录或者进行其它的配置。

参考

❌