2021-06-23-gossipsub-v1.1

2021-06-23-gossipsub-v1.1 gossipsub v1.1: Security extensions to improve on attack resilience and bootstrapping Block Chain Lotus gossipsub v1.1: Security extensions to improve on attack resilience and bootstrapping v1.1 是对 v1.0 的扩展,改善了引导和协议康攻击性,完全兼容 v1.0。 协议扩展 显式对等协定 现在的协议(GossipSub)支持节点操作间现式的对等协定。应用程序可以指定一个 peers 列表,保持连接并无条件地将消息传递给彼此,而不受对等点评分系统和其他防御措施的影响。对于每个显式 peer,路由器必须建立并维护一个连接。连接最初是在路由器启动时建立的,如果连接丢失,则定期检查连接和重新连接。建议的连接检查时间为5分钟。显式的对等点存在于网格(即 full-message 组成的网络)之外: 每个新的有效传入消息都被转发给直接的对等点,并且传入的 rpc 总是被它们接受。在显式对等点上进行 GRAFT 是错误的,应该用 PRUNE 记录并拒绝这种尝试。 修剪退避和对等交换 GossipSub 依赖环境中的 peer 发现,以便在感兴趣的话题中找到 peer。这给实现可扩展的 peer 发现服务带来了压力,该服务可以支持该协议。有了 Peer Exchange,该协议现在可以从一小部分节点启动,而不依赖外部的 peer 发现服务。对等体交换(PX)在因超额订阅而修剪网状结构时起作用。修剪的 peer 不是简单地告诉被修剪的 peer 离开,而是提供一组其他peer,被修剪的 peer 可以连接到这些 peer,以重建其网格。 此外,被修剪的 peer 和修剪的 peer 都会从对方那里增加一个退避期,在这个退避期内它们不会尝试重新嫁接。修剪 peer 和被修剪 peer 都将在后退期内立即修剪 GRAFT 并延长后退期。当一个 peer 试图过早地重新嫁接时,修剪 peer 可以对该行为进行行为惩罚,并通过P₇对 peer 进行惩罚。 ...

January 16, 2026

2021-06-22-gossipsub-v1.0

2021-06-22-gossipsub-v1.0 gossipsub v1.0: An extensible baseline pubsub protocol Block Chain Lotus gossipsub v1.0: An extensible baseline pubsub protocol In the beginning was floodsub 在 GossipSub 实现前,使用的是 floodSub。它的传播策略非常简单,洪泛淹没。每个 peer 直接向特定主题的每个 peer 传递完整数据。 优势: 直接实现 数据延迟低 稳定,需要维护的状态少 劣势: 没有边界 带宽需求高 大量 peer 扩展成本高 gossipsub: The gossiping mesh router 流言网状路由。几个关键点的解释: 流言:同一个主题内,有部分peer知道完整的信息,同时peer会向其他peer发送IHAVE信息,就像是流言蜚语一样,其他接收到的peer如果一直没听到流言,可以反过去询问消息(发送IWANT信息)。最后整个主题下的 peer 都知道该完整信息,但传递的过程进行了简化,peer 不会听到太多重复的流言。 网状:对于单个 peer 来说,它与其他的 peer 的连接形成了一张网 路由:每个 peer 在节点中的功能相对复杂了很多,同时需要实现路由的功能(选择传递完整信息给哪些peer) Parameters GossipSub 可配置参数。 参数 用途 默认值 D 网络期待传播度 6 D_low 网络传播度下限 4 D_high 网络传播度上限 12 D_lazy (可选)流言传播度 D heartbeat_interval 心跳间隔 1 second fanout_ttl fan-out生存周期 60 seconds mcache_len 消息缓存中历史窗口的数量 5 mcache_gossip 发出流言时使用的历史窗口数 3 seen_ttl 缓存所见消息ID的过期时间 2 minutes Router State peering stat state related to the message cache peering stat peers:一组所有支持 gossipsub 或 floodsub 的已知 peer 的 id mesh:一个订阅的主题与该主题的覆盖网中的 peer 集合的映射 fanout:与mesh类似,但映射包含我们没有订阅的话题 Message Cache 消息缓存(或称mcache)是一个数据结构,用于存储消息ID和其相应的消息,被分割成 “历史窗口”。每个窗口对应一个心跳间隔(heartbeat_interval),窗口在流言传播后的心跳过程中被移位。历史窗口的数量由 mcache_len 参数决定,而传播流言时检查的窗口数量则由 mcache_gossip 控制。 ...

January 16, 2026

2021-06-21-gossipsub-quickstart

