中本聪是个贪婪的矿工吗?

news2024/11/18 11:46:47

对可能是中本聪的实体所表现出的挖矿行为的技术分析。

文 | Jameson Lopp. 原标题:Was Satoshi a Greedy Miner?. 2022/9/16.

* * *

2ace5b83422b9c710236b034498a2746.png

如果你在加密生态系统中待了足够久的时间,那么你无疑会听到这样的论点,即某些项目的代币分配不公平,因为它们是由项目创始人在项目初始启动时就“预挖”/“立即挖矿”/“快速挖矿”,有效地令项目创始人自己致富。

项目创始人若是愤愤不平,希望反击代币分配的批评,就不可避免地会指出,中本聪似乎拥有大约 110万枚 比特币 —— 接近 5% 的比特币总供应量。

* * *

Patoshi模式的序言

免责声明:出于以下文章的目的,我将假设所谓的“Patoshi模式”实际上是一个矿工实体,而这个实体就是 Satoshi(中本聪)。因此,我将互换使用“Satoshi”和“Patoshi”。虽然不可能超越合理怀疑进而证实这一点,但这位矿工表现出的行为表明,有人在比特币存在的早期就对比特币有着极其深刻的了解 —— 中本聪级别的理解。但这是另一篇文章的主题。

什么是 Patoshi模式?如果你熟悉比特币挖矿的基础知识,那么你就会知道矿工会通过增加 nonce值 来尝试创建一个 哈希值满足给定难度目标的 有效区块。位于 coinbase 交易中的 ExtraNonce 字段在每次 nonce 字段溢出时递增,这意味着搜索空间已用尽。由于 nonce 字段的长度为 32 位,而最初的比特币难度目标需要平均扫描 32 位,因此 nonce 有时会溢出,但并非总是如此。

1. ExtraNonce 用作“自由运行计数器”,不会在挖掘的块之间重置为零。

2. 根据原始比特币源代码,某个矿工增加 ExtraNonce 的速率比其实际哈希值指示的速率快得多。

3. 挖矿过程中每隔几秒检查一次最佳区块。如果最佳块发生变化,则 ExtraNonce 会额外增加。通常每个收到的外部块都会增加 ExtraNonce,除了特殊的矿工 Patoshi,它似乎不遵循这个规则。

在绘制图表时,这些 ExtraNonces 允许 Patoshi 模式的可视化,我们可以观察到 ExtraNonces 的连续斜率。

6a2fd41bbb36193beb2f45a5aed85f4e.png

此外,Patoshi 矿工在他们为区块找到的 nonce 值中表现出奇怪的限制。关于为什么会出现这种情况有多种理论,但我认为最合理的是 Patoshi 开发了多线程挖矿软件,并将这些范围分配给不同的 CPU 内核,这样每个内核都会并行地扫描一个缩小的 nonce值空间。

c1c985150a77e6e4e701c5cf9b527598.png

来源: http://organofcorti.blogspot.com/2014/08/168-little-more-on-satoshis-blocks_15.html

注意:用于识别 Patoshi 区块的技术涉及一些不确定性,并且与来自其他矿工的 ExtraNonce 模式相交的非 Patoshi 区块存在冲突。但是,错误分配的块的错误率可能会限制在远低于 1% 的范围内。

* * *

Patoshi的特点

如果我们通读十几篇分析似乎由中本聪开采的区块的技术文章,我们可以得出关于这个矿工的几个结论:

1. 他们使用自定义编码的多线程比特币客户端进行挖掘,该客户端的行为与公开可用的比特币客户端不同。用外行的话来说,现代 CPU 有多个内核 —— 一个物理单元内的多个处理器。但是,除非你以一种可以跨多个内核并行分配计算的方式编写软件,否则它只能使用一个内核。早期的公共比特币客户端并没有编写多线程功能;它只在一个 CPU 内核上开采。

2. 他们的哈希率一次连续数月保持不变,然后出现系统性下降。

3. 22,000 多个区块中只有不到 20 个(0.09%)被花费。

4. 中本聪似乎是以编程的方式打开和关闭他们的矿机。

* * *

沉睡的中本聪

