当前位置: 首页 > 编程日记 > 正文

分布式系统中节点之间的同步形成区块链

链客,专为开发者而生,有问必答!

此文章来自链客区块链技术问答社区,未经允许拒绝转载。
在这里插入图片描述

分布式系统中节点之间的同步形成区块链

分布式系统由Tanenbaum定义,“分布式系统是一组独立的计算机,在”分布式系统 — 原理和范例“中作为用户的单一,连贯的系统出现”。

区块链通过构建全球分布式系统,尝试实现分散的新数据存储和组织结构。

首先,定位到分布式系统的原因主要是可扩展性,位置和可用性。区块链也不例外。地理可扩展性,形成全球价值存储网络/信息保护区域,包括非集中式结构下的防篡改/零停机时间的可用性。这些未来都是使用分布式系统在block中实现的。

0.目录

X.区块链和分布式系统

1.简介(同步和整体流程概述)

2.时钟同步

2–1。物理时钟(时钟和时钟偏移)

2–2。 时钟同步算法(网络时间协议(NTP)/伯克利算法)

3.逻辑时钟

3–1。 Lamport的逻辑时钟(完全有序的多播)

3–2。 矢量时钟(因果订单组播)

4.独家控制

4–1。 集中算法

4–2。 分散算法

4–3。 分布式算法

5.选举算法

5–1。 欺负算法

5–2。 环算法

6.阻止链和同步作为分布式系统

6–1。 块链和时钟同步(块链和物理/逻辑时钟)

6–2。 块链和独占控制算法(PoW·PoS·BFT中的独占控制算法)

6–3。 块链和领导者选举算法(PoW·PoS·BFT中的领导者选择算法)

1.简介(同步和整体流程概述)

与集中式系统不同,在分布式系统中就时间达成一致并不容易。

在前一种情况下,可以基于全局共享时钟确定绝对顺序关系,但是在后一种情况下,由于存在时钟值错误和对应时间,因此难以共享绝对时间。

但是,绝对时间的顺序并不是绝对必要的,如果相对顺序是固定的,通常就足够了。我们如何同步分布式系统中的所有时钟?此外,需要哪些算法才能在分布式系统中实现一致性同步?

在本文中,将按以下顺序解释节点之间的同步。

时钟同步是如何发生的?

使用逻辑时钟和矢量时钟的相对排序方法

关于分布式系统一致性的排除控制算法

关于分布式系统中的领导选举算法

2.时钟同步

2–1. 物理时钟

时钟和时钟歪斜

大多数计算机都有保持时间的电路,这种设备称为“时钟”。这是基于频率的振动,该振动可以通过晶体类型,切割方法和向精确加工的石英增加张力时的压力大小明确定义。

虽然这个频率相当稳定,但不能保证不同计算机的所有晶体都能以完全相同的频率运行。由此引起的同步时间的差异称为时钟偏差。

在这种情况下,特别是在实时系统中,如何使多个时钟与现实时钟同步以及如何同步时钟是一个问题。

现实世界中的时间最初基于平均太阳秒,但现在铯133过渡9,192,631,770次的时间定义为1秒,并且定义了国际原子时间和通用协调时间(UTC)。为了向需要准确时间的人提供UTC,使用WWV并且时间以±10毫秒的精度提供。

2–2. 时钟同步算法

但是,大多数机器没有WWV接收器。因此,每台机器都需要时间跟踪和管理算法,以便所有机器都可以同步时间。

顺便提及,用于确定是否需要重新同步的错误,即时钟偏移,如下测量。

将H定义为每台机器计数的晶体振动引起的每秒中断次数(刻度数),并将C表示为该时钟的值。设Cp(t)表示机器的时钟值,当UTC时间为t时。

如果将p定义为定义允许的时钟偏差量的最大漂移率,则假定它在以下范围内运行。

1-p <= dC/dt <= 1+p

也就是说,在从先前同步开始经过At秒之后,两个时钟最多分开2pΔt。

当保证在操作执行时没有大于&的偏差时,必须至少每&/2p重新同步软件。

网络时间协议(NTP)