2021-06-21-gossipsub-quickstart [[Block Chain]] Lotus 流言订阅机制。 publish-subscribe peer-to-peer pub/sub system 设计目标 Reliability(可靠): All messages get delivered to all peers subscribed to the topic. Speed(快速): Messages are delivered quickly. Efficiency(高效率): The network is not flooded with excess copies of messages. Resilience(高弹性): Peers can join and leave the network without disrupting it. There is no central point of failure. Scale(大规模): Topics can have enormous numbers of subscribers and handle a large throughput of messages. Simplicity(简单): The system is simple to understand and implement. Each peer only needs to remember a small amount of state. Discovery peer Distributed hash tables:分布式哈希表 Local network broadcasts:本地网络广播 Exchanging peer lists with existing peers:与现有对等体交换对等体名单 Centralized trackers or rendezvous points:集中式跟踪器或会合点 Lists of bootstrap peers:引导性对等体的列表 Types of peering(对等互联的分类) ...

January 16, 2026

2023-05-17-vultr服务器以及服务转移

2023-05-17-vultr服务器以及服务转移 [[VPS]] 为什么要迁移服务器? 国内邮箱不安全,使用国外邮箱重新注册 绑定了国内的地址,有点风险 迁移一共分三步骤: 迁移服务器 迁移域名 迁移服务 vultr 安装 shadowsocket 服务 关闭 vultr 服务器的防火墙 使用 vultr 提供的防火墙服务 一键安装 shdowsockets https://itlanyan.com/on-fuck-gfw-again/ 开启 vultr 相关端口 centos 开启 swap https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-centos-7 golang sqlite https://earthly.dev/blog/golang-sqlite/

January 16, 2026

2023-05-23-clash导向流量配置说明

2023-05-23-clash导向流量配置说明 VPS [[VPN]] clash premium 配置并将所有流量导向指定服务器 事情的起因在于我的 vps 的地址被墙了,更换 ip 或者换新机器属于是费钱又费力,谁也无法保证墙会不会继续发疯,所以有了该篇。 目的主要有两个: 能够在国内访问到互联网 访问的终端 IP 保持固定,避免 IP 漂移,避免触发部分网站的风控 主要参考以下两个链接,建议先进行阅读: 科学上网工具-免费的Clash代理工具使用、配置及需要避免的坑经验总结 Loyalsoldier/clash-rules clash premium 是闭源软件,介意的可以去更换 Dreamacro/clash 。在这篇里主要用到了 rule-providers 这个特性,使用开源版本需要手动的配置 rule 信息。 clash 不做太多的介绍,了解更多查看 clash doc。 clash 通过配置文件进行驱动,主要分四块内容: 基本配置,端口、运行模式、日志等级等等 代理节点信息 代理规则(代理分组)配置 rule 配置 “代理节点信息”就是流量服务器的具体信息,通过它可以连接到该服务器;“代理规则”配置就是组织“代理节点信息”,通过不同的需求配置不同的节点;“rule 配置”就是根据“欲访问的网站”和“代理规则”之间的联系进行数据分发。 当你想要访问 google.com 的时候,先通过 “rule 规则”确定使用哪一个 “代理规则”,“代理规则”再去确认使用哪一个“代理节点”。 配置文件 #---------------------------------------------------# ## 配置文件需要放置在 $HOME/.config/clash/*.yaml ## 如果您不知道如何操作,请参阅 官方Github文档 https://github.com/Dreamacro/clash/blob/dev/README.md #---------------------------------------------------# port: 7890 socks-port: 7891 # RESTful API for clash external-controller: 127.0.0.1:9090 allow-lan: true mode: rule log-level: warning proxies: - name: "Static_Node" type: ss server: xxx.xxx.xxx.xxx port: 1080 cipher: aes-256-cfb password: $PASSWORD proxy-providers: Airport: type: http url: https://airport.com path: ./Proxy/airport.yml interval: 86400 health-check: enable: false interval: 600 url: https://www.gstatic.com/generate_204 proxy-groups: - name: Relay-Proxy type: select proxies: - Private Relay - DIRECT - name: Private Relay type: relay proxies: - 机场们 - Static_Node - name: 机场们 type: select use: - Airport rule-providers: reject: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt" path: ./ruleset/reject.yaml interval: 86400 icloud: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt" path: ./ruleset/icloud.yaml interval: 86400 apple: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt" path: ./ruleset/apple.yaml interval: 86400 google: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt" path: ./ruleset/google.yaml interval: 86400 proxy: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt" path: ./ruleset/proxy.yaml interval: 86400 direct: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt" path: ./ruleset/direct.yaml interval: 86400 private: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt" path: ./ruleset/private.yaml interval: 86400 gfw: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt" path: ./ruleset/gfw.yaml interval: 86400 tld-not-cn: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt" path: ./ruleset/tld-not-cn.yaml interval: 86400 telegramcidr: type: http behavior: ipcidr url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt" path: ./ruleset/telegramcidr.yaml interval: 86400 cncidr: type: http behavior: ipcidr url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt" path: ./ruleset/cncidr.yaml interval: 86400 lancidr: type: http behavior: ipcidr url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt" path: ./ruleset/lancidr.yaml interval: 86400 applications: type: http behavior: classical url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt" path: ./ruleset/applications.yaml interval: 86400 rules: - RULE-SET,applications,DIRECT - DOMAIN,clash.razord.top,DIRECT - DOMAIN,yacd.haishan.me,DIRECT - RULE-SET,private,DIRECT - RULE-SET,reject,REJECT - RULE-SET,icloud,DIRECT - RULE-SET,apple,DIRECT - RULE-SET,google,Relay-Proxy - RULE-SET,proxy,Relay-Proxy - RULE-SET,direct,DIRECT - RULE-SET,lancidr,DIRECT - RULE-SET,cncidr,DIRECT - RULE-SET,telegramcidr,Relay-Proxy - GEOIP,LAN,DIRECT - GEOIP,CN,DIRECT - MATCH,Relay-Proxy 配置分析 port: 7890 socks-port: 7891 # RESTful API for clash external-controller: 127.0.0.1:9090 allow-lan: true mode: rule log-level: warning 上面的是基础信息,没什么好解释的。 ...