中本聪开采的区块的时间分布有一个奇怪的点:它们不遵循我们对花费 100% 的时间进行挖矿的矿工所期望的分布。事实上,他们几乎从不连续开采相距不到 5 分钟的区块!一个简单的解释是,他们在挖出一个区块后暂停了他们的矿工 5 分钟。

正如 Sergio 在他的研究中解释的那样,Patoshi 的矿工有可能在找到一个区块后继续挖矿,但他们的定制挖矿软件会人为地将下一个区块的时间戳增加不少于 300 秒。

无论如何,这是一个有趣的现象,显然是矿工的深思熟虑的决定。我们可以深挖一下吗?我通过几种不同的方式分析了 Patoshi 的区块分布。首先,如果我们只观察 Patoshi 和 Patoshi 挖出的区块之间的时间戳差异,我们可以很明显地看到他们很少挖出间隔小于 5 分钟的区块。在难度目标为 1 时,每秒 4.35 兆哈希 (Mhps) 的矿工的预期时间戳增量分布趋势线以蓝色显示。出于此图表的目的,我只使用了他们在似乎以 4.35 Mhps 的速度挖掘期间的 Patoshi 块数据。

5f6d944ed8652a40222a6e6451e4dd77.png

前 6 个月由 Patoshi 开采的两个区块之间的时间戳差异

所以我们可以看到缺少“快速”块的明显的巨大间隔。如果我们查看所有 Patoshi 区块增量,包括在非 Patoshi 区块之后开采的区块,会怎样?

ba147aad5ff66be1b7e396c8012dd9ec.png

Patoshi 挖出的每个区块与其父区块的时间戳差异

这看起来好多了 —— 很明显,Patoshi 在收到其他人开采的区块后 5 分钟(300 秒)内没有关闭他们的矿工(或调整他们的区块模板时间戳)。但是我们也可以看到,耗时超过10分钟的出块数量比预期的要多很多!虽然这部分是由于中本聪随着时间的推移降低了哈希率,但由于其中一种挖矿操纵的发生,这种情况可能会加剧。

接下来,我从之前的图表中获取数据集,每当有一个区块在前一个区块之后被开采超过 5 分钟时,我就从时间增量中减去 5 分钟。我们可以看到,这为我们提供了一个更符合预期分布的结果数据集。

7877601c1bd2e1a0f08ed0ed1979ff7e.png

如果你还没有读过我之前关于块时间方差的研究[1],那么你可能会问自己这些图是否真的有意义 —— 也就是说,我们可以将它们与对照组进行比较吗?为了比较,这里是在 GPU 挖矿流行起来之前的比特币“CPU 时代”期间挖出的所有区块的图表:

33785bbc7af42608281d6c827ade8b25.png

所以问题仍然存在:这种独特的现象是由于中本聪将他们的矿工关闭 5 分钟,还是由于他们将时间戳操纵了 5 分钟?我坚信中本聪的机器睡着了。为什么?

一个思想实验:如果 Patoshi 在找到一个块后简单地将他们的块时间戳设置为未来 5 分钟,那么我们可以预期异常高比例的孩子区块是非 Patoshi 块,且具有比第二个 Patoshi 块更早的时间戳,因为矿工会基于他们本地机器的时钟来设置时间戳。让我们搜索一下:

1. Patoshi块-> Patoshi块->非Patoshi块的序列

2. 第二个 Patoshi块 必须在第一个之后的 10 分钟内被开采

3. 找到第二个 Patoshi块 和 非Patoshi块 之间的时间戳增量

所以我写了个脚本[2]来搜索具有这些特征的块。该脚本找到了 1,881 个匹配的块。在这些块中:

* 只有 1 个具有来自父 Patoshi 块的负时间戳增量

* 只有 5 个 (0.3%) 是在父 Patoshi 块后不到 5 分钟内铸造的

此外,如果 Patoshi 只是在操纵他们开采的区块的时间戳,他们将无法隐藏他们在很长一段时间内开采的区块的总分布,因此也无法隐藏他们的有效哈希率。对于本文的其余部分,请记住以下数字:4.35 Mhps 和 6 Mhps。

* * *

中本聪的哈希率优势