在许多协议中很常见,[Cristian,1989]首先提出的方法是一种与客户服务器通信的方法。由于时间服务器具有WWV接收器或具有准确的时钟,因此它可以提供当前时间。在与服务器通信时,重要的是延迟报告消息传播延迟的时间,但是通过估计延迟,这里可以最小化错误。目前,已知NTP能够在1至50毫秒的范围内实现精度。

伯克利算法

在诸如NTP的许多算法中,时间服务器是被动的并且仅回答查询。另一方面,在Berkeley算法中,时间服务器接收每个参与节点所持有的时间,并且还基于平均值改变其自己的时间。当时间值不必与现实世界有关系时,很容易在同一当前时间达成一致,并且它对此算法有效。

3.逻辑时钟

到目前为止,虽然我们描述了一种根据实际时钟将时钟与绝对时间同步作为参考的方法,但通常只执行相对同步。这里,逻辑时钟的概念用于确定相对顺序。

3–1. Lamport的逻辑时钟

为了同步逻辑时钟,Lamport定义了一个名为happen-before的关系。表达式a→b表示“a发生在b之前”,这意味着事件首先发生,然后所有进程都同意事件b将发生。发生之前 — 可以在以下两种情况下直接观察到关系。

如果a和b是同一过程中的事件且a出现在b之前,则a→b为真。

  1. 如果a是由一个进程发送的消息的事件,并且b是由另一个进程接收的该消息的事件,那么a→b也是如此。在发送消息之前无法接收消息,即使消息同时也需要有限的非零时间。

因为发生前关系处于过渡关系中,如果a→b和b→c,则可以证明a→c。如果事件x,y出现在不交换消息的不同进程中,则x→y和y→x都不为真,并且这些事件被认为是并发的。 (之前发生的关系未知。)

利用逻辑时钟,通过分配所有进程对每个事件a一致的时间C(a)来测量相对时间。如果这些时间值是a→b,则通过向时间添加正值来校正它们,使得C(a)<C(b)。通过分配如下图所示的时间值,可以掌握之前发生的关系。

在Lamport的逻辑时钟中,如果a→b,则可以证明C(a)<C(b),但如果C(a)<C(b)则a→b不一定成立。换句话说,a→b是C(a)<C(b)的必要条件,并且不是充分条件。 Lamport的逻辑时钟增加了改进,它是一个矢量时钟,可以满足这种必要和充足的条件。

完全有序的多播

有关详细信息,请参阅“分布式系统一致性”一文中的内容

在许多情况下,有必要在重复的副本之间执行完全有序的多播。换句话说,所有消息都需要以相同的顺序传递给每个收件人。 Lamport的逻辑时钟可用于在完全分布式系统下实现完全有序的多播。

当进程收到某个消息时,它会根据时间戳按顺序放入本地队列。收件人向另一个进程多播确认。如果您按照Lamport的算法调整本地时钟,则所有进程实际上都具有本地队列的相同副本。只有当消息位于队列的头部并且被所有其他进程确认时,才有一个进程可以将队列中的消息传递给正在运行的应用程序,因此,所有消息都以相同的顺序传递到各处。换句话说,已经建立了完全有序的多播。

3–2. 矢量时钟

使用矢量时钟,可以掌握Lamport逻辑时钟无法掌握的因果关系。 假设事件a的向量时钟是VC(a),则执行以下步骤,使得a→b成为VC(a)<VC(b)的必要和充分条件。

在通过网络发送消息之前,节点Pi向矢量时钟VCi [i]添加1,或者操作一些内部事件。

  1. 如果处理Pi将消息m发送到Pj,则Pi在执行前一步骤之后将m的向量时间戳ts(m)设置为等于VCi。

  2. 当接收到消息m时,进程Pj执行步骤1,将消息分发给应用程序,然后更新其自己的向量时钟的每个k,如下所示:VCj [k]←max {VCj [k],ts(m)[k]}。

因果关系多播

通过使用向量时钟,可以实现稍微弱于上述完全有序多播的因果有序多播。