January 16, 2026

2019-01-03-argparse学习

argparse 学习记录 一、什么是 argparse? argparse 是 [[Python]] 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息。 2019-01-03-argparse学习 它可以快速的处理错误的参数提供(默认输出 help 信息),也可以快速的提供用户定义的帮助信息。 二、简单使用 创建 ArgumentParser() 对象 调用 add_argument() 方法添加参数 使用 parse_args() 解析添加的参数 # -*- coding: utf-8 -*- import argparse parser = argparse.ArgumentParser() parser.add_argument('integer', type=int, help='display an integer') args = parser.parse_args() print args.integer 三、定位参数 定位参数就是必然需要一个参数,并且根据 add_argument 语句的位置而确定,即如果定义了两个定位参数,则命令行必须提供两个参数,并且根据顺序赋值。 # 定位参数名不带‘-’或‘--’, # type 即定位给的参数的类型, # help 即可在命令行 -h 自动调用 parser.add_argument('integer', type=int, help='display an integer') 调用方式: python test.py 3 四、可选参数 中文名叫可选参数,有两种方式: ...

January 16, 2026

2019-01-01-一些技巧

2019-01-01-一些技巧 这里是工作中,学习中遇到的一些痛点技巧,难度不大,但是很杂,先记个笔记做下索引搜索,等技巧多了,可以写个工具集。 [[Linux]] [[Python]] [[Shell]] [[Git]] Linux方面 设置dns echo 'nameserver 114.114.114.114' >> /etc/resolv.conf service network restart ping smtp.163.com 类似于Windows下的tree指令 find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g' 杀死多进程 # 主要是xargs的使用 ps -aux|grep $keyword|grep -v grep | awk '{print $2}' | xargs kill -9 查看指定端口状态 lsof -i:port netstat -anp|grep port 统计字符出现的次数 grep -o objStr filename|wc -l grep -o 'objStr1\|objStr2' filename|wc -l 统计文件夹下的文件数目 # 统计当前目录下文件的个数(不包括目录) ls -l | grep "^-" | wc -l # 统计当前目录下文件的个数(包括子目录) ls -lR| grep "^-" | wc -l # 查看某目录下文件夹(目录)的个数(包括子目录) ls -lR | grep "^d" | wc -l 查找文件内容 # 查找某文件中的xxx grep 'xxx' filename # 查找当前文件夹中的所有文件中的xxx find . |xargs grep 'xxx' 获取终端宽度 $ echo $LINES # 查看终端的高度 $ echo $COLUMNS # 查看终端的宽度 $ tput lines # 查看终端的高度 $ tput cols # 查看终端的宽度 $ stty size # 同时返回高度和宽度 $ resize [-cu][-s <列数> <行数>] ## -c 就算用户环境并非C Shell,也用C Shell指令改变视窗大小。 ## -s <列数> <行数> 设置终端机视窗的垂直高度和水平宽度。 ## -u 就算用户环境并非Bourne Shell,也用Bourne Shell指令改变视窗大小。 >>> import shutil >>> res = shutil.get_terminal_size() >>> print(res.lines, res.columns) # 输出终端的高度和宽度 查看内核版本和发行版本 $ uname -a # 内核版本 $ cat /etc/redhat-release # 查看 Redhat 发行版 $ cat /etc/issue # 查看 Ubuntu 发行版 在 Ubuntu 中使用 NTP 进行时间同步 https://linux.cn/article-8091-1.html ...

January 16, 2026

【翻译】编写一个小型静态网站生成器