我们可以观察到中本聪的矿工有 4 个不同的哈希时期。他们最初遵循的计划是每五个月将哈希率降低 1.7 Mhps,但在第二次下降一个月后,他们放弃了这种方法,转而采用持续降低哈希率的方法。

6beb52ba933c1199a4c9e0615f48a6dc.png

来源: http://organofcorti.blogspot.com/2014/08/167-satoshis-hashrate.html

当我们将中本聪的算力与网络的其他部分进行比较时,我们可以更清楚地观察到随着中本聪进一步后退,其他矿工对算力的自举从 2009 年 10 月开始起飞。

fb7a9608926c4851fb46a297108d66fe.png

来源: http://organofcorti.blogspot.com/2014/08/167-satoshis-hashrate.html

事实上,直到 2009 年 10 月,中本聪一直处于危险的主导地位,拥有超过一半的网络哈希率。

90ba9702c28969c2b0ba220ed61dbc40.png

来源: http://organofcorti.blogspot.com/2014/08/167-satoshis-hashrate.html

更有趣的是,中本聪在多次自愿降低算力后,才成为少数算力矿工。

这表明了几件事:

* 中本聪计划一直降低其哈希率。

* 中本聪最初对其哈希率有一个粗略的控制。

* 中本聪后来对其哈希率进行了非常细粒度的控制。

* * *

双螺旋

你可能已经注意到,“沉睡的中本聪”部分中的第一个时间戳分布图从其数据集中排除了块 1400-1916。为什么?因为在这个时间范围内发生了一个独特的现象,它搞砸了 Patoshi 块时间戳增量计算。有2台Patoshi矿机同时运行!

4c2d567a70353e33b4e3dd7c773d8ff4.png

双螺旋 Patoshi 模式(块 1400-1916)

你可以在 SatoshiBlocks 网站[3]上探索这种模式。双螺旋模式可能是由并行运行的 Patoshi 软件的两个实例引起的。我们不知道这是 Patoshi 犯的错误还是他在测试什么。我们可以从这个现象中推断出什么呢?

在这 4 天 3 小时的时间里,中本聪挖出了 458 个区块。由此我们可以估计在这段时间内它们的总哈希率约为 5.5 Mhps。这是值得注意的,因为中本聪在 2009 年前 5 个月的哈希率平均为 4.3 Mhps。这也解释了与早期哈希率图表的突出差异。

396ba15523670f0a5989c1cdfba2dda7.png

为什么这很有趣?如果中本聪设置了一台与第一台类似的单独机器进行挖矿,我们预计在双螺旋时期它们的整体哈希率将接近 8.6 Mhps。然而,他们的哈希率仅高出 28%,而不是高出 100%。我们可以看到,与每个其他 Patoshi 斜率相比,每个挖矿实例的性能都降低了,导致两个实例的 ExtraNonces 斜率一致下降。为什么?最简单的解释是因为两个挖矿实例中的线程都在竞争相同的 CPU 内核!

dafeec5bcf224e074a6dac89e46f87d6.png

请注意,当单个实例正在运行时,它具有更高的哈希率,因此具有更陡峭的 ExtraNonce 斜率

Sergio Lerner 认为我们可以从中推断出中本聪的计算机可能是四核的。我认为这符合预期,因为当时的平均单线程矿工似乎达到了 1 Mhps 多一点的哈希率。无论如何,我认为可以肯定地猜测中本聪的双螺旋模式来自他们在同一硬件上运行的定制软件的两个实例。

几年前,我从电子邮件、论坛帖子和代码提交中汇总了中本聪的所有公开活动时间戳,生成了以下图表。我的结论是,中本聪保持着与太平洋时区的人一致的睡眠时间表。

57fbce3db52943c2c8093d5865f6d469.png

我为什么要提这个?为了支持我解释双螺旋现象的理论!这是我认为发生的事情:

* 中本聪于 2009 年 1 月 22 日太平洋时间下午 4 点开采了 1386 区块

* 中本聪的挖矿硬件/软件此后不久就崩溃了

* 第二天太平洋时间上午 8 点前不久,中本聪醒来检查他们的矿机,却发现它出现了故障

* 他们重新启动了矿机,并在太平洋时间上午 8 点发现了一个区块

* 中本聪不知道,他们不小心启动了 2 个挖矿实例