通过比较矢量时钟的值并掌握发生在之前的关系,对于特定事件x,其他事件可以被分类为过去事件,并发事件和未来事件。例如,在上图中,当事件d用作参考点时,过去事件是a,b,c,i,并发事件是j,l,m,未来事件是f,g,h。

此时,假设因果有序多播是过去事件和因果事件的序列,其中发生所有因果关系,以便在所有过程中保持一致,但是关于并发事件的顺序是无关紧要的。通过这种方式,与Lamport的逻辑时钟不同,可以用向量时钟来掌握因果关系。

4.独家控制

多个进程之间的并发操作和协作操作是分布式系统的基本,但是为了保证对资源的独占访问,以便通过多个进程同时访问相同资源时不处于不一致状态时,需要分布式排他算法。

分布式独占控制算法可以分为以下两种类型。

基于Token的解决方案

基于权限的方法

在基于Token的方案中,很容易避免Starvation(很长时间内不允许访问资源)和死锁(多个进程等待彼此的进展)。一个代表性的例子是Token环算法。但是,当持有Token的过程异常停止并且Token丢失,有必要只生成一个新Token,这种复杂性是一个严重的缺点。

许多其他分散的独占控制算法采用基于权限的方法,并有许多不同的获取权限的方法,我们将分别具体解释。

4–1. 集中算法

通过模拟单处理器系统的功能,可以轻松实现分布式系统中独占控制的单一访问。在集中式算法中,一个进程被指定为协调器,并且当进程访问共享资源时,请求消息被发送到协调器以获得许可。如果其他进程未访问共享资源,则协调器返回权限响应,并且在接收到回复之后,所请求的进程执行该进程。

很容易看出,该算法保证了对资源的独占访问,但它具有单点故障的严重缺点。虽然这可能是大型系统中的性能瓶颈,但这种简单性带来的优势仍然可以弥补这些缺点。

4–2. 分散算法

假设各项都会重复n次。在分散算法中,当进程访问资源时,需要批准大多数m> n / 2。如果获得大多数批准,则该过程获得许可并可以进行处理。

虽然该方案解决了集中式算法的单点故障问题,但是如果有太多的节点试图访问,则存在另一个问题,即没有节点可以获得足够的投票而无法获得充分的性能。

4–3. 分布式算法

在该算法中,假设系统上所有事件的顺序可以定义为完全有序的关系。作为这个基础,使用了前一章中描述的Lamport的逻辑时钟,并且假设没有消息会丢失。

当进程尝试访问共享资源时,它会创建一条消息,其中包含资源名称,自己的进程号和当前逻辑时钟,并将其发送给所有其他进程。当接收到该请求消息时,根据其自身状态执行以下操作。

  1. 如果收件人未访问该资源且未尝试访问该资源,则收件人会向发件人返回“确定”消息。

  2. 如果收件人已在访问资源,请不要回复并执行排队请求。

  3. 如果收件人正在尝试访问资源但尚未完成,请将输入消息中的时间戳与发送给其他进程的消息中的时间戳进行比较,并将较低的一个作为获胜者。如果收到的消息具有小的时间戳,则收件人返回OK消息。如果自己的消息具有较小的时间戳,则接收方将不会将输入消息排队。

显然,如果它不像process1或2那样冲突,这个算法就能正常工作。即使在冲突的情况下,也只建立了唯一一个进程可以访问的条件。

与集中式算法一样,该算法可以保证独占控制,不会出现死锁或饥饿。 此外,没有单点故障。 尽管如此,单点故障被故障n位置特征所取代。 它可以通过回复权限或拒绝权限并引入超时来解决,但也会出现其他问题,例如需要多播通信原语。 不幸的是,目前尚未设计出超越集中式算法的分布式算法,并且仍在研究中。

当比较各个算法时,变为如下。

5.领导者选举算法

许多分布式算法需要一个特殊的过程,它具有领导者作为协调者或发起者的角色。哪个过程是领导者,唯一过程是否可以成为领导者是一个重要问题,研究人员在过去几十年中一直在努力。

5–1. 欺负算法

当协调员失败并且任何进程P注意到该情况时,P根据以下过程激活选举。

· P向所有具有比其自身更高数值的进程发送ELECTION消息。

