当前位置: 首页 > news >正文

深入探索STARK的安全性和可靠性——STARKs全面安全分析

1. 引言

  • non-interactive STARKs,起源于Interactive Oracle Proofs (IOPs),然后通过random oracle模式转换为非交互式。
  • StarkWare团队 ethSTARK Documentation – Version 1.2(2023年7月)论文做了更新,给出了完整具体的random oracle模式下的ethSTARK安全性分析。本文对该论文的更新做了解释。

2. STARK安全性解释

STARK proof system (Scalable Transparent Argument of Knowledge)是用于证明计算完整性(CI,computational integrity)的强大工具:

  • 支持以trustless方式,来验证基于某公开数据的计算的正确性。

本文深入探索由STARK proofs所提供的安全性,对该安全性进行定义,并探索证明方案安全性的技术。
详情见:

  • StarkWare团队 ethSTARK Documentation – Version 1.2(2023年7月)论文第6章。
  • Justin Thaler等人2023年论文Fiat-Shamir Security of FRI and Related SNARKs。

我们试图通过安全分析实现什么?:

  • 试图找到一种对STARK系统的“成功攻击”方式,使得对于某false statement,可生成让STARK Verifier 接受的 STARK proof。

由于false statement是危险的,可能具有任意大小和形状,而所构建的STARK系统是希望能抵御 所有 false statement的。

任何false statement,哪怕是1+1=3,若可基于该false statement生成让STARK Verifier信服的STARK proof,则可认为是对该STARK系统的成功攻击。(有密码学背景的人可能会对,STARK所满足的更强安全概念——“knowledge soundness”,感兴趣。为简化表述,本文关注更简单的soundness。“knowledge soundness”知识具体可参见Eli Ben-Sasson等人2016年论文 Interactive Oracle Proofs。)

如何来正式定义某STARK系统的安全性呢?:

  • 通过粗略计算,攻击者构建成功攻击所需的“cost(开销)”,来分析“soundness error”。即,找到某能让STARK Verifier接受的 false statement的 STARK proof。
  • 从数学上说,“soundness error”对应为某函数 ( t ) (t) (t)
    • 其输入为时间参数“ t t t”,代表攻击者发起攻击所需的计算时长。
    • 其输出为攻击者攻击成功的概率。所谓攻击成功,是指找到了某false statement让人信服的proof。
    • 若攻击者愿意花费的“cost(开销)” t t t越大,则其攻击成功的概率将增加。

为此,可将STARK安全性定义为函数 ( t ) (t) (t)

  • 其不同于在crypto Twitter上讨论安全性的自然方式。

如,对于“本方案具有96位安全性”这样的陈述,如何将其转换为安全性定义?
答案是不唯一的,因为人们对“ x x x-位安全性”的理解有细微差异:

  • 1)版本1:严格意义上来说:是指,对于任意的 t ∈ [ 1 , 2 96 ] t\in[1,2^{96}] t[1,296],该soundness error为 ( t ) 2 96 (t)2^{96} (t)296。即,对于任意运行时长最多为 2 96 2^{96} 296的攻击者,其成功的概率很小,小于 2 96 2^{96} 296——即小于 “10亿✖️10亿✖️10亿”。
  • 2)版本2:宽松意义上来说(或是更通用版本): 96 96 96-位安全性,是指对于任意的 t t t,对 t / ( t ) 2 96 t/(t) 2^{96} t/(t)296其成立。即意味着,成功概率与运行时长呈(inverse)线性关系。如,某攻击者的运行时长为 2 86 2^{86} 286,则其成功的概率最多为 2 10 2^{10} 210

本文基于上面的版本2来分析。

3. 由IOPs 到 具有96-位安全性的STARKs

如何来证明某方案具有96位安全性呢?
需先理解如何构建STARKs的高层结构。

STARK主要有3大要素:

  • 1)an IOP(interactive oracle proof)
  • 2)a Merkle tree
  • 3)a Fiat-Shamir hash

一旦定义了这3大要素,就可将其编译生成某STARK

本文主要关注IOP。同时将详细说明这3大要素,以及如何将它们组合在一起。

3.1 IOP