* 矿机在接下来的 3 天里跑了一个周末,中本聪没有注意到

* 1 月 25 日太平洋时间晚上 10 点 30 分开采区块 1916 后不久,矿机再次崩溃

* 中本聪在 1 月 26 日太平洋时间早上 7 点前不久醒来并检查他们的矿机,发现它已经崩溃,并将其恢复正常

* * *

中本聪的连胜

我们知道中本聪在 2009 年的前 9 个月拥有大部分哈希率;我们可以从他们最长的连续区块中发现什么吗?我写了一个连胜发现脚本,确定中本聪从 80 到 127 的高度有 47 个区块的连胜。

5ef80daad689c8ae808855a7051f95f4.png

鉴于这是一个约 8 小时的窗口,并且随着你观察的时间范围缩短,哈希率估计变得不那么准确,这当然应该有所保留,但我们可以看到平均块时间为 720 秒,这使我们得以估计在此期间,他们的哈希率为 5.97 Mhps。

* * *

中本聪调慢挖矿速度是为了保持低难度吗?

回想一下,我们有多个数据点表明中本聪的机器,虽然通常观察到的哈希率为 4.35 Mhps,但可能只能达到 6 Mhps 的最大潜在哈希率。在 6 Mhps 的哈希率下,这导致预期的平均块时间为 708 秒。请记住,在过去的 2016 个区块以低于 600 秒的平均速度被开采之前,难度目标不会调整。因此,每个难度单位的全球网络哈希率可以表示为:

每秒哈希 = 2^32 / 600 = 每秒 7,158,278 个哈希

因此,为了使平均区块铸造时间足够快,以便比特币将难度目标从 1 调整到 2,网络上需要超过 7,158,278 * 1.5 = 10737417 哈希每秒 = 10.7 Mhps。

这意味着如果中本聪尽可能快地挖矿,网络上的其他矿工将需要超过 4.7 Mhps 才能提高难度目标。很难确切地说这会相当于多少台机器,尽管根据此处提供的一些 CPU 基准测试,我猜测使用早期、未优化的单线程比特币矿工的普通台式机处理器可能产生略高于 1 Mhps 的速度。还有早期矿工在 BitcoinTalk 上发布他们的哈希率的轶事证据。我们还可以观察这一点,并通过比较非 Patoshi 矿工的 ExtraNonce 斜率与 Patoshi 开采的 ExtraNonce 斜率来证明它的可能性 —— Patoshi 的比其他矿工的斜率高 3 倍。因此,我们只需要网络上的 4 或 5 个其他矿工来提高难度。

我写了另一个脚本[4]来从区块链中提取难度历史。

c340258cdb9249f5884978dc368825da.png

以下是问题相关时期的总网络哈希率图表:

fda4a24ad05ff629255488a2a5226a92.png

来源:https://www.coinwarz.com/mining/bitcoin/hashrate-chart

要了解难度重设会如何变化,我们必须问,如果中本聪以最大 6 Mhps 的速度进行挖矿,全球网络哈希率会在什么时候超过 10.7 Mhps。

fc44e201e001772546c6e41c4fbded85.png

通过查看图表并添加来自中本聪的缺失的潜在额外哈希率,看起来网络在 2009 年 12 月中旬已经超过 10.7 Mhps,并且难度在大约 2.5 个月前的区块 32256 处调整为 2。

所以,不,关于中本聪调慢挖矿速度以保持低难度的说法是荒谬的。他们本可以开采更多的区块,从而通过在不增加难度的情况下以最大潜在哈希率运行来赚取更多的比特币。当难度实际增加时,中本聪已经大幅降低了他们的哈希率。

* * *

一个贪婪的中本聪会有什么不同的做法?

Sergio 的 Patoshi 模式分析已将约 22,000 个区块确定为 Patoshi 候选区块。其中一些肯定是误报,但有充分的理由相信(由于用了多种指纹来鉴别区块)误报率低于 1%。因此,这将估计中本聪的总开采量约为 1,100,000 BTC。