· 如果没有人回复,P将赢得选举并成为协调员。

· 如果来自具有高于P的数值的过程的答案,则将替换它。 P的工作结束了。

使用该算法,可以唯一地确定协调器。但是,该算法需要大量的消息和数据流量,可以说是冗余的。作为替代方案,存在环算法。

5–2. 环算法

与一般环算法不同,该算法不使用Token。发现协调器不工作的任何进程构造一个包含其自己的进程号的ELECTION消息,并将该消息发送给其后继者(环网中的下一个节点)。如果继任者失败,请跳过。如果没有比您更高的数值的节点,您的消息将仍然返回给您自己的进程号,因此它将被指定为协调员。

在该算法中,执行具有减少数量的消息的领导者选举,但是还可以通过将消息的目的地设置到两个相邻节点来实现具有较少量数据流量的算法。

6.阻止链和同步作为分布式系统

因此,在作为分布式系统之一的块链中,进程之间的同步如何发生?

6–1. 区块链和时钟同步

块链和逻辑时钟

首先,考虑是否可以使用区块链中的物理时钟来掌握绝对时间关系。如第2章所述,参与网络的每个节点并不总是保持正确的物理时钟,并且应该存在时钟偏差。由于比特币区块链的平均生成时间是10分钟,因此认为即使一定程度的大时钟偏差也是可接受的。然而,当节点散布在世界各地时难以同步各个物理时钟,并且还可能存在伪装时钟的节点。通过引入网络时间协议(NTP)来重新同步节点之间的正确时间是一项困难的技术。

区块链和逻辑时钟

因此,准备逻辑时钟而不是物理时钟是切合实际的。实际上,通过在块中加入时间标记,可以制备出与Lamport逻辑时钟非常相似的机制。

如[比特币:点对点电子现金系统Satoshi Nakamoto]中所述,对作为矿工的区块执行写操作的每个节点本身具有作为时间戳服务器的角色。每个时间戳通过在其哈希中包含前一个时间戳来形成链。但是,无法保证这些节点保持正确的物理时钟。时间戳的数值,即每个事务的顺序和时间相对模糊。

由于时钟的这种模糊性,有可能会进行双重付款。但是,在比特币区块链中,只有最长的链是合法的,在次要验证后丢弃不正确的交易。因此,区块的顺序随着时间的流逝唯一确定。随着每个时间戳的增加,前一个时间戳被加强。

总之,在区块链中的模糊时间戳下,事务的顺序一致性是不准确的。然而,利用链式连接的简单机制,每个交易的发生前关系随着时间的推移而建立。此外,还有一种激励结构,以便矿工转移到良好,交易不一致的顺序不会发生。

可以说,实现类似于Lamport的逻辑时钟的时钟同步方法,因为事务之间的相对顺序关系,即发生在之前的关系变得更清楚。

对于大多数交易,没有因果关系,因此如果您引入向量时钟并采用因果关系排序的概念,则可以极大地放松订单关系的约束。然而,在区块链中,由于结构本身默认共享所有块的顺序关系,所以保持总排序(相对于在一段时间之后的块)。

6–2. 区块链和独占控制算法

即使在作为分布式系统的区块链中,也需要排除控制。在区块链网络中,每个节点并行地异步操作。此时,要共享的区块链本身的信息不应该不一致。

PoW·PoS中的独占控制算法

如第4章所述,分布式排他控制算法可分为以下两种类型。

· 基于Token的解决方案

· 基于权限的解决方案

PoW和PoS是基于权限的,其中,可以说它是类似于分布式算法的机制。那么,您什么时候获得访问资源的权限?是的,就在你找到一个随机数时。

在PoW中,只有当找到在哈希值后跟0后跟n为0的随机数时,才可以执行有效的新块写操作。执行操作的矿工将其广播给所有矿工并分享。

通常,当节点找到一个nonce并创建一个比他自己更早的块时,minor会同步该信息并移动以搜索下一个nonce值。这是因为如果您使用最长链被认为合法的规则搜索下一个nonce值,它们可以获得更多利润。尽管PoS优先为具有较大硬币持有量的人提供资源访问,但基本排除控制算法结构也类似于分布式算法。

