【转载请标明出处】: https://blog.csdn.net/qq_25870633/article/details/82057232

本文章参考自:

https://blog.csdn.net/lcloveyou/article/details/80289258

https://jiasule.v2ex.com/t/446575

首先今天我们来说一说HashGraph是个什么东西,在当下的区块链之所以没有被大规模的应用落地,其中TPS的瓶颈就是其中之一也是比较重量级的问题,所以充满了智慧的人类们想出了:侧链、超级节点、分片、DAG、HashGraph等等手段来提升区块链的TPS;我们在之前的文章 DAG模型讲解及IOTA中的使用 中已经了解到了提升TPS的DAG方案,那么我们今天要讲的HashGraph也是基于DAG的,Hashgraph 是一种数据结构和共识算法。Hashgraph 不是数字货币,也不是区块链(因为它其实是 DAG 图,并非是链式结构);

首先我们来看几张对比图来看看hashgraph是如何如何的牛逼,怎么怎么的神级的:

图一:

图二:

图三:

在看完牛逼高大上的图片后,我们再来了解下几个东西。【不明白没关系,先记住我们往下看就可以】:

【一】:hashgraph中节点通过gossip协议进行通信,也就是说每个节点重复的随机的同步其他的节点

【二】:hashgraph中是使用event来记录交易信息

【三】:底层实际上仍然是DAG

【四】:异步拜占庭

【五】:是用了虚拟投票

在HashGraph中我们是用Event 来记录交易信息的,类似于Block,event的内容为:前两个event的hash值、当前时间戳及若干笔交易:

即:在 Hashgraph 中,每一个节点都在传播经过签名的已经从临近节点接收到Event的新打包event。当某个节点收到包含新交易信息的数据后,会组合并可能添加自己所知道的交易成为一个新的Event。Event是一个数据结构,除了包含自己的交易外,还包含它的之前的两个时间的hash。

假设目前全网的节点为A、B、C、D四个节点,且每个节点现在都有一个创世event,我们用竖线代表时间轴,如图:

紧接着:B节点随机的把自己的event【黄色】广播给了D节点,D节点就会创建一个新的event【红色】,这个新event里除了加入新的交易事务的同时,还会加上两个指向父区块的hash值,一个指向自己的最新区块【蓝色】,一个指向B和自己聊天时候最新的event【黄色】(这一点类似于Git使用hash实现的链接,只不过git是单父亲模式)

然后对整个事件加上时间戳并签名并继续开始随机广播重复上述动作,整个循环不断进行直到所有节点都获得相同的信息。

最后整网的event及节点从逻辑上是如上图这样表现的;

Event包含交易、两个hash、时间戳、签名,通过gossip协议通信

由于每个节点都会通过gossip维护一个散列图(最终每个节点都会记录着所有交易信息),所以每个节点计算共识投票的时候可以发起虚拟投票,也就是计算其他节点在给定的散列图中会怎么投票,从而不需要在网络上再做大量节点间的双向同步通信。

【注意】:

在某一时刻,不同节点的散列图中最新的区块可能都各不一样,但是更早些的区块和继承关系都是一致的, 而且随着时间的推逝和八卦的积极进行,他们的散列图会收敛到相同的结果。这里的一致指的是如果两个节点的散列图里都有区块x,那么这两个x都会指向相同的两个父区块。

Hashgraph里每个节点都会试图整理区块的顺序,这时节点就会对自己发起共识提案,例如“区块a是否早于区块b”,然后节点会照着自己保存的散列图有如精分一般遵从写死的代码逻辑和规则的从每个已知节点的角度进行投票计票和共识运算。这里的共识是异步的,意味着每个节点会在不同时间点发起虚拟投票,做出决定,并且自信满满地相信这个提案在全网络下会获得相同的决定(即共识)。还是那句话,共识迟早会进行并达成,只是有早有晚。

虚拟投票:

上面我们看到了 Hashgraph 如何在节点之间通信,但这仅仅只是通信步骤,节点之间达成共识还需要虚拟投票机制,为什么说是虚拟投票,因为通过执行gossip算法后所有节点都是全节点(为什么这么说?因为随着时间的推移,所有节点上都会引用了整网的event啊!!上面就有说了),都存储了完整的网络历史(可能不同时间节点存储的不一样!但是最终都会趋向一样!),在需要对某一提案达成共识时并不需要大规模的消息通信,每个节点独立执行投票算法,并且所有节点一定会得出相同的共识结果(因为知道最终大家所村的信息都会趋向一致,虽然不同时间存储的不一样,所以就会自信满满的相信,大家自己所算的结果也会和我的一致)。

【Hashgraph的几个重要的概念】:(8个)

  • round(轮次:是hashgraph中一个重要的概念,所有的节点收到event时都以同样的方法计算。 按照时间水平线划分round。每个round都有一个编号index,每个节点在round[r]中创建的第一个event就叫做witness。一旦出现一个可以see 三分之二个witness的event的时候,从该event起就是新的round[r+1]了。
  • round created(创建轮次):一个event的创建轮次是: R 或者 R+1,其中 R 是该事件父节点的最大轮次。当且仅当event能强可见绝对多数的 R 轮见证人,则该事件的创建轮次为 R+1;换句话说,( 按照时间水平线划分round。每个round都有一个编号index,每个节点在round[r]中创建的第一个event就叫做witness。一旦出现一个强可见三分之二个witness的event的时候,从该event起就是新的round[r+1]了,那么这个新的r+1的round就是创建轮次)

简单来说,某个event在节点上传来传去,总得有个头才行,因为对一个没听过这个event的新节点而言,听到这个event的时候,自己签名加入transaction之后就是一个新的event了;

整个hashgraph的目标:【是就这些event的发生次序在整个节点网络达成共识,同时实现异步BFT。对于某个event而言,从见证人到知名见证人的转变,就好比比特币区块链上确认数从1个到6个的过程,对于这个event的确认信心逐渐增强的过程,当知名见证人达到绝大多数的时候,这个普通event就被整个网络确认了】,然后确认下一个event,这样一个一个将不断新加入的event定好顺序

  • round received(接受轮次)如果 R 轮(创建轮次)中的所有知名见证人可见【注意这里不要求是强可见哦】某一普通event,则该event的接受轮次就是 R 轮,如果某普通event没有被 R 轮所有知名见证人可见,则它的接受轮次一定晚于 R 轮。【其实也就类似于,被6个块所引用的块叫做确认块是一个道理】
  • witness(见证人)每一节点在每一轮次中创建的第一个Event被称为见证人(也可看作该轮次中相对的先祖evnet)。某节点也有可能在某一轮次中没有创建见证人event。
  • famous witness(知名见证人):如果 R 轮的见证人能被绝对多数(三分之二)的 R+1 轮见证人可见,则它就是知名见证人。(因为出名了啊,下一轮的见证人都能看到你怎么会不出名呢?)

【其他几个概念】

  • supermajority (绝大多数):超过 2/3 以上节点的数量

如果Alice作假,自己产生了两个新区块b和c都指向自己的最后的一块区块a,那么在Alice的纵轴上就会从链状变成树状,等于进行了分叉攻击。如果Alice把b的存在告诉了Bob,而把c的存在告诉了Carol,那么Bob和Carol这两个节点所进行的虚拟投票就会变得不一样(分叉了)。为了防止这个问题的发生,Hasgraph引入了可见(Seeing)和强可见(Strongly seeing)的概念。

  • seeing (可见):当事件 B 可以沿着哈希指针(不论路径有多长哦)找到事件 A,那么事件 B 就可见事件 A
  • strongly seeing(强可见)当事件 B 能找到事件 A 的所有路径中跨越了绝对多数的节点(就是说B找A的路径上的event相互引用跨越了全网三分之二节点)那么事件 B 强可见事件 A。经过数学论证是可以保证两个强可见的event在虚拟投票时能获得一致的结果,简单理解就是:件A和B的发生次序(order)得到了全网节点的共识

实际上就是,由强可见保证了两个节点在虚拟计票的时候,能够获得一致的结果。从而为作为Hashgraph能够达成最终拜占庭一致的理论基础。

虚拟投票:

(每个节点都可以在本地通过虚拟投票的拜占庭协议来决定某见证人区块是否是知名见证人。每个r+1轮的见证人区块都会对某第r轮见证人区块进行投票;而第r+2轮的某一见证人会对第r+1轮的投票进行计票,即第r+2轮的见证人会从自己可以强见到的第r+1轮见证人那里收集投票结果。一旦某个投票结果(Yes or No)的计票数目超过绝大多数,第r+2轮见证人就可以决定出投票的结果(decide),就算达成了共识)

简单理下:某个第一代先祖是否知名?,必须由第二代先祖来投票他们是否可见第一代祖先,而具体的计票则由第三代先祖进行,第三代先祖肯定是可以强见绝对多数的第二代先祖的(参看创建轮次的定义),所以第三代先祖可以看到并记录下第二代先祖的投票,并且决定投票结果。

任何一个第三代先祖如果能对投票结果(Yes or No)做出决定,那么这个结果就是全网的结论。

【注意】:如果这一轮(这个第三代)的见证人没发做出决定(没有任何结果超过绝对多数),那么则会继续交由下一代先祖来计票做决定,直到某轮某个先祖得出明确的结果。文中还有另一理论证明,只要每十轮增加一个随机轮(Coin round),投票肯定终究能完成。在随机轮中,见证者不会做出任何决定,如果见证人收集到了绝对多数的结果,他会根据结果进行附议投票,否则,见证人则根据自己的数字签名进行随机投票。

在正常情况下,大部分的event并非见证人event,所以对于这些event都不会举行上述的选举知名见证人的投票。而且大部分见证人会在第一轮投票中被一致通过或否决。所以大部分的选举投票不会耗时太过漫长。此外,一旦所有知名见证人被确定下来,整个网络里的event顺序(所谓公平性)也就能被更快更容易被推导出来。

为了确定区块顺序所以引入了接受轮次(received round)的概念,每个event除了创建轮次外还有接受轮次,第r轮(创建轮次)中所有的知名见证者可见的任何普通event都会被赋予第r轮的接受轮次。如果有的普通区块没有被所有知名可见证者看到,则它的接受轮次未定,而且肯定会比r更晚。

在确定了接受轮次后,则对所有event做排序,先按照接受轮次从低到高排,一样的话按照时间戳从早到晚排序,如果具备序号一样的话,则按照event的签名与某随机数异或出来的结果来排序(将该轮中所有知名见证者的签名进行异或可得到该随机数),这样得出的顺序被称作共识顺序(Consensus order)

具体的投票过程如下所示:(图中也会对 知名见证人,创建轮次,接收轮次等概念做以讲解)

我们从上述的描述中知道了,节点在round中创建的第一个event叫做witness(见证者),如下图:(中A节点的witness就是A1,A2,A3,同理其他三个节点的也是图上红色的event)

然后第二轮的因为我们可以看到 D2 event 可以强可见(路径跨越了全网三分之二节点)绝大多数(三分之二) 1轮的见证人,所以从D2开始属于 第2轮次;然后A2、B2、C2 分别是第2轮次中的其他三个节点上的见证人。依次3轮次和4轮次都是(妈的 4轮次感觉不是强可见绝大多数3轮的见证人啊。。。图有毒?)

虚拟投票的核心是先对于每一个见证人我们都需要判断是否是 知名见证人?

下面我们来举例说明如何判断B2是否 知名见证人的:

我们从 知名见证人的定义中知道,一个见证人是否知名,是由相对于它的下一轮次中的 见证人对当前见证人是否可见的数据超过了 三分之二 来决定的,但是这部分统计的操作是由 下下轮次的见证人来记的,如:

B2是否是famous witness首先由A3,B3,C3,D3判定。然后对于判定的计数又是由再后面一个round中的witness决定的

首先,A3可见 B2,表示有一个从A3到B2的路径。换句话说,B2是A3的一个祖先,A3是B2的一个后裔。A3可见 B2,所以A3给B2投yes认为B2是 famous witness。

同样的 B3也可见B2,所以B3也认为B2是 知名见证人,投了yes。

同理,C3也是由于可见B2,也认为B2就是它所谓人的 知名见证人,投了yes。

同理,D3也是投了yes。那么在上面我们知道了 A3、B3、C3、D3都对B2投了yes。根据知名见证人的概念我们知道B2就是知名见证人了。

是到此投票还没有结束,因为我们接下来还需要统计票数。(交由下下轮次的见证人来统计)

投票的统计将在下一个round进行。所以B4来统计票数或者是D4统计票数。

因为第三代先祖肯定是可以强见绝对多数的第二代先祖的(参看创建轮次的定义),所以第三代先祖可以看到并记录下第二代先祖的投票,并且决定投票结果。

上图中没有A4和C4.但是随着时间的推移,hashgraph越来越大,A4和C4也会出现,他们也可以对投票进行计数。所以:

B4 收集它能够 强可见的 见证人(及第2轮次的见证人)的投票结果。

在这个例子中,B4能够强可见A3.绿色的那条路径,实际上已经B4由多条路径到达A3.所以B4是强可见 A3的.

同样的,B4 强可见 B3.

同理,B4 强可见 D3。

至此,B4收到了超过 三分之二的yes票,所以B4可以认定投票结果是yes。所以绿色的B2节点现在就是 知名见证人了。【注意】:根据数学理论证明,任何一个 R+2 轮见证人如果对投票结果做出了决定,那么这个结果就是全网的结论,如果这轮见证人无法做出决定,就由下一轮见证人计票决定,直到得出确切结论。

假如在下一轮无法做出决定(例如 2:2 的投票结果),则将延续到下一轮,根据数学定理只要我们在每十轮增加一个随机轮次( coin round ),则选举过程最终一定会结束(以概率 1 收敛,通俗点说就是几乎必然收敛,这是概率论中的概念)。在随机轮中,收集到绝对多数结果的见证人仅投票而不做决定,而其他见证人则根据数字签名的中间位进行随机投票。

那么我们再往下看,C2是不是 知名节点呢?:

上图中黄色路径表明,C3能 可见 C2,所以C3投票yes。但是A3,B3,D3不可见 C2,所以它们投票为No。

由于 B4 强可见 A3,B3,C3, D3,所以它将统计投票结果,投票分别是No,No,Yes,No,所以结果是No。所以C2不是知名见证人啦。

经过一系列的过程后,我们可以看到A2,D2,A1,B1,C1,D1都是 知名见证人。

但是在这个过程中,我们可以看到,大多数event都不是 见证人,所以对大多数的event 来说都没投票。大多数证人在第一轮投票中以几乎一致的投票被宣布为 知名见证人的。所以大多数选举不会持续很长时间 (这就是 共识很快的原因)

在上面的演示中,我们已经确定了round 2中每个 见证人的声望(即 A2、B2、C2、D2的是否知名见证人的声望)。一旦一个round中的所有见证人的声望已经确定,那我们就可以为一组event找到 接收轮次 和 共识时间戳。

如:

首先考虑A2以下的灰色event,这个event(黑色的event)能够被round2中的每个 知名见证人 可见(如图中红色、绿色、蓝色路径所示)。【注意】:这里仅仅要求 可见,而不是 强可见。这里不要求C2 可见,因为C2不是 知名见证人。

因为黑色的这个event能够被round 2中的所有  知名见证人 可见,所以我们就说这个黑色 event 的 接收轮次 为round 2【看上面 接收轮次的概念也会明白的】

【接下来我们开始确定黑色事件的共识时间戳用于后续确定共识顺序】

寻找 A 节点最早的事件 X,它既是 A2 的祖先也是黑色事件的儿子,同理寻找 B 节点的 Y 和 D 节点的 Z。然后将 XYZ 事件的时间戳依次排序并取中位数作为黑色节点的共识时间戳。然后我们继续确定其他节点的接受轮次。

以此类推,

我们可以找到6个黑色event和4个深绿色event的共识。一共就由10 个接受轮次为 2 的event,我们需要将这10个event按照所有节点都同意的顺序排序。这个顺序就是共识顺序。我们按照以下优先级进行排序:

  • 接受轮次
  • 共识时间戳
  • 按事件签名和某随机数异或的结果排序,这个随机数通过该轮所有知名见证人的数字签名进行异或运算得到

完整的Hashgraph共识算法:

  1. 每个节点都在试图随机找到其他节点把自己所知event 通过gossip传播给对方。

  2. 每个节点同时也在接受其他节点更新过来的event,接受方节点需要额外进行一系列的运算,包括:

    1. 接受和处理接收的event信息

    2. 创建一个新的event,并且指向自己的最后event和gossip来源节点的最后event

    3. 对所有已知的event分配创建轮次,并确定区块是否是该轮次内的见证人

    4. 对所有已知的见证人区块进行选举投票,计算出是否 知名见证人

    5. 通过知名见证人,确定所有区块的共识顺序

这里的共识是异步的,意味着每个节点会在不同时间点发起虚拟投票,做出决定,并且自信满满地相信这个提案在全网络下会获得相同的决定(即共识)。还是那句话,共识迟早会进行并达成,只是有早有晚。

三大优点: 

  • 公平

    采用一致的时间戳,每一个事件,以及区块里的每一笔交易都有顺序(没有矿工)

  • 速度

    根据官网的测试数据,可以达到惊人的 250000 TPS;因为使用gossip做传播的,所以很快就能出 知名见证人,及很快就能达到共识

  • 安全

    Hashgraph 是一个 ABFT 系统,没有一个节点可以阻止网络达成共识或者在达成共识之后修改数据,号称能达到银行级别的安全性

Hashgraph通过增加随机性成为一种非确定性的异步协议。假设共识协议最终会终止,但终止发生的时间是不确定的。在目前的设计中,Hashgraph使用掷硬币(即签名的中间位)作为节点做出决定。因此,经过多轮抛硬币后,所有诚实节点具有相同的值的概率是非零的。最终所有诚实的节点将会变得一致。然而,如果所有拜占庭节点试图通过操纵gossip协议来破坏协议规则,如上面第2点所详述的那样,这种抛硬币方法的有效性和效率就成了问题,因为它可能需要多轮才能达成共识。

目前存在的问题:

目前为私有链,吞吐量参考价值存疑

目前Hashgraph是一个私有链,它的“运行速度快”只能跟其他私有链做比较,比如Hyperledger(700个交易/秒)和Red Belly(400,000个交易/秒),如果拿它的速度跟比特币和以太坊等公链来比较的话,是非常不公平的,因为现在的Hashgraph不需要设置防范恶意节点攻击的机制。此外,gossip算法是否适用于大规模公链环境也仍值得探讨。

能否经受恶意攻击

女巫攻击(Sybil attack),即攻击者通过创建大量假身份来破坏对等网络的信誉系统,并利用它们获得不成比例的巨大影响力。目前Hashgraph作为一个私有链,所有节点的身份已知,这种准入控制使得现阶段的Hashgraph无需考虑女巫攻击的危险。但如果未来Hashgraph打算往公有链方向发展的话,能否抵御女巫攻击将是Hashgraph必须思考的一个问题。

投票验证可能花费较多时间

Hashgraph的算法虽然很容易建立事件,但是在每个Round之后的投票验证过程却有可能很长。如果一直无法达到超过2/3的绝对多数,有可能要进行很多轮投票来决定谁记录的交易有效。(虽然我们从上面的图示中已经知道每轮投票其实只发生在 各个见证人之间,其他非见证人的 event 不参与,但是还是可能会存在这个一直无法达到超过2/3的绝大多数啊)

外部条件不同时的公平性问题:交易顺序如何决定?

Hashgraph白皮书中对公平性(Fairness)的解释如下:

假定存在A、B两个节点,A在B之前发出交易请求,如果最终在共识机制的判断下,A的交易的时间戳早于B的交易,我们就说该系统是有公平性的。如果A和B同时发生交易,并且两笔交易几乎是同时上传到网络并传播,此时就可能产生分叉,但是我们也说该系统是公平的。(why???)大多数共识机制都能够在以上两种情况下达到公平。

但是此解释是建立在A、B节点面临着同样的外部网络情况的假设前提下的。但我们考虑这样一个情况:

如果A的带宽是5M/s,而B的带宽是10M/s,A确实是比B早一点在网络中上传自己的交易信息,但是由于带宽限制,A的消息的传播速度会慢于B,这样就有可能导致最终投票时大多数人都更先接收到B的消息。这就像是在学校里,B的朋友更多,影响力大于A,因此在讨论八卦的时候,B可以把自己想传播的八卦信息更快地告诉更多人。即使可能是由A先开始传播八卦的,但因为影响力限制,大多数人都先听到B口中的版本。

在节点的外部条件不同时,投票是否也能反应真实地交易顺序,目前没有明确说明,因此仍然存在公平性的疑虑。

代码不开源

Hashgraph的代码不开源,且有专利保护,开发者需要申请SDK来进行开发,这是Hashgraph变成公链需要面临的一个很大障碍,这种闭源性本身与加密数字货币开源的理念是相违背的,所声称的公平、安全也无法提供确切的证据证明,可能无法得到信任。

文中没有提到,那就是该算法应该是运行在代理之上的,因为每一步决定 知名见证人 的时候需要超过三分之二的 见证人强可见  这个event,所以推测应该是运行在代理(中心节点?)之上的,因为在全网的话无法判断三分之二具体是多大的数字。另外此算法的机制比较复杂,也没有一个很好的证明能够说明该算法在及时收敛上是管用的。

OK,到这里,我对hashgraph的抄袭也到此结束了,放心吧,这些文章我这个水货怎么可能是自己写出来的呢,我不东搬西运是不可能写下来的。。啦啦啦

【我的区块链之路】- 去中心化的神级大作Hashgraph的讲解相关推荐

  1. 区块链的去中心化VS传统互联网的去中心化:技术与治理的双重困境

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链的去中心化VS传统互联网的去中心化:技术与治理的双重困境11 主要观点: 1.传统互联网经典的去中心化项目BitT ...

  2. 基于Solana区块链的去中心化交易所Orca正式启动

    2月25日消息,基于 Solana 区块链的去中心化交易所 Orca 现已正式启动.Orca 自称是以人为本(而非程序化)的自动做市商(AMM)和聚合器.目前,非美国地区用户可开始交易 SOL.BTC ...

  3. 区块链和去中心化的弱点

    想知道更多关于区块链技术知识,请百度[链客区块链技术问答社区] 链客,有问必答! 技术人员通常认为区块链是一种纯粹的.无损的产品.即使是那些抨击比特币的人,也会称赞区块链,仿佛这是种超越. 从某种程度 ...

  4. 基于区块链的去中心化存储(区块链存储)的工作流程

    引入 个人电脑上存储有限,而且如果硬盘损坏数据丢失的话,也不容易恢复.因此很多人愿意把数据上传到云盘里,也就是云存储.但是云存储是服务提供商控制的,比如阿里云,百度云等,我们称为中心化的存储 ,人们对 ...

  5. 区块链要去中心化么?

    本文摘自< 深度探索区块链:Hyperledger技术与应用 >,原文发布在华章计算机. 区块链(Blockchain)技术自身仍然在飞速发展中,目前还缺乏统一的规范和标准.Wikiped ...

  6. 基于区块链的去中心化抗量子密钥管理系统

    摘要: 区块链技术在2008年被提出被称为比特币(我觉得应该是翻译为比特币应用了区块链技术),区块链技术是一种分布式的数据库.公钥基础设施PKI(Public Key Infrastructure)系 ...

  7. 以太坊区块链实现去中心化购物功能

    在当今的中国,网上购物已经成为了我们不可或缺的一部分,通过电商网站查看商品,下单购物,支付,付款到支付宝,买家收货确认后,货款自动打入卖家的账户,这些购物的体验多数人每天都可能发生.大家都知道,淘宝的 ...

  8. 报刊资料整理:区块链的去中心化是如何实现的?

    区块链的去中心化是如何实现的? 区块链的去中心化是如何实现的? 区块链的去中心化是如何实现的? 去中心化的定义 区块链如何实现去中心化? 1.解决身份问题 2.消息传递完整性 3.点对点通信 4.共识 ...

  9. 区块链的去中心化创新

    区块链的分布式账本是一个去中心化的.没有更高权威的.分布在众多人计算机中的系统.从区块链的本质来说,区块链提供了一种分布式手段来担保和核实交易,从而为最终甩开中心控制者提供了机会. 在传统的交易支付流 ...

最新文章

  1. 树莓派上传文件到服务器,05_树莓派图片定时上传到服务器
  2. 模拟四:STEMA 考试选择题模拟练习试卷(中级组)及答案 + 自我解题笔记
  3. BERT在文档级排序中的应用
  4. node-red教程 7dashboard简介与输入型仪表板控件的使用
  5. python 硬件模拟_如何编写一个硬件模拟器?
  6. 这两年多我写PHP业务代码的方式是如何进化的
  7. 95-138-010-源码-Function-ProcessFunction
  8. c# rar解压大小_Linux压缩解压指令-bzip2、xz、compress、rar
  9. mysql导入 内存溢出_导入数据库内存溢出
  10. 11、classmethod和staticmethod
  11. html制作炸金花,如何在微信小程序上制作炸金花?
  12. 4. 吴恩达机器学习课程-作业4-神经网络学习
  13. 【渝粤教育】国家开放大学2018年春季 8618-21T燃气行业规范 参考试题
  14. python table删除一列_在python中从dataframe中删除多个列
  15. Android 深色模式使用失效
  16. html的strong标签是什么意思,Strong标签和B标签怎么用?区别有哪些
  17. Buffer之position,limit,capacity
  18. 测试智商的软件或网址,iq测试(sds在线测试)
  19. 一个C#开发的、跨平台的服务器性能监控工具
  20. python爬虫之十一_scrapy框架经验、错误

热门文章

  1. excel插入行 uipath_UiPath读取Excel
  2. linux 运行光驱,Linux下安装光驱
  3. 硅谷之行 (22) 品酒在Napa I
  4. 进化中的日本小学生书包越卖越贵
  5. 十个理由,让程序员成为2018最抢手老公
  6. SQL 中函数 REPLACE() 的用法及实例
  7. findbugs插件查出bug总结
  8. 《神都降魔》重燃青春,再战江湖
  9. 【Linux学习随笔】三、shell语法-echo命令
  10. wordpress运行php代码,怎么在wordpress的文章或页面中运行PHP代码