如果中本聪在 2009 年底没有决定多次降低他们的哈希率,他们会多赚多少 BTC?如果我们假设恒定的难度目标为 1,则计算起来很简单。通过观察中本聪的区块铸造率和 1 的难度目标,我们知道他们的初始哈希率约为每秒 4,350,000 哈希(4.35 Mhps。)最后一个归属于中本聪的区块为 54,316;在创世块被开采后整整 14 个月。如果中本聪在 1 的难度目标下花费 4.35 Mhps 运行 14 个月,他们可以开采多少个区块?

找到一个块的预期秒数 = 难度 * 2^32 / 每秒哈希

1 * 2^32 / 4,350,000 = 987.35 秒每个块对于中本聪

36817200 秒(14 个月)/987.35 个区块 = 37302 个区块 = 1,865,100 BTC

不幸的是,这个问题其实有点儿复杂,因为挖矿难度从 2010 年 2 月 14 日的区块 40320 开始增加,而中本聪至少持续挖矿到 2010 年 5 月 3 日。复杂度甚至更进一步,如果我们考虑中本聪以最大哈希率挖矿可能导致将第一个难度目标更改提前了约 2.5 个月。

因此,我们可以使用之前发布的历史难度变化表,将时间框架向前移动那么些。如果我们假设中本聪仍然以 4.35 Mhps 的持续速度挖矿 479 天,那么这将导致大致如下数据:

5739998146e176dc4caf543d09fd1fb8.png

结果是 31,783 个区块或总共 1,589,150 BTC。

然而,我们还必须记住,当中本聪发现间隔不到 5 分钟的区块时,他们会定期关闭他们的矿机。这实际上是对其哈希率的额外的故意限制。那么中本聪实际在表面上留了多少算力呢?根据我们对区块的泊松分布的了解,我们可以得到一个很好的估计。旁注:如果你想深入那个兔子洞,你可以查看我之前关于区块时间方差的文章。

预计在前一个区块后不到 5 分钟内开采出区块的概率是百分之几?1 - exp(−5/10) = 39.35%。因此,中本聪的最大潜在哈希率实际上更像是 6.06 Mhps。这是一个有趣的结果,因为它也非常接近在双螺旋时代观察到的 5.5 Mhps 的哈希率,并且非常接近在早期连续 47 个区块期间观察到的 5.97 Mhps 的哈希率。

因此,让我们重新运行之前的计算,但这次假设中本聪以 6 Mhps 的理论最大哈希率运行他们的硬件。

170b28ea5cef5212fd22ce93503f14ea.png

总共是 43,829 个区块或 2,191,450 BTC。

* * *

为什么中本聪不销毁他们的比特币?

2010 年 8 月 10 日,第一笔向可证明无法使用的地址存款的交易是 1111111111111111111114oLvT2,我能找到的第一篇引用它的帖子[5]是在一个月后,并指出这是“可能的最小比特币地址”,而其他帖子[6]称它为 “零地址”,因为它是从全零的哈希值创建的。这些讨论倾向于围绕比特币地址有效性的边缘案例,而不是围绕有意销毁硬币的用例。

据我所知,第一次有意识地使用销毁地址是在 2011 年 6 月 20 日,当时交易对象是 1BitcoinEaterAddressDontSendf59kuE。我能找到的关于销毁地址的最古老的讨论发生在 2011 年 6 月 23 日,在关于“比特币黑洞”的 BitcoinTalk 跟帖[7]上。

中本聪在 BitcoinTalk 上的最后一次活动是 2010 年 12 月 13 日。最后一次有人收到他们的消息是在 2011 年 4 月 26 日。中本聪从未考虑过将其代币销毁作为一种选择,这似乎是合理的。

* * *

结论

在区块 54,316 之后,中本聪是否停止使用 Patoshi 矿工进行挖矿?我们无法知道挖矿软件是否被更改并因此变得无法检测,或者中本聪是否继续使用公开可用的挖矿软件进行挖矿。

关于中本聪,我有哪些确定的结论呢?

* 他的目标是在网络启动时保持网络的“心跳”。

* 他在一台最大哈希率为 6 Mhps 的机器上进行挖矿。

* 如果他全力开采,他本可以轻松赚取两倍以上的 BTC。

* 他不希望处于主导网络哈希率的位置,但在最初的日子里,由于只有不到五个矿工,网络更加脆弱,他可能觉得有必要。