但是,严格来说,不执行排除控制。这是为了在公共时间内同步并形成共识10分钟,直到下一个区块为止。当两个或更多个节点同时找到随机数值时,写入操作以非独占状态执行。此时,由于只有最长的链被认为是合法的,因此区块链网络中的信息与时间的流逝保持一致。叉子发生的一个问题是因为没有执行严格的排他控制而且没有确认最终结果。

BFT类型的独占控制算法

另一方面,通过BFT类型,基于许可的分散算法执行排他控制。该算法解决了分叉和终结问题,这是PoW中与分布式算法类似的问题。

在BFT类型中,只有一个名为Proposer,Orderer等的节点有权生成新区块。创建区块时,您可以从所有参与节点收集投票,获得超过2/3的同意,您才有权创建新块。此时,有必要同意超过2/3而不是多数的原因是处理拜占庭故障,有关此问题的详细信息在“分布式系统中的容错”一文中有所描述。

在BFT类型算法中,与PoW等不同,只有一个节点可以获得对区块链的独占访问权限,因此不会立即确定fork和finality。但是,任何人都可以作为矿工参与网络的财产往往会丢失。

6–3. 区块链和领导者选择算法

PoW,PoS和领导者选择算法

区块链上的领导者选择算法类似于独占控制算法的机制。在比特币中,用于选举领导者的算法,即,新创建块的节点是PoW。

PoW允许添加一个块作为一个好的领导者,为比特币网络提供有计算复杂性和发现nonce的节点。每个成为领导者的矿工都会尝试为比特币网络做出贡献,因为更容易早期同步到首先发现现时的节点并开始搜索下一个块的现时值更有可能获得奖励。尽管存在链条完全由硬叉分支的问题,但是通过基于博弈论准备非常简单的激励结构,在块链网络中实现作为分布式系统的同步。

在以太坊的情况下,由于块生成的时间很短,因此倾向于发生更多的分叉。关于这一点,通过采用unkle块的概念,我们实现了一种结构,即使产生不合法的链条也会给予一定的奖励。

将来引入未来的PoS允许优先生成具有大硬币保持量的节点的块作为引导者。这是一种解决/改善PoW中必要电量变得巨大且易受51%攻击的问题的算法。这是一种基于博弈论的选举算法,如果一个节点持有大量硬币,就不会采取破坏网络等恶意行为。

BFT和领导者选择算法

BFT类型算法的问题在于如何选择将投票给块生成的领导者作为Proposer或Orderer。

在PBFT采取的HyperLedger当中,原为可信赖的机构才会注册为Orderer。 但这是集中式的领导者选择方法,与分布式系统存在着明显的区别。

在Tendermint协议当中,领导者以循环方式被选出,以通过与不同验证者的轮换交替来提出建议。 此时,领导候选者是基于PoS,并且可以说是可以在分布式系统中实现领导者选择的算法之一。

相关文章:

hdu 2199 Can you solve this equation? 二分

1.精度问题 由于是double类型&#xff0c;rmid 而不是rmid-12.如果首位两端&#xff08;f&#xff08;0&#xff09;和f&#xff08;100&#xff09;&#xff09;同号&#xff0c;证明解不在[1,100]区间内 这是我之所以TE的原因&#xff0c;没有预先判断3.若在这个区间内&#…

iOS iTunes Connect协议更新导致无法构建新版本

最近公司项目发新版本时遇到不能构建新的版本的情况, 了解后才知道 必须同意更新后的协议才能构建新版本、创建内购App&#xff0c;提交新的App 点击其中的蓝色文字进入相关界面 这样就可以构建新版本了 参考博客: http://blog.sina.com.cn/s/blog_134451adb0102wger.html

白话hash和数字签名,保证你看得懂

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 摘要&#xff1a;最近有朋友在后台问为啥最近老介绍hash相关文章&#xff0c;其实hash算法在信息安全中非常重要&#xff0c;尤其是作为数字…

几种Windows进程通信