IOP类似于表中的interactive proof,其中某Prover和Verifier多轮交互。(本文限定为public-coin协议,即Verifier仅需给Prover发送random challenges)。

在IOP中,Verifier不读取完整的Prover消息,而是仅从每个Prover消息中采样少量bits。从而可实现后续编译出的STARK的简洁性。

3.2 由IOP到STARK

有IOP之后,如何基于该IOP构建某STARK呢?

  • Prover消息可能很长(事实上,其要长于计算本身)。
  • 为压缩消息,会使用Merkle tree。
    • Merkle tree是二进制哈希tree,每个叶子节点代表IOP的某query或某answer。
    • Merkle tree root为对整个消息的承诺值。
    • 当Verifier想要读取该消息的某特定位置时,Prover会提供该位置的值以及相应的认证路径。Verifier可使用该路径来验证该值的正确性。
    • IOP Verifier仅需读取Prover消息的少量位置。从而使用Merkle tree构建了succinct且具有少量通讯的协议。

4. Compressing Rounds

在这里插入图片描述
对于交互式STARK,为简化流程,通常会将其转换为非交互式的,这样在构建时Prover就无需再等待外部消息。事实上,当前所部署的所有STARK系统,包括ethSTARK协议,都是非交互式STARK。

非交互式STARK也是transparent SNARKs的一个特例(所谓transparent,是指在实例化时无需trusted setup,又名“Arthur Merlin protocol”或“public coin IOP”)。最终,最后一步是应用Fiat-Shamir来将rounds压缩为单个消息,称其为STARK proof。

Fiat-Shamir转换会将交互式协议转换为非交互式协议:

  • Prover 通过“talking to a hash function”来模拟交互协议。为派生第 i i i轮的随机挑战值,Prover需对直到第 i i i轮的所有transcripts都进行哈希,将相应的哈希输出结果作为下一挑战值。
    这样可确保Prover在生成挑战值之后无法改变其responses。

然而cheating Prover有一些新的(交互式IOP所没有的)策略手段。cheating Prover可通过修改最后一条Prover消息(这将给出新的transcript,从而给出新的挑战值),来重新生成Verifier挑战值。由此可知,IOP的标准可靠性概念不足以证明Fiat-Shamir转换的安全性。

如,考虑一个有96轮的IOP,对Verifier进行如下“hack”:

  • 若96轮中,Verifier的每个随机值的第一位是0,在该Verifier接受(而根本不看proof)。

一旦对Verifier添加了该hack,其仅给IOP的soundness error加了一项 2 96 2^{96} 296。但是,经Fiat-Shamir转换之后,攻击者很容易通过修改Prover消息,来确保每个哈希结果以0开头,从而在很短时间内破解该系统。

不过请放心,这仅仅是个理论示例,而不适用于已部署的STARK。

为何StarkWare的STARK是安全的呢?
简而言之,将展示最多允许 n n n步的攻击者,其攻击成功的概率最多为 ( t ) t 2 96 (t)t 2^{96} (t)t296

4.1 IOPs and Round-by-Round Soundness

STARK仅可与其底层的IOP一样安全。但是,某IOP具有96位安全性,意味着什么?
标准定义应是:该IOP的soundness error为 2 96 2^{96} 296,即意味着,任何攻击者(不考虑运行时长)愚弄Verifier的概率最多为 2 − 96 2^{-96} 296

但是,正如之前所讨论,STARK由3大要素组成,IOP soundness只是三者之一,其并不足以让由三大要素所编译的STARK也具有96位安全性。

事实上,所编译的STARK的安全性证明,是假定该STARK具有96位 round-by-round soundness error(有时,也称为state-restoration soundness)。

直观来说,round-by-round soundness error是指:

  • 每轮的安全性为96位,而不仅是整体协议的安全性是96位。

更具体来说,round-by-round是指:

  • 存在某predicate,已知该协议的某partial transcript,可告知该transcript是否是“fooling”的。
    • empty transcript不是“fooling的”。
    • 当且仅当Verifier接受,某full transcript是“fooling”的。
    • 对于任何不愚弄Verifier的partial transcript,在下一轮中该transcript是“fooling”的概率最多为 2 96 2^{96} 296
  • 若存在满足以上属性的predicate,则称该协议具有96位round-by-round soundness(不要求该predicate可高效计算)。