* 他非常关心难度调整。调整算法是中本聪最伟大的创新之一,他对这个话题的看法比几乎任何其他人都多。

* 他希望尽可能多的人能够在家用 PC 上挖矿(中本聪谴责 FGPA / GPU 挖矿竞赛)

「为了网络的利益,我们应该达成君子协议,尽可能推迟 GPU 军备竞赛。如果新用户不必担心 GPU 驱动程序和兼容性,则他们更容易上手。很高兴任何人现在只要一个 CPU 就可以公平地竞争。」——中本聪

任何声称中本聪贪婪的人根本就没有做过上面这些计算。

* * *

参考资料:

- [1] https://blog.lopp.net/bitcoin-block-time-variance/

- [2] https://github.com/jlopp/bitcoin-utils/blob/master/findNonPatoshiDeltasAfterFastPatoshiBlocks.php

- [3] http://satoshiblocks.info/?bn=1600

- [4] https://github.com/jlopp/bitcoin-utils/blob/master/generateDifficultyHistoryCSV.php

- [5] https://bitcointalk.org/index.php?topic=1019.msg12683#msg12683

- [6] https://bitcointalk.org/index.php?topic=3635.msg53755#msg53755

- [7] https://bitcointalk.org/index.php?topic=21552.0

公众号:刘教链(同名推特:@liujiaolian)

根据央行等部门发布的“关于进一步防范和处置虚拟货币交易炒作风险的通知”,本文内容仅用于信息分享,不对任何经营与投资行为进行推广与背书,请读者严格遵守所在地区法律法规,不参与任何非法金融行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windous注册表+c#操作

下面将会分享注册表的基础知识及C# 读写注册表的方法 了解注册表 注册表(英语:Registry,中国大陆译作注册表,台湾、港、澳译作登录档)是Microsoft Windows操作系统和其应用程序中的一个重要的层次型数据库&#xff0…

关于计算机网络,你需要知道的一些常识

最近闲着没啥事翻开之前大学时候谢希仁老师第7版的《计算机网络》这本书,结果发现了一些之前没有发现的常识。 首先是互联网与互连网的区别,一般我们常说的互联网是Internet,是指因特网,其起源于阿帕网ARPANT。或许很多读者看到这里就觉得有什么秘密可言,不都是常识了吗?看你大…

如何在Vue3+js项目(脚手架)中使用(下载安装及运行)element-plus以及解决使用过程中遇到的问题

文章目录 📋前言 🎯关于 ElementUI 框架描述 🧩设计原则 1️⃣一致 Consistency 2️⃣反馈 Feedback 3️⃣效率 Efficiency 4️⃣可控 Controllability 🧩环境支持 🎯安装element-plus 🧩遇到的问…

【随笔】博客质量分计算,如何让自己的博客脱颖而出,也许文章能够给你答案

作者:小5聊 简介:一只喜欢全栈方向的程序员,专注基础和实战分享,欢迎咨询,尽绵薄之力答疑解惑! 公众号:有趣小馆,一个有趣好玩的关键词回复互动式公众号,欢迎前来体验 1、…

TSF微服务治理实战系列(四)——服务安全

一、导语 **道路千万条,安全第一条。治理不规范,老板两行泪”。**当企业从单体架构逐渐转向微服务架构时, 服务安全 的需求也随之分散到了整个微服务体系的各个部分中。这就需要构建一套配置活、成本低的安全防控体系,覆盖请求链…

基于javaweb(springboot)城市地名地址信息管理系统设计和实现

基于javaweb(springboot)城市地名地址信息管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文…

日志门面和日志框架(SpringBoot日志实现)

一、Springboot日志实现简介 SpringBoot是现今市场上最火爆用来简化spring开发的框架,springboot日志也是开发常用的日志系统。SpringBoot默认就是使用SLF4J作为日志门面,Logback作为日志实现来记录日志。 二、application.yml修改日志相关的配置 appl…

Spring入门-IOC/DI相关配置与使用(1)

文章目录Spring入门1,Spring介绍1.1 为什么要学?1.2 学什么?1.3 怎么学?2,Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线2.3 Spring核心概念2.3.1 目前项目中的问题2.3.…