32位Windows采用虚拟内存技术使每个进程虚拟4G内存&#xff0c;在逻辑上实现了对进程之间数据代码的分离与保护。那么相应的进程之间的通信也就有必要整理掌握一下。 Windows进程间通讯的方法有很多&#xff1a;管道、邮件槽、剪切板、共享内存、消息、套接字、RPC、DDE等。 但…

TestNG学习随笔

转载自&#xff1a;http://blog.sina.com.cn/s/blog_68f262210102vh5c.html 通过本人实践&#xff0c;文中所讲的程序可以正确运行&#xff0c;作用正确&#xff0c;并且浅显易懂。以下就是我从中摘录的重要知识点&#xff0c;就当留作自己记录或者帮助其他想学TestNG的人一点借…

录制短视频的录制按钮边框计时效果

项目增加录制短视频功能, 需一录制功能按钮, 使用贝塞尔曲线结合shapelayer绘制按钮边框的计时功能 代码如下: #import "YGRecordView.h" #define BeforeRecord_LineWidth 2.0#define BeforeRecord_LineColor UIColorFromRGBA(0xffffff, 1)#define Record_LineWidt…

区块链学堂:区块链引子

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链学堂&#xff08;1&#xff09;&#xff1a;区块链引子 相信正在看这篇文章的读者一定已经听说过区块链了&#xff0c;并且也相信…

Git命令文本手册

git init # 初始化本地git仓库&#xff08;创建新仓库&#xff09; git config --global user.name "xxx" # 配置用户名 git config --global user.email "xxxxxx.com" …

Mininet的介绍安装

Mininet的介绍 Mininet是一个强大的网络仿真平台&#xff0c;通过这个这个平台&#xff0c;我们可以很方便的模拟真实环境中的网络操作与架构。当前SDN/OpenFlow发展的如火如荼&#xff0c;但是在真实网络中又不可以进行相关的网络实验&#xff0c;自然需要一个仿真平台可以对这…

项目的简单总结一 -- 关于对贝塞尔和shapelayer结合使用的动画特效

现项目基本稳定, 要开始新的项目, 总结一二 关于对贝塞尔和shapelayer结合使用的动画特效, 在这次的项目中有几处使用到 故做了个小的demo, 记录下 效果如下: demo地址:https://github.com/wyon0313/BezierAnimation

内部区块链的优缺点

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 内部区块链的优缺点1 区块链的作用是取代可信赖的第三方&#xff0c;或者是在不完全相互信任的实体之间建立信任关系&#xff0c;如此看来…

Spring框架系列之AOP思想

微信公众号&#xff1a;compassblog 欢迎关注、转发&#xff0c;互相学习&#xff0c;共同进步&#xff01; 有任何问题&#xff0c;请后台留言联系&#xff01; 1、AOP概述 &#xff08;1&#xff09;、什么是 AOP AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意为…

jstack 使用(转)

dump 文件里&#xff0c;值得关注的线程状态有&#xff1a;死锁&#xff0c;Deadlock&#xff08;重点关注&#xff09; 执行中&#xff0c;Runnable 等待资源&#xff0c;Waiting on condition&#xff08;重点关注&#xff09; 等待获取监视器&#xff0c;Waiting on monit…

ios TableView编辑状态多选框的修改