很多情况下,仅分析了某IOP的soundness,而未分析其round-by-round soundness。
需承认的是,很难想到一个例子——某IOP具有标准可靠性,但不是round-by-round soundness(人为例子除外)。

但是IOP soundness与round-by-round soundness 是有差别的:

  • 当派生具体的安全上限时,每个bit都是有关系的。
  • 为此,为派生严谨具体的上限时,必须对IOP的round-by-round soundness 进行严谨分析。StarkWare团队对FRI协议以及ethSTARK IOP均做了相应的严谨分析。该分析自身不在本文详述。
    • 具体见2023年2月视频StarkWare Sessions 23 | The Soundness of FRI | Dan Carmon
  • 借助新的分析,可为StarkWare的STARK proof设置精确的参数。

round-by-round soundness 可给出所需的保证:

  • Prover可多次重新生成挑战值,但是对于任意round,其生成“fooling” transcript的概率为 2 96 2^{96} 296
    因此,若该Prover具有time t t t——用于衡量哈希调用次数,则其最多可尝试 t t t次来试图获得某“fooling” transcript,从而限制其成功概率为 ( t ) t 2 96 (t) t 2^{96} (t)t296

5. Adding All the Error Terms

最后,需确保Prover无法对Merkle tree进行攻击。只需要构建Merkle tree所使用的哈希函数不存在碰撞即可。

攻击者对某随机函数调用 t t t次,尝试找到某碰撞的概率,最多为 t 2 / 2 t2/2 t2/2。其中 t 2 t2 t2为该哈希函数的输出长度(基于“生日悖论”)。这也是为何需设置哈希函数的输出长度,应为所需安全性的2倍。

若有某哈希函数的输出长度为192,且某IOP的round-by-round soundness为96位,则所编译的STARK的soundness error为 ( t ) = t 2 96 + t 2 ⋅ 2 196 (t)=t2^{96}+t2\cdot 2^{196} (t)=t296+t22196。最终该STARK方案的安全性为95位,因 t / ( t ) = t / ( t 2 96 + t 2 ⋅ 2 196 ) = 1 / 2 96 + 1 / 2 96 = 2 − 95 t/(t)=t/(t2^{96}+t2\cdot 2^{196})=1/2^{96}+1/2^{96}=2^{-95} t/(t)=t/(t296+t22196)=1/296+1/296=295

6. 总结

STARK proof system (Scalable Transparent Argument of Knowledge)是用于证明计算完整性(CI,computational integrity)的强大工具:

  • 支持以trustless方式,来验证基于某公开数据的计算的正确性。

STARKs的安全性通常以“soundness error”来衡量,其代表了攻击者成功为某false statement提供让Verifier信服的proof 的概率。

为实现所需的安全性,如96位,底层的IOP必须满足round-by-round soundness,以确保每轮都维护高级别安全性。

StarkWare团队分析了ethSTARK底层的round-by-round soundness,从而可派生出具体的安全上限。

参考资料

[1] StarkWare团队2023年10月博客 Safe and Sound — A Deep Dive into STARK Security

相关文章:

深入探索STARK的安全性和可靠性——STARKs全面安全分析

1. 引言 non-interactive STARKs,起源于Interactive Oracle Proofs (IOPs),然后通过random oracle模式转换为非交互式。StarkWare团队 ethSTARK Documentation – Version 1.2(2023年7月)论文做了更新,给出了完整具体…...

WPF 控件分辨率自适应问题

WPF 控件分辨率自适应时,我首先想到的是使用ViewBox控件来做分辨率自适应。 ViewBox这个控件通常和其他控件结合起来使用,是WPF中非常有用的控件。定义一个内容容器。ViewBox组件的作用是拉伸或延展位于其中的组件,以填满可用空间&#xff0…...

CANoe创建仿真工程

CANoe创建仿真工程 写在前面仿真工程的创建创建工程添加CAN数据库添加系统变量创建面板创建网络节点为节点添加代码工程运行测试总结 写在前面 Canoe的安装不是特别方便,我是参加了松勤的培训课程,不仅需要安装软件还需要安装驱动,刚刚学习的…...

Scanner 输入回车跳不出循环的解决方法