Python 【翻译】编写一个小型静态网站生成器 大概有一百多种用 Python 编写的静态站点生成器(甚至还有其他语言编写的静态站点生成器)。 所以我决定写我自己的。为什么?好吧,我只是想。我希望将自己的博客从Ghost移开,并且希望保持真正的简约性。我决定使用 GitHub Pages 托管,因为他们最近宣布支持 自定义域的SSL。 渲染内容 每个静态网站生成器都需要采用某种源格式(例如 Markdown 或 ReStructuredText)并将其转换为 HTML。自从我离开 Ghost 以来,我决定坚持 Markdown。 自从我最近将 Github风格的Markdown渲染 集成到 Warehouse 中以来,我决定使用 cmarkgfm 。使用以下方式将 Markdown 渲染为 HTML: import cmarkgfm def render_markdown(content: str) -> str: content = cmarkgfm.markdown_to_html_with_extensions( content, extensions=['table', 'autolink', 'strikethrough']) return content cmarkgfm 确实有一个名为 github_flavored_markdown_to_html 的便捷方法,但是它使用 GitHub 的 tagfilter 扩展名,当我要将脚本和内容嵌入到帖子中时,这是不希望的。因此,我只是选择了我想使用的扩展。 收集资源(所有文档) 好的,我们有一种渲染 Markdown 的方法,但是我们还需要一种收集所有源文件的方法。我决定将所有来源存储在 ./src。我们可以pathlib用来收集它们: import pathlib from typing import Iterator def get_sources() -> Iterator[pathlib.Path]: return pathlib.Path('.').glob('srcs/*.md') 头部元数据 许多静态网站生成器都有 “前题” 的概念-一种为每个源文件设置元数据等的方法。我想支持 frontmatter,让我为每个帖子设置日期和标题。看起来像这样: --- title: Post time date: 2018-05-11 --- # Markdown content here. 对于 frontmatter 有一个非常好的和简单的现有库,称为 python-frontmatter。我可以用它来提取前题和原始内容: ...

【转载】curl的简介和使用

[[Linux]] [[cURL]] 【转载】curl的简介和使用 本文转载自curl网站开发指南,做了很小的改动,遵从自由转载原则。 What’s curl used for? curl is used in command lines or scripts to transfer data. It is also used in cars, television sets, routers, printers, audio equipment, mobile phones, tablets, settop boxes, media players and is the internet transfer backbone for thousands of software applications affecting billions of humans daily. curl是一个被用在命令行或者脚本中,用来传输数据的工具。它还被运用于 🚗 上,📺 上,路由器上,🖨️ 上,音响设备上,📱 上,平板电脑上,机顶盒上,媒体播放器上,以及数以万计,影响着上百万年的人们日常生活的基于网络的软件。 curl 是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。 它支持多种协议,下面举例讲解如何将它用于网站开发。 一、查看网页源码 直接在 curl 命令后加上网址,就可以看到网页源码。我们以网址 www.sina.com 为例(选择该网址,主要因为它的网页代码较短): $ curl www.sina.com ...

【转载】Linux Locale 设置

Linux 【转载】Linux Locale 设置 说明: Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。 如果 Linux 机器上出现字符乱码的问题,可以优先确定是否因为 Locale 设置不对而导致的,其次再去排查文件本身编码问题。 Locale 分类 - LC_CTYPE:语言符号及其分类 - LC_NUMERIC:数字 - LC_COLLATE:比较和排序习惯 - LC_TIME:时间显示格式 - LC_MONETARY:货币单位 - LC_MESSAGES:信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等 - LC_NAME:姓名书写方式 - LC_ADDRESS:地址书写方式 - LC_TELEPHONE:电话号码书写方式 - LC_MEASUREMENT:度量衡表达方式 - LC_PAPER:默认纸张尺寸大小 - LC_IDENTIFICATION:Locale 对自身包含信息的概述 $ locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF- 8" #用户所使用的语言符号及其分类 LC_NUMERIC="en_US.UTF- 8" #数字 LC_TIME="en_US.UTF-8" #时间显示格式 LC_COLLATE="en_US.UTF-8" #比较和排序习惯 LC_MONETARY="en_US.UTF-8" #LC_MONETARY LC_MESSAGES="en_US.UTF- 8" #信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等 LC_PAPER="en_US.UTF- 8" #默认纸张尺寸大小 LC_NAME="en_US.UTF-8" #姓名书写方式 LC_ADDRESS="en_US.UTF-8" #地址书写方式 LC_TELEPHONE="en_US.UTF-8" #电话号码书写方式 LC_MEASUREMENT="en_US.UTF-8" #度量衡表达方式 LC_IDENTIFICATION="en_US.UTF-8" #对自身包含信息的概述 LC_ALL= Locale 文件位置 Locale 定义文件在 /usr/share/i18n/locales Locale 用户定义文件在 /usr/lib/locale/ Locale 设定的优先级关系 设定 Locale 就是设定 12 大类的 Locale 分类属性,即12个LC_*。 ...