在- (void)layoutSubview 和 - (void)setEditing:(BOOL)editing animated:(BOOL)animated 中添加 UIImage *selectImg [UIImage imageNamed:"im_select_sign"]; UIImage *disSelectImg [UIImage imageNamed:"im_disSelect_sign"]; for (UIC…

区块链有哪些技术特征

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链有哪些技术特征 在信息网络化的大背景下&#xff0c;当需要与不熟悉的对手方进行价值交换活动时&#xff0c;人们如何做才能防止不会…

《JavaEE开发的颠覆者——Spring Boot实战》是一本好书

这本书的风格非常好、每一节都是先点明这一块知识的要点&#xff0c;随后就手把手的做出一个最简明、但有能体现核心的实例&#xff08;大多只有几个Class&#xff09; 这样的书用来熟悉一门框架&#xff0c;实在是再好不过。转载于:https://www.cnblogs.com/nanlan2017/p/1045…

html css 布局知识概况

1、如果想设置页面居中&#xff0c;当设置margin属性为auto的时候&#xff0c;不能在设置浮动或绝对定位属性。并且一定要设置width为一个定值 2、盒子模型三维立体结构图 3、浮动布局 利用浮动可以实现横向布局&#xff0c;通过float来实现&#xff08;left--左浮动&#xff0…

项目的简单总结二--可拉伸的头视图

项目总结二 tableVIew和collectionview中头视图的可拉伸放大效果 demo中只做了tableview的效果, collectionview做法一样 效果如下图: demo地址: https://github.com/wyon0313/ZoomHeaderView

浅谈区块链技术

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 浅谈区块链技术 这几天空闲的时候在网上浏览了一些区块链的技术&#xff0c;其实区块链只是一个技术&#xff0c;只不过是比特币很好的实…

IIS 7.5 去掉index.php 西数服务器

//新建web.config 加上下面代码<?xml version"1.0"?> <configuration> <system.webServer><rewrite><rules><rule name"OrgPage" stopProcessing"true"><match url"^(.*)$" /><condit…

bzoj1927: [Sdoi2010]星际竞速

跟上一题几乎一样。。。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define rep(i,n) for(int i1;i<n;i) #define clr(x,c) memset(x,c,sizeof(x)) #define op() cl…

在cell中取得UITableView所在的ViewController对象

原来碰到这个问题一般会将控制器传进cell中, 或者将cell要做的响应事件回调到控制器去处理, 前段时间找到一种方法觉得很不错 - (UIViewController *)getTableViewSuperViewController { for (UIView* next [self superview]; next; next next.superview) { UI…

区块链当前现状

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链是分布式账本技术&#xff0c;用于记录交易数据&#xff0c;具有不可篡改性、完整分布性、可追溯性等技术优势&#xff0c;应用包括…

MVC 4.0 Razor模板引擎 @Html.RenderPartial 与 @Html.RenderAction 区别

近来在学习MVC 4.0&#xff0c;设置布局全局网页的页脚&#xff0c;使用了Razor语法 {Html.RenderPartial("Footer", Model.FooterData);} 但是并不理解Html帮助器方法Html.RenderPartial。 先来介绍一下Html.RenderPartial用法。 Html.RenderPartial在Asp.net Mvc中…

iOS 图片处理-利用GPUImage 磨皮和美白图片

项目中要求处理图片, 简单记录一下美白和磨皮过程 (其中GPUImage还有美颜滤镜, 使用方式基本一样) //磨皮 - (void)editPhotoByBilateralWithLevel:(CGFloat)level { GPUImagePicture *pic [[GPUImagePicture alloc] initWithImage:image]; // 磨皮滤镜…

linux下编译php扩展

1 在pecl.php.net搜索你需要的php扩展 2 在解压后的扩展目录运行phpize 3 执行编译./configure --with-php-config/usr/local/php/bin/php-config 4 修改php/lib/php.ini文件 加上这句话extention扩展.so的绝对路径转载于:https://www.cnblogs.com/wyqn/p/8493456.html

区块链技术原理

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 以比特币的区块链为例&#xff0c;你可以把区块链想象成一个比特币的公共账本&#xff0c;这个账本&#xff1a; 1.存放在互联网的各个比…

Spring之事务管理配置

1. 基于注解的事务配置 1. 在需要添加事务的方法上加上Transactional注解2. Spring的配置文件中配置事务管理器1 <!-- 添加事务管理器组件DataSourceTransactionManager -->2 <bean id"transactionManager"3 class"org.springframewor…

iOS 图片处理-图片旋转和裁剪

项目中要求处理图片, 简单记录一下图片旋转和裁剪过程 /** 将图片旋转弧度radians */- (UIImage *)imageRotatedByRadians:(CGFloat)radians{ // calculate the size of the rotated views containing box for our drawing space UIView *rotatedViewBox [[UIView alloc…

ThinkPHP 3.1.2 视图 1

一、模板的使用 &#xff08;重点&#xff09;a、规则模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html&#xff08;.tpl&#xff09;更换模板文件的后缀名&#xff08;修改配置文件&#xff09;TMPL_TEMP…