题目要求: 输入一行内容包含字符串和数字,将字符串与数字分别提取。 解决方法: 可以使用两个Scanner对象,一个用来键入数据,另外一个用来对数据进行操作,以此来解决输入“回车”跳不出while循环的问题。 i…...

docker 启动 mysql 通过防火墙设置端口无法访问解决方案

1、问题描述:通过 docker compose 启动mysql服务,然而在防火墙添加了3306端口后却无法访问,但是关闭防火墙后又可以访问mysql数据库。 解决方案: 重启 docker 后解决:systemctl restart docker 如果没有解决问题则执…...

智能制造优化,RFID生产线管理系统解决方案

一、背景介绍 随着全球经济的发展,传统制造业面临着越来越高的成本和低利润的挑战,为了提升企业的整体利润率,优化管理流程成为必要的手段之一,在传统的制造企业中,生产线通常采用单件流生产模式,但这种模…...

【Mybatis】基于Mybatis插件+注解,实现敏感数据自动加解密

一、介绍 业务场景中经常会遇到诸如用户手机号,身份证号,银行卡号,邮箱,地址,密码等等信息,属于敏感信息,需要保存在数据库中。而很多公司会会要求对数据库中的此类数据进行加密存储。 敏感数据…...

【特纳斯电子】基于物联网的指纹密码锁系统设计-实物设计

资料下载链接:基于物联网的指纹密码锁系统设计-实物设计 - 电子校园网 编号: T3732205M-SW 设计简介: 本设计是基于单片机的指纹密码锁,主要实现以下功能: 1、可通过密码解锁 2、可通过云平台解锁 3、可通过指纹解…...

【牛客面试必刷TOP101】Day9.BM37 二叉搜索树的最近公共祖先和BM42 用两个栈实现队列

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:牛客面试必刷TOP101 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&…...

10.12 校招 实习 内推 面经