修改RT-Thread 的启动流程,实现显式调用rtthread_startup

一、STM32 单片机的启动流程 单片机上电后,会首先执行定义在startup 文件 中的Reset_Handler 函数,Reset_Handler 函数会首先执行SystemInit 函数,执行完之后,再执行我们常见的main 函数。 二、RT-Thread 启动函数是怎么被调用的…

什么是最少知识原则?-外观模式

外观模式将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。 构建自己的家庭影院 //打开爆米花机,开始爆米花 popper.on(); popper.pop();//调整灯光亮度 lights.dim(10);//把屏幕放下 screen.down();//打开投影仪 projector.on();…

【阶段三】Python机器学习32篇:机器学习项目实战:关联分析的基本概念和Apriori算法的数学演示

本篇的思维导图: 关联分析模型:Apriori算法 关联分析的基本概念和Apriori算法 关联分析是数据挖掘中一种简单而实用的技术,它通过深入分析数据集,寻找事物间的关联性,挖掘频繁出现的组合,并描述组合内对象同时出现的模式和规律。例如,对超市购物的数据进行关联…

缓存Cache-Control

可缓存性指定哪些地方可以缓存publichttp请求返回的过程中,http请求返回的内容所经过的任何路径包括:中间的代理服务器,发出请求的客户端浏览器,都可以对返回的内容进行缓存。private发起请求的浏览器可以缓存。no-cache任何节点都…

【程序员高效率工具】PlantUML —— 使用代码快速绘制时序图、思维导图

本篇思维导图 前言 不管是在工作还是学习,特别是在项目计划初期,我们需要画大量的图将工作内容、项目方案等进行可视化描述,包括但不限于时序图、类图、思维导图等等。 但是对于不经常画图,或者经常使用键盘的孩子,手…

VMware三种网络模式的摸索

VMware三种网络模式的摸索 文章目录VMware三种网络模式的摸索前言一、桥接模式简要描述拓扑图展示配置测试优缺点二、NAT模式简要描述拓扑图展示配置测试优缺点三、仅主机模式简要描述拓扑图展示配置测试优缺点3.总结前言 注意:所有的测试请关闭虚拟机和主机的防火…

微信小程序 - 实现手机号登录--授权并获取手机号保存至本地

详细代码请见文档最下方,仅供参考,更多需要请查看官方文档 一、 微信官方文档 | 获取手机号 这是服务端的 这是我们前端获取手机号需要给接口传递的两个参数 注意: 参数一:获取access_token需要用到小程序密钥,这个…

你可能不知道的20个Git命令,但真的很实用

如果您曾经浏览过git 手册(或 run man git),那么您会注意到 git 的功能比我们大多数人每天使用的要多得多。很多这些命令都非常强大,可以让你的生活更轻松(其他命令有点小众,但仍然很高兴知道)。…

QT-QStackedWidget多窗口应用

前言: 多窗口应用,例如某微信,页面由1,2,3个布局组成。 1-基本流程 页面1控制页面2,通过选择页面1上的按钮或控件 页面2控制页面3,通过选择页面2上的按钮或控件 2-其中页面2中的页面很…

100、【树与二叉树】leetcode ——105. 从前序与中序遍历序列构造二叉树+106. 从中序与后序遍历序列构造二叉树(C++版本)

106. 从中序与后序遍历序列构造二叉树 题目描述 原题链接:106. 从中序与后序遍历序列构造二叉树 解题思路 中序的特点:左中右,后序的特点:左右中。因此可通过后序序列找到中间结点,然后再根据中间结点,分…

3、关键词与标识符

目录 一、关键词 二、标识符 一、关键词 C语言中有32个关键字: 注意:在C语言中,关键字是不允许作为标识符出现在程序中的。 二、标识符 C语言标识符的命名规则: (1)所有标识符必须由字母或下画线开头…

KMP算法 看这一篇就够了 图解刨析+代码

目录 问题背景 逐步剖析 KMP如何优化暴力做法 思考 公共前后缀 next数组 如何构建next数组: 代码实现 问题背景 给定一个字符串 S,以及一个模式串P, P 在字符串 S 中多次作为子串出现。 求出模式串 P 在字符串 S 中所有出现的位置的起始下标。 …