绿*泡*泡: neituijunsir 交流裙 ,内推/实习/校招汇总表格 1、校招 | 2024届秋招,美团哪些校招岗位最缺人?(内推) 校招 | 2024届秋招,美团哪些校招岗位最缺人?(内推&…...

redis 生成流水工具类

使用redis存储流水号,代码如下: import cn.hutool.core.date.DateUtil; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component;Component public class RedisSerialUtil {private RedisTemplate…...

BGP服务器租用腾讯云和阿里云价格对比

BGP云服务器像阿里云和腾讯云均是BGP多线网络,速度更快延迟更低,阿里云BGP服务器2核2G3M带宽优惠价格108元一年起,腾讯云BGP服务器2核2G3M带宽95元一年起,阿腾云atengyun.com分享更多云服务器配置如2核4G、4核8G、8核16G等配置价格…...

PyTorch 深度学习之多分类问题Softmax Classifier(八)

1. Revision: Diabetes dataset 2. Design 10 outputs using Sigmoid? 2.1 Output a Distribution of prediction with Softmax 2.2 Softmax Layer Example, 2.3 Loss Function-Cross Entropy Cross Entropy in Numpy Cross Entropy in PyTorch 注意交叉熵损失,最…...

抖音直播招聘小程序可以增加职位展示,提升转化率,增加曝光度

抖音直播招聘报白是指进入抖音的白名单,允许在直播间或小视频中发布招聘或找工作等关键词。否则会断播、不推流、限流。抖音已成为短视频流量最大的平台,但招聘企业数量较少。抖音招聘的优势在于职位以视频、直播方式展示,留存联系方式更加精…...

论文阅读之《Learn to see in the dark》

Learning to See in the Dark-CVPR2018 Chen ChenUIUC(伊利诺伊大学厄巴纳-香槟分校) Qifeng Chen, Jia Xu, Vladlen Koltun Intel Labs(英特尔研究院) 文章链接:https://arxiv.org/pdf/1805.01934.pdfhttps://arxiv.org/pdf/1805.01934.p…...

Docker 生成自定义镜像并使用Docker Compose部署

Docker 生成自定义镜像并使用Docker Compose部署 Docker Compose 是一个用于定义和运行多个 Docker 容器的工具,可以轻松管理复杂的应用程序。本文将介绍如何在 Docker Compose 中使用自定义 Docker 镜像,并提供了生成自定义 Docker 镜像的步骤。 步骤…...

设计模式~调停者(中介者)模式(Mediator)-21

调停者(中介者)模式(Mediator) (1)优点 (2)缺点 (3)使用场景 (4)注意事项: (5)应用实例: 代码 调停者&a…...

计算机毕业设计选什么题目好?springboot 医院门诊在线预约挂号系统

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…...

linux中使用ps查看进程的所有线程

在 Linux 系统中&#xff0c;可以使用 ps 命令和 ps H 命令结合来查看进程的线程信息。ps 命令用于显示系统中当前运行的进程信息&#xff0c;而 ps H 命令则可以显示进程中的所有线程。 使用以下命令可以查看指定进程的所有线程信息&#xff1a; ps H -T <PID>将 替换…...

本、硕、博区别真的辣么大吗?

61&#xff1a; 发际线已经说明了一切…… Super Mario&#xff1a; 小学&#xff0c;老师告诉学生&#xff1a;“森林里有只老虎&#xff0c;已经被我关在笼子里&#xff0c;我会带你去那个地方&#xff0c;然后给你一把猎枪&#xff0c;告诉你猎枪怎么用&#xff0c;并开枪…...

[Spring] SpringMVC 简介(一)

目录 一、SpringMVC 简介 1、什么是 MVC 2、什么是 SpringMVC 3、SpringMVC 实现原理 4、SpringMVC 的特点 二、简单案例 1、引入依赖 2、在 web.xml 中配置前端控制器 DispatcherServlet 3、创建 SpringMVC 的配置文件 4、创建请求控制器 5、测试页面 6、访问不到 …...

机器学习基础之《回归与聚类算法(2)—欠拟合与过拟合》

一、背景 1、上一篇说正规方程的时候&#xff0c;实际情况中使用很少&#xff0c;主要原因它不能解决过拟合。 2、训练集上表现的好&#xff0c;测试集上表现不好—过拟合 二、欠拟合和过拟合 1、欠拟合 训练集&#xff1a;有3个训练集&#xff0c;告诉机器都是天鹅 机器学…...

flutter dio 请求封装(空安全)

一、添加依赖 dio: ^5.3.2二、请求封装 class HttpHelper {static Dio? mDio;static BaseOptions? options;static HttpHelper? httpHelper;CancelToken cancelToken CancelToken();static const String GET get;static const String POST post;static const String PU…...

chatgpt GPT-4V是如何实现语音对话的

直接上代码 https://chat.openai.com/voice/get_token 1. 请求内容 Request:GET /voice/get_token HTTP/1.1 Host: ios.chat.openai.com Content-Type: application/json Cookie: _puiduser***Fc9T:16962276****Nph%2Fb**SU%3D; _uasid"Z0FBQUF***nPT0"; __cf_bmBUg…...

C++项目-求水仙花数

求水仙花数 #include <iostream> using namespace std;int main() {int n 100;do {int a 0;int b 0;int c 0;a n % 10; //个位b n / 10 % 10; //十位c n / 100 % 10; //百位if (a * a * a b * b * b c * c * c n) {cout << n << endl;}…...

从零开始基于LLM构建智能问答系统的方案

本文首发于博客 LLM应用开发实践 一个完整的基于 LLM 的端到端问答系统&#xff0c;应该包括用户输入检验、问题分流、模型响应、回答质量评估、Prompt 迭代、回归测试&#xff0c;随着规模增大&#xff0c;围绕 Prompt 的版本管理、自动化测试和安全防护也是重要的话题&#x…...

Android---Synchronized 和 ReentrantLock

Synchronized 基本使用 1. 修饰实例方法 public class SynchronizedMethods{private int sum 0;public synchronized void calculate(){sum sum 1;} } 这种情况下的锁对象是当前实例对象&#xff0c;因此只有同一个实例对象调用此方法才会产生互斥效果&#xff1b;不同的…...

【解题报告】牛客挑战赛70 maimai

题目链接 这个挑战赛的 F F F是我出的&#xff0c;最后 zhoukangyang 爆标了。。。orzorz 记所有有颜色的边的属性集合 S S S 。 首先在外层容斥&#xff0c;枚举 S ∈ [ 0 , 2 w ) S\in [0,2^w) S∈[0,2w)&#xff0c;计算被覆盖的的边中不包含 S S S 中属性&#xff0c…...

算启新程 智享未来 | 紫光展锐携手中国移动共创数智未来

10月11日-13日&#xff0c;2023年中国移动全球合作伙伴大会在广州举行&#xff0c;此次大会以“算启新程 智享未来”为主题&#xff0c;与合作伙伴一起共商融合创新&#xff0c;共创数智未来。作为中国移动每年规模最大、最具影响力的盛会&#xff0c;吸引了数百家世界500强企业…...

thinkphp5.1 获取缓存cache(‘cache_name‘)特别慢,php 7.0 unserialize 特别慢

thinkphp5.1 获取缓存cache(‘cache_name’)特别慢&#xff0c;php 7.0 unserialize 特别慢 场景&#xff1a; 项目中大量使用了缓存&#xff0c;本地运行非常快&#xff0c;二三百毫秒&#xff0c;部署到服务器后 一个表格请求就七八秒&#xff0c;最初猜想是数据库查询慢&am…...

【Linux】UNIX 术语中,换页与交换的区别和Linux 术语中,换页与交换的区别?

UNIX换页和交换的区别 在UNIX中&#xff0c;换页&#xff08;Paging&#xff09;是一种内存管理技术&#xff0c;用于在程序运行时动态地将其代码和数据从磁盘加载到内存中。当程序需要访问的页面不在内存中时&#xff0c;就会发生页错误&#xff08;page error&#xff09;&a…...

零基础学python之集合

文章目录 集合1、创建集合2、集合常见操作方法2、1 增加数据2、2 删除数据2、3 查找数据 3、总结 集合 目标 创建集合集合数据的特点集合的常见操作 1、创建集合 创建集合使用{}或set()&#xff0c; 但是如果要创建空集合只能使用set()&#xff0c;因为{}用来创建空字典。 …...

PromptScript:轻量级 DSL 脚本,加速多样化的 LLM 测试与验证

TL&#xff1b;DR 版本 PromptScript 是一个轻量级的 Prompt 调试用的 DSL &#xff08;Yaml&#xff09;脚本&#xff0c;以用于快速使用、构建 Prompt。 PromptScript 文档&#xff1a;https://framework.unitmesh.cc/prompt-script Why PromptScript &#xff1f; 几个月前&…...

强化学习(Reinforcement Learning)与策略梯度(Policy Gradient)

写在前面&#xff1a;本篇博文的内容来自李宏毅机器学习课程与自己的理解&#xff0c;同时还参考了一些其他博客(懒得放链接)。博文的内容主要用于自己学习与记录。 1 强化学习的基本框架 强化学习(Reinforcement Learning, RL)主要由智能体(Agent/Actor)、环境(Environment)、…...

JUC之ForkJoin并行处理框架

ForkJoin并行处理框架 Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理&#xff0c;最后将子任务结果合并成最后的计算结果&#xff0c;并进行输出。 类似于mapreduce 其实&#xff0c;在Java 8中引入的并行流计算&#xff0c;内部就是采用的ForkJoinPool来实现…...

【牛客面试必刷TOP101】Day8.BM33 二叉树的镜像和BM36 判断是不是平衡二叉树

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…...

CSS padding(填充)

CSS padding&#xff08;填充&#xff09;是一个简写属性&#xff0c;定义元素边框与元素内容之间的空间&#xff0c;即上下左右的内边距。 padding&#xff08;填充&#xff09; 当元素的 padding&#xff08;填充&#xff09;内边距被清除时&#xff0c;所释放的区域将会受到…...

C语言达到什么水平才能从事单片机工作

C语言达到什么水平才能从事单片机工作 从事单片机工作需要具备一定的C语言编程水平。以下是几个关键要点&#xff1a;基本C语言知识&#xff1a; 掌握C语言的基本语法、数据类型、运算符、流控制语句和函数等基本概念。最近很多小伙伴找我&#xff0c;说想要一些C语言学习资料&…...

Java架构师理解SAAS和多租户

目录 1 云服务的三种模式1.1 IaaS(基础设施即服务)1.2 PaaS(平台即服务)1.3 SaaS(软件即服务)1.4 区别与联系2 SaaS的概述2.1 Saas详解2.2 应用领域与行业前景2.3 Saas与传统软件对比3 多租户SaaS平台的数据库方案3.1 多租户是什么3.2 需求分析3.3 多租户的数据库方案分析…...

关于Java线程池相关面试题

【更多面试资料请加微信号&#xff1a;suns45】 https://flowus.cn/share/f6cd2cbe-627a-435f-a6e5-1395333f92e8 【FlowUs 息流】&#x1f4e3;suns-Java资料 访问密码&#xff1a;【请加微信号&#xff1a;suns45】 ————线程相关的面试题———— 0&#xff1a;创建线…...

ExcelBDD Python指南

在Python里面支持BDD Excel BDD Tool Specification By ExcelBDD Method This tool is to get BDD test data from an excel file, its requirement specification is below The Essential of this approach is obtaining multiple sets of test data, so when combined with…...

基于深度学习的驾驶员疲劳监测系统的设计与实现

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88421622?spm1001.2014.3001.5503 基于深度学习的驾驶员疲劳监测系统的设计与实现 1 绪论 在21世纪&#xff0c;各国的经济飞速发展&#xff0c;人民越来越富裕&#xff0c;道路上的汽车也逐…...

B树、B+树详解

B树 前言   首先&#xff0c;为什么要总结B树、B树的知识呢&#xff1f;最近在学习数据库索引调优相关知识&#xff0c;数据库系统普遍采用B-/Tree作为索引结构&#xff08;例如mysql的InnoDB引擎使用的B树&#xff09;&#xff0c;理解不透彻B树&#xff0c;则无法理解数据…...

使用hugging face开源库accelerate进行多GPU(单机多卡)训练卡死问题

目录 问题描述及配置网上资料查找1.tqdm问题2.dataloader问题3.model(input)写法问题4.环境变量问题 我的卡死问题解决方法 问题描述及配置 在使用hugging face开源库accelerate进行多GPU训练&#xff08;单机多卡&#xff09;的时候&#xff0c;经常出现如下报错 [E Process…...

IDEA 修改插件安装位置

不说假话&#xff0c;一定要看到最后&#xff0c;不然你以为我为什么要自己总结&#xff01;&#xff01;&#xff01; IDEA 修改插件安装位置 前言步骤 前言 IDEA 默认的配置文件均安装在C盘&#xff0c;使用时间长会生成很多文件&#xff0c;这些文件会占用挤兑C盘空间&…...

牛客网SQL160

国庆期间每类视频点赞量和转发量_牛客题霸_牛客网 select * from ( select tag,dt, sum(单日点赞量)over(partition by tag order by dt rows between 6 preceding and 0 following), max(单日转发量)over(partition by tag order by dt rows between 6 preceding and 0 follo…...

HDFS Java API 操作

文章目录 HDFS Java API操作零、启动hadoop一、HDFS常见类接口与方法1、hdfs 常见类与接口2、FileSystem 的常用方法 二、Java 创建Hadoop项目1、创建文件夹2、打开Java IDEA1) 新建项目2) 选择Maven 三、配置环境1、添加相关依赖2、创建日志属性文件 四、Java API操作1、在HDF…...

论文阅读之【Is GPT-4 a Good Data Analyst?(GPT-4是否是一位好的数据分析师)】

文章目录 论文阅读之【Is GPT-4 a Good Data Analyst?&#xff08;GPT-4是否是一位好的数据分析师&#xff09;】背景&#xff1a;数据分析师工作范围基于GPT-4的端到端数据分析框架将GPT-4作为数据分析师的框架的流程图 实验分析评估指标表1&#xff1a;GPT-4性能表现表2&…...

【数据结构】:二叉树与堆排序的实现

1.树概念及结构(了解) 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的有一个特殊的结点&#…...

纯css手写switch

CSS 手写switch 纯css手写switchcss变量 纯css手写switch 思路&#xff1a; switch需要的元素有&#xff1a;开关背景、开关按钮。点击按钮后&#xff0c;背景色变化&#xff0c;按钮颜色变化&#xff0c;呈现开关打开状态。 利用typecheckbox&#xff0c;来实现switch效果(修…...