第一篇:区块链通识基础知识总结

区块链(block chain) 下一区块创造者是以某种确定的方式来选择,验证者被选中为下一区块创造者的概率与其所拥有的系统中数字货币的数量成正比例,即拥有300个币的验证者被选中的概率是拥有100个币验证者的3倍。DPOS的出现最主要还是因为矿机的产生,大量的算力在不了解也不关心数字货币的人身上,类似演唱会的黄牛,大量囤票而丝毫不关心演唱会的内容。(Data Layer):主要描述了区块链系统的物理形式,是区块链从创世区块起始的链式结构,包含了区块数据、随机数、时间戳和公私钥等数据,是整个区块链技术中最底层的数据结构。 阅读详情

一致性问题(Consistency)

理想的分布式系统一致性应该满足:
可终止性(Termination):一致的结果在有限时间内能完成;
共识性(Consensus):不同节点最终完成决策的结果应该相同;
合法性(Validity):决策的结果必须是其它进程提出的提案。

强一致性(Strong Consistency)主要包括下面两类:

  • 顺序一致性(Sequential Consistency):Leslie Lamport 1979 年经典论文《How to
    Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs》中
    提出,是一种比较强的约束,保证所有进程看到的 全局执行顺序(total order)一致,并
    且每个进程看自身的执行(local order)跟实际发生顺序一致。例如,某进程先执行 A,
    后执行 B,则实际得到的全局结果中就应该为 A 在 B 前面,而不能反过来。同时所有其
    它进程在全局上也应该看到这个顺序。顺序一致性实际上限制了各进程内指令的偏序关
    系,但不在进程间按照物理时间进行全局排序。
  • 线性一致性(Linearizability Consistency):Maurice P. Herlihy 与 Jeannette M. Wing
    在 1990 年经典论文《Linearizability: A Correctness Condition for Concurrent Objects》
    中共同提出,在顺序一致性前提下加强了进程间的操作排序,形成唯一的全局顺序(系
    统等价于是顺序执行,所有进程看到的所有操作的序列顺序都一致,并且跟实际发生顺
    序一致),是很强的原子性保证。但是比较难实现,目前基本上要么依赖于全局的时钟
    或锁,要么通过一些复杂算法实现,性能往往不高。

弱一致性(Weak Consistency)

强一致的系统往往比较难实现。很多时候,人们发现实际需求并没有那么强,可以适当放宽一致性要求,降低系统实现的难度。例如在一定约束下实现所谓最终一致性(Eventual
Consistency),即总会存在一个时刻(而不是立刻),系统达到一致的状态,这对于大部分
的 Web 系统来说已经足够了。这一类弱化的一致性,被笼统称为弱一致性(Weak
Consistency)

共识算法

实际上,要保障系统满足不同程度的一致性,往往需要通过共识算法来达成。
共识算法解决的是对某个提案(Proposal),大家达成一致意见的过程。提案的含义在分布
式系统中十分宽泛,如多个事件发生的顺序、某个键对应的值、谁是领导……等等,可以认
为任何需要达成一致的信息都是一个提案。
注:实践中,一致性的结果往往还需要客户端的特殊支持,典型地通过访问足够多个服务节
点来验证确保获取共识后结果。

问题挑战

现实中这样“完美”的系统并不存在,如响应请求往往存在时延、网络会发生中
断、节点会发生故障、甚至存在恶意节点故意要破坏系统。
一般地,把故障(不响应)的情况称为“非拜占庭错误”,恶意响应的情况称为“拜占庭错误”(对应节点为拜占庭节点)

常见算法

针对非拜占庭错误的情况,一般包括 Paxos、Raft 及其变种。
对于要能容忍拜占庭错误的情况,一般包括 PBFT 系列、PoW 系列算法等。从概率角度,PBFT 系列算法是确定的,一旦达成共识就不可逆转;而 PoW 系列算法则是不确定的,随着时间推移,被推翻的概率越来越小。
[以上算法能通最好,支付宝中有提到]

FLP 不可能性原理

FLP 不可能原理:在网络可靠,存在节点失效(即便只有一个)的最小化异步模型系统
中,不存在一个可以解决一致性问题的确定性算法。

提出该定理的论文是由 Fischer, Lynch 和 Patterson 三位作者于 1985 年发表,该论文后来获
得了 Dijkstra(就是发明最短路径算法的那位)奖。

FLP 不可能原理实际上告诉人们,不要浪费时间去为异步分布式系统设计在任意场景下都能实现共识的算法

科学告诉你什么是不可能的;工程则告诉你,付出一些代价,我可以把它变成可能。
这就是工程的魅力。
那么,退一步讲,在付出一些代价的情况下,我们能做到多少?
回答这一问题的是另一个很出名的原理:CAP 原理

CAP 原理

CAP 原理最早由 Eric Brewer 在 2000 年,ACM 组织的一个研讨会上提出猜想,后来 Lynch
等人进行了证明。
该原理被认为是分布式系统领域的重要原理。

分布式计算系统不可能同时确保一致性(Consistency)、可用性(Availablity)和分区容忍性
(Partition),设计中往往需要弱化对某个特性的保证。

  • 一致性(Consistency):任何操作应该都是原子的,发生在后面的事件能看到前面事件
    发生导致的结果,注意这里指的是强一致性;
  • 可用性(Availablity):在有限时间内,任何非失败节点都能应答请求;
  • 分区容忍性(Partition):网络可能发生分区,即节点之间的通信不可保障

应用场景
既然 CAP 不可同时满足,则设计系统时候必然要弱化对某个特性的支持。

弱化一致性
对结果一致性不敏感的应用,可以允许在新版本上线后过一段时间才更新成功,期间不保证
一致性。
例如网站静态页面内容、实时性较弱的查询类数据库等,CouchDB、Cassandra 等为此设
计。
弱化可用性
对结果一致性很敏感的应用,例如银行取款机,当系统故障时候会拒绝服务。MongoDB、
Redis 等为此设计。
Paxos、Raft 等算法,主要处理这种情况。
CAP 原理
56
弱化分区容忍性
现实中,网络分区出现概率减小,但较难避免。某些关系型数据库、ZooKeeper 即为此设
计。
实践中,网络通过双通道等机制增强可靠性,达到高稳定的网络通信

ACID 原则

即 Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久
性)。

ACID 原则描述了对分布式数据库的一致性需求,同时付出了可用性的代价。
- Atomicity:每次操作是原子的,要么成功,要么不执行;
- Consistency:数据库的状态是一致的,无中间状态;
- Isolation:各种操作彼此互相不影响;
- Durability:状态的改变是持久的,不会失效。

一个与之相对的原则是 BASE(Basic Availiability,Soft state,Eventually Consistency),牺牲掉对一致性的约束(最终一致性),来换取一定的可用性。

Paxos 与 Raft

Paxos 问题是指分布式的系统中存在故障(fault),但不存在恶意(corrupt)节点场景(即
可能消息丢失或重复,但无错误消息)下的共识达成(Consensus)问题。因为最早是 Leslie
Lamport 用 Paxon 岛的故事模型来进行描述而命名。
Paxos
1990 年由 Leslie Lamport 提出的 Paxos 共识算法,在工程角度实现了一种最大化保障分布
式系统一致性(存在极小的概率无法实现一致)的机制。Paxos 被广泛应用在 Chubby、
ZooKeeper 这样的系统中,Leslie Lamport 因此获得了 2013 年度图灵奖。
故事背景是古希腊 Paxon 岛上的多个法官在一个大厅内对一个议案进行表决,如何达成统一
的结果。他们之间通过服务人员来传递纸条,但法官可能离开或进入大厅,服务人员可能偷
懒去睡觉。
Paxos 是第一个被证明的共识算法,其原理基于 两阶段提交 并进行扩展。

作为现在共识算法设计的鼻祖,以最初论文的难懂(算法本身并不复杂)出名。算法中将节点分为三种类型:

  • proposer:提出一个提案,等待大家批准为结案。往往是客户端担任该角色;
  • acceptor:负责对提案进行投票。往往是服务端担任该角色;
  • learner:被告知结案结果,并与之统一,不参与投票过程。可能为客户端或服务端。

并且,算法需要满足 safety 和 liveness 两方面的约束要求(实际上这两个基础属性是大部分分布式算法都该考虑的):

  • safety:保证决议结果是对的,无歧义的,不会出现错误情况。
    决议(value)只有在被 proposers 提出的 proposal 才能被最终批准;
    在一次执行实例中,只批准(chosen)一个最终决议,意味着多数接受(accept)
    的结果能成为决议;
  • liveness:保证决议过程能在有限时间内完成。
    决议总会产生,并且 learners 能获得被批准(chosen)的决议。

基本过程包括 proposer 提出提案,先争取大多数 acceptor 的支持,超过一半支持时,则发送
结案结果给所有人进行确认。一个潜在的问题是 proposer 在此过程中出现故障,可以通过超
时机制来解决。极为凑巧的情况下,每次新的一轮提案的 proposer 都恰好故障,系统则永远
无法达成一致(概率很小)。

Paxos 能保证在超过 的正常节点存在时,系统能达成共识。

单个提案者+多接收者

如果系统中限定只有某个特定节点是提案者,那么一致性肯定能达成(只有一个方案,要么达成,要么失败)。提案者只要收到了来自多数接收者的投票,即可认为通过,因为系统中
不存在其他的提案。
但一旦提案者故障,则系统无法工作。

多个提案者+单个接收者

限定某个节点作为接收者。这种情况下,共识也很容易达成,接收者收到多个提案,选第一个提案作为决议,拒绝掉后续的提案即可。
缺陷也是容易发生单点故障,包括接收者故障或首个提案者节点故障。
以上两种情形其实类似主从模式,虽然不那么可靠,但因为原理简单而被广泛采用。
当提案者和接收者都推广到多个的情形,会出现一些挑战。

多个提案者+多个接收者

既然限定单提案者或单接收者都会出现故障,那么就得允许出现多个提案者和多个接收者。
问题一下子变得复杂了。
一种情况是同一时间片段(如一个提案周期)内只有一个提案者,这时可以退化到单提案者的情形。需要设计一种机制来保障提案者的正确产生,例如按照时间、序列、或者大家猜拳(出一个数字来比较)之类。考虑到分布式系统要处理的工作量很大,这个过程要尽量高效,满足这一条件的机制非常难设计。

另一种情况是允许同一时间片段内可以出现多个提案者。那同一个节点可能收到多份提案,怎么对他们进行区分呢?这个时候采用只接受第一个提案而拒绝后续提案的方法也不适用。很自然的,提案需要带上不同的序号。节点需要根据提案序号来判断接受哪个。比如接受其中序号较大(往往意味着是接受新提出的,因为旧提案者故障概率更大)的提案。

如何为提案分配序号呢?一种可能方案是每个节点的提案数字区间彼此隔离开,互相不冲突。为了满足递增的需求可以配合用时间戳作为前缀字段。
此外,提案者即便收到了多数接收者的投票,也不敢说就一定通过。因为在此过程中系统中其它提案者

两阶段的提交

提案者发出提案之后,收到一些反馈。这个时候得知的一种结果是自己的提案被大多数接受
了,一种结果是没被接受。没被接受的话好说,过会再试试。

即便受到来自大多数的接受反馈,也不能认为就最终确认了。因为这些接收者自己并不知道自己刚反馈的提案就恰好是全局的绝大多数。

那么引入了新的一个阶段,即提案者在前一阶段拿到所有的反馈后,判断这个提案是可能被大多数接受的提案,需要对其进行最终确认。
Paxos 里面对这两个阶段分别命名为准备(prepare)和提交(commit)。准备阶段解决大家对哪个提案进行投票的问题,提交阶段解决确认最终值的问题。

准备阶段:

  • 提案者发送自己计划提交的提案的编号到多个接受者,试探是否可以锁定多数接受者的支持。
  • 接受者时刻保留收到过提案的最大编号和接受的最大提案。如果收到提案号比目前保留的最大提案号还大,则返回自己已接受的提案值(如果还未接受过任何提案,则为空)给提案者,更新当前最大提案号,并说明不再接受小于最大提案号的提案。

提交阶段:

  • 提案者如果收到大多数的回复(表示大部分人听到它的请求),则可准备发出带有刚才提案号的接受消息。如果收到的回复中不带有新的提案,说明锁定成功。则使用自己的提案内容;如果返回中有提案内容,则替换提案值为返回中编号最大的提案值。如果没收到足够多的回复,则需要再次发出请求。
  • 接受者收到接受消息后,如果发现提案号不小于已接受的最大提案号,则接受该提案,并更新接受的最大提案。

一旦多数接受了共同的提案值,则形成决议,成为最终确认。

Raft

Raft 是对 Paxos 的重新设计和实现。
Raft 算法是Paxos 算法的一种简化实现。
包括三种角色:leader、candiate 和 follower,其基本过程为:

  • Leader 选举:每个 candidate 随机经过一定时间都会提出选举方案,最近阶段中得票最
    多者被选为 leader;
  • 同步 log:leader 会找到系统中 log 最新的记录,并强制所有的 follower 来刷新到这个记录;

注:此处 log 并非是指日志消息,而是各种事件的发生记录。

拜占庭问题与算法

拜占庭问题更为广泛,讨论的是允许存在少数节点作恶(消息可能被伪造)场景下的一致性达成问题。拜占庭算法讨论的是最坏情况下的保障。

Byzantine Fault Tolerant 算法
面向拜占庭问题的容错算法,解决的是网络通信可靠,但节点可能故障情况下的一致性达
成。
最早由 Castro 和 Liskov 在 1999 年提出的 Practical Byzantine Fault Tolerant(PBFT)是第
一个得到广泛应用的 BFT 算法。只要系统中有 的节点是正常工作的,则可以保证一致
性。
PBFT 算法包括三个阶段来达成共识:Pre-Prepare、Prepare 和 Commit。

新的解决思路
拜占庭问题之所以难解,在于任何时候系统中都可能存在多个提案(因为提案成本很低),
并且要完成最终的一致性确认过程十分困难,容易受干扰。但是一旦确认,即为最终确认。
比特币的区块链网络在设计时提出了创新的 PoW(Proof of Work) 算法思路。一个是限制一
段时间内整个网络中出现提案的个数(增加提案成本),另外一个是放宽对最终一致性确认
的需求,约定好大家都确认并沿着已知最长的链进行拓宽。系统的最终确认是概率意义上的
存在。这样,即便有人试图恶意破坏,也会付出很大的经济代价(付出超过系统一半的算
力)。
后来的各种 PoX 系列算法,也都是沿着这个思路进行改进,采用经济上的惩罚来制约破坏
者。

密码学技术

工程领域从来没有黑科技;密码学不是工程。
密码学在信息技术领域的重要地位无需多言。如果没有现代密码学的研究成果,人类社会根本无法进入信息时代。
密码学领域十分繁杂,本章将介绍密码学领域中跟区块链相关的一些基础知识,包括 hash 算
法与摘要、加密算法、数字签名和证书、PKI 体系、Merkle 树、同态加密等,以及如何使用
这些技术实现信息的机密性、完整性、认证性和不可抵赖性。

Hash 算法

定义

Hash (哈希或散列)算法是信息技术领域非常基础也非常重要的技术。它能任意长度的二进制值(明文)映射为较短的固定长度的二进制值(Hash 值),并且不同的明文很难映射为相同的 Hash 值。

例如计算一段话“hello blockchain world, this is yeasy@github”的 MD5 hash 值为
89242549883a2ef85dc81b90fb606046

注:MD5 是一个经典的 hash 算法,其和 SHA-1 算法都已被 证明 安全性不足应用于商业场景。

一个优秀的 hash 算法,将能实现:

  • 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
  • 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
  • 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
  • 冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。

冲突避免有时候又被称为“抗碰撞性”。如果给定一个明文前提下,无法找到碰撞的另一个明文,称为“弱抗碰撞性”;如果无法找到任意两个明文,发生碰撞,则称算法具有“强抗碰撞性”。

很多场景下,也要求对于任意长的输入内容,输出定长的 hash 结果。

流行的算法
目前流行的 Hash 算法包括 MD5、SHA-1 和 SHA-2。

使用案例:数字摘要
顾名思义,数字摘要是对数字内容进行 Hash 运算,获取唯一的摘要值来指代原始数字内容。
数字摘要是解决确保内容没被篡改过的问题(利用 Hash 函数的抗碰撞性特点)。

加解密算法

对称加密

  • 加解密密钥相同或可推算,计算效率高,加密强度高需提前共享密钥;
  • 易泄露
  • DES、3DES、AES、IDEA

非对称加密
- 加解密密钥不相关,无需提前共享密钥
- 计算效率低,仍存在中间人攻击可能
- RSA、ElGamal、椭圆曲线系列算法

数字签名

类似在纸质合同上签名确认合同内容,数字签名用于证实某数字内容的完整性(integrity)和来源(或不可抵赖,non-repudiation)

HMAC

全称是 Hash-based Message Authentication Code,即“基于 Hash 的消息认证码”。基本过程
为对某个消息,利用提前共享的对称密钥和 Hash 算法进行加密处理,得到 HMAC 值。该
HMAC 值提供方可以证明自己拥有共享的对称密钥,并且消息自身可以利用 HMAC 确保未经
篡改。

HMAC(K, H, Message)
其中,K 为提前共享的对称密钥,H 为提前商定的 Hash 算法(一般为公认的经典算法),
Message 为要处理的消息内容。如果不知道 K 和 H,则无法根据 Message 得到准确的
HMAC 值。

盲签名

1983 年由 David Chaum 提出。签名者在无法看到原始内容的前提下对信息进行签名。
盲签名主要是为了实现防止追踪(unlinkability),签名者无法将签名内容和结果进行对应。
典型的实现包括 RSA 盲签名)。

多重签名

n 个持有人中,收集到至少 m 个的签名,即认为合法,这种签名被称为多重签名。

群签名

环签名

环签名由 Rivest,shamir 和 Tauman 三位密码学家在 2001 年首次提出。环签名属于一种简化的群签名。

签名者首先选定一个临时的签名者集合,集合中包括签名者自身。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立的产生签名,而无需他人的帮助。签名者集合中的其他
成员可能并不知道自己被包含在其中。

数字证书

数字证书用来证明某个公钥是谁的,并且内容是正确的。

对于非对称加密算法和数字签名来说,很重要的一点就是公钥的分发。一旦公钥被人替换(典型的如中间人攻击),则整个安全体系将被破坏掉。

怎么确保一个公钥确实是某个人的原始公钥?
这就需要数字证书机制。

顾名思义,数字证书就是像一个证书一样,证明信息和合法性。由证书认证机构(Certification Authority,CA)来签发,权威的 CA 包括 verisign 等。

最重要的包括 签发的公开密钥 、 CA 数字签名 两个信息。因此,只要通过这个证书就能证明某个公钥是合法的,因为带有 CA 的数字签名。

更进一步地,怎么证明 CA 的签名合法不合法呢?
类似的,CA 的数字签名合法不合法也是通过 CA 的证书来证明的。主流操作系统和浏览器里
面会提前预置一些 CA 的证

PKI 体系

在非对称加密中,公钥则可以通过证书机制来进行保护,如何管理和分发证书则可以通过PKI(Public Key Infrastructure)来保障。

PKI 是建立在公私钥基础上实现安全可靠传递消
息和身份确认的一个通用框架。实现了 PKI 的平台可以安全可靠地管理网络中用户的密钥和证书,包括多个实现和变种,知名的有 RSA 公司的 PKCS(Public Key Cryptography
Standards)标准和 X.509 规范等。

一般情况下,PKI 至少包括如下组件:

  • CA(Certification Authority):负责证书的颁发和作废,接收来自 RA 的请求,是最核心
    的部分;
  • RA(Registration Authority):对用户身份进行验证,校验数据合法性,负责登记,审核过了就发给 CA;
  • 证书数据库:存放证书,一般采用 LDAP 目录服务,标准格式采用 X.500 系列。

CA 是最核心的组件,主要完成对证书的管理。

常见的流程为,用户通过 RA 登记申请证书,CA 完成证书的制造,颁发给用户。用户需要撤销证书则向 CA 发出申请。

户证书可以有两种方式。一般可以由 CA 来生成证书和私钥;也可以自己生成公钥和私钥,然后由 CA 来对公钥进行签发。后者情况下,当用户私钥丢失后,CA 无法完成恢复。

Merkle 树


默克尔树(又叫哈希树)是一种二叉树,由一个根节点、一组中间节点和一组叶节点组成。

最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。

进一步的,默克尔树可以推广到多叉树的情形。

默克尔树的特点是,底层数据的任何变动,都会传递到其父亲节点,一直到树根。

默克尔树的典型应用场景包括:

  • 快速比较大量数据:当两个默克尔树根相同时,则意味着所代表的数据必然相同。
  • 快速定位修改:例如上例中,如果 D1 中数据被修改,会影响到 N1,N4 和 Root。因
    此,沿着 Root –> N4 –> N1,可以快速定位到发生改变的 D1;
  • 零知识证明:例如如何证明某个数据(D0……D3)中包括给定内容 D0,很简单,构造

一个默克尔树,公布 N0,N1,N4,Root,D0 拥有者可以很容易检测 D0 存在,但不知
道其它内容

同态加密

同态加密(Homomorphic Encryption)是一种特殊的加密方法,允许对密文进行处理得到仍然是加密的结果,即对密文直接进行处理,跟对明文进行处理再加密,得到的结果相同。从
代数的角度讲,即同态性。

同态性在代数上包括:加法同态、乘法同态、减法同态和除法同态。同时满足加法同态和乘法同态,则意味着是 代数同态,即全同态。同时满足四种同态性,则被称为 算数同态。

同态加密在云时代的意义十分重大。目前,从安全角度讲,用户还不敢将敏感信息直接放到第三方云上进行处理。如果有了比较实用的同态加密技术,则大家就可以放心的使用各种云
服务了。

遗憾的是,目前已知的同态加密技术需要消耗大量的计算时间,还远达不到实用的水平

函数加密

与同态加密相关的一个问题是函数加密。
同态加密保护的是数据本身,而函数加密顾名思义保护的是处理函数本身,即让第三方看不
到处理过程的前提下,对数据进行处理。
该问题已被证明是不存在对多个通用函数的任意多 key 的方案,目前仅能做到对某个特定函
数的一个 key 的方案。

其它问题

零知识证明(zero knowledge validation)

证明者在不向验证者提供任何有用的信息的前提下,使验证者相信某个论断是正确的。
例如,A 向 B 证明自己有一个物品,但 B 无法拿到这个物品,无法用 A 的证明去向别人证明
自己也拥有这个物品。

第一章 区块链概述 区块链入门知识点系列 阅读详情

相关推荐

区块链基础知识1:定义、原理及概述

区块链是一种基于去中心化、分布式、不可篡改的数据存储结构。它将一系列按照时间顺序排列的数据块通过密码学方式相连,形成一个链式的数据结构。每个数据块包含了一定数量的交易信息、时间戳以及前一个数据块的哈希值等信息,确保数据的完整性和真实性。

HongYingClub-优快云 1829

区块链通识——共识层

共识层一丶概述及拜占庭将军问题二丶区块链共识三丶基本流程四丶PoW共识 一丶概述及拜占庭将军问题 (一)共识机制是区块链技术的基础和核心 (二)共识机制决定参与节点以何种方式对某些特定的数据达成一致,共识机制可以分为经典分布式共识机制和区块链共识机制 (三)经典共识是确定性共识,即网络中的节点要么达成共识,要么不达成共识,如如经典的拜占庭将军问题 (四)信任解决问题:1980年Lamport提出,解决网络中存在拜占庭节点(恶意或故障节点) 拜占庭帝国想要进攻一个强大的敌人,为此配出了10支军队去包围这个敌

weixin_43402353的博客 3459

区块链入门学习的基础知识

区块链的起源 互联网发展至今,每一项新技术的诞生都在深刻改变着人们的生活方式。如今一个冉冉升起的新技术——区块链(Blockchain),来到历史舞台前沿,它让全世界范围内任何一笔比特币(Bitcoin)资产交易在短时间内就可以成功确认。不仅仅是信息的互联,区块链技术帮助实现了价值的互联,这使得越来越多的人关注到区块链技术,了解其原理并应用实践。 链式数据结构的提出,主要目的就是为了提高传统电子...

snvlongquan的博客 5117

区块链基础通识(1)——分布式系统的共识问题

拜占庭算法,PBFT(联盟链常见共识机制),PoS(以以太坊为例)

Hock2023的博客 2222

区块链以太坊DApp开发实战(一)——基础知识

系列文章目录 区块链以太坊DApp开发实战(一)——基础知识 文章目录系列文章目录前言一、基本概念1. 区块2. 链二、共识三、分叉总结 前言 从基本概念入手,逐步介绍区块链、共识、分叉等概念。 一、基本概念 1. 区块 类似与基本数据结构的**“链表”,区块就是一个对象,对象中可以定义属性、变量、方法**,将许多区块链接起来,就成了区块链。下面是一个区块的简单例子。 type Block struct { Number string // 区块号 PreHash string // 前一个区块的哈

lxpkuss 2110

《区块链基础知识25讲》-各讲地址整理

为了自己方便复习以及他人参考浏览,自己打算整理一下自己在学习《区块链基础知识25讲》过程中,所做的笔记。笔记内容只有我认为是重点的部分才会列出,因此知识点框架可能略微不完整,请大家和未来复习区块链的自己见谅。 《区块链基础知识25讲》-第一讲-分层 https://blog.youkuaiyun.com/qq_40061206/article/details/90550923 《区块链基础知识25讲》-第二讲...

我是一只小嵩鼠 7192

区块链:基础知识篇

区块链本身并不是新的理论或者技术,而是对已经存在的技术理论进行实现的一个新事物而已,因此基础是构成它的基石。这里概要讲述大多数书籍必定会遇到的一些基础知识和相关点。 一致性问题(Consistency) 理想的分布式系统一致性应该满足: 可终止性(Termination):一致的结果在有限时间内能完成; 共识性(Consensus):不同节点最终完成决策的结果应该相同; 合法性(Vali...

牧竹子 1385

【UE4】Hierarchical Instanced Static Mesh——一种速度优于Spawn的实例化物体组件

最近需要在场景中实例出很多个相同的模型,位置也很有规律,并且要对它的位置信息进行更新。 但是一个个拖进去实在太麻烦,就发现了Spawn Actor这个蓝图方法,可以实例一个蓝图类在场景中。 但是由于数量较大,实例化的速度太慢,这时发现了一个神奇的组件——Hierarchical Instanced Static Mesh。 新建一个蓝图类,添加该组件,在细节里添加你要实例化的模型对象。 ...

ColorGalaxy 1万+

每期十分钟,听懂区块链,《玲听·区块链通识70讲》重磅上线

作者:王佳建这两天,全球央行大放水,美联储一次性降息50个基点。微博上一群炒币的人大惑不解,比特币不是要减半了吗?它不是对抗通胀的数字黄金吗?可为什么还跌啊?这两天,有些朋友离开了,他们...

weixin_44383880的博客 534

小红书私信接口与Hook技术实战:微信跳转卡片的合规与破解之道

本文深入探讨了小红书私信接口与Hook技术的实战应用,重点解析了微信跳转卡片的合规使用与破解方法。通过官方私信接口的合规玩法与Xposed框架的Hook技术对比,为开发者提供了技术选型指南和实战建议,帮助实现高效的用户跳转与转化。

weixin_30399821的博客 729

RcisTarget实战:从差异基因到转录因子调控网络的完整分析流程(附代码)

本文详细介绍了RcisTarget工具在转录因子调控网络分析中的完整流程,从差异基因到motif富集分析,再到结果可视化与生物学解读。通过实战代码演示,帮助研究者掌握这一强大的R包应用,揭示基因表达背后的调控机制,特别适用于基因组学和生物信息学研究。

weixin_29214199的博客 228

区块链通识——数据层

一丶数据层 狭义的区块链即是去中心化系统各节点共享的数据账本 每个分布式节点都可以通过特定的哈希算法和Merkle 树数据结构,将一段时间内接收到的交易数据和代码封装到一个带有时间戳的数据区块中,并链接到当前最长的主区块链上,形成最新的区块,该过程涉及区块,链式结构,哈希算法,Merkle树和时间等技术 二丶哈希函数 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值 这种转换是一种压缩

weixin_43402353的博客 3446

处理SAP资产折旧AFAB 过账报错:“科目 8019010100 要求一个成本会计分配”

本文介绍如何处理资产折旧报错 ““科目XXXXXXX 要求一个成本会计分配””

IT小职员 2774

区块链基础知识的归纳与总结

区块链(Blockchain) 以博主看过的文献或查阅的资料为基础,本博文将介绍区块链(Blockchain)的相关知识点,以及归纳与总结。这也是博主个人的学习过程,长期更新,建议收藏,也欢迎指正! 区块链一句话解释:一种由密码学算法、共识机制、点对点传输、数学、计算机编程等多种技术为基础,而形成的分布式记账系统。 一、区块链的诞生及演变 2008年,一位名为中本聪(Satoshi Nakamoto)的密码学家发表了一篇《Bitcoin: A Peer-to-Peer Electronic Cash Sys

cryptocxf的博客 6万+

手把手教你学RDMA驱动开发专栏--第7章 队列对(QP)与数据传输实现​7.3 完成队列(CQ):事件通知机制与轮询/中断模式

本章详细探讨了RDMA驱动中完成队列(CQ)的事件通知机制,重点分析了轮询与中断两种模式的实现原理及优化策略。CQ作为操作结果的报告载体,其核心功能包括结果反馈、事件通知和资源同步。轮询模式通过主动查询实现低延迟,适合高性能场景;中断模式通过被动通知节省CPU资源,适用于低频事件处理。驱动实现需考虑CQ溢出防护、多QP共享同步等关键问题,并提供事件通道机制将CQE传递给用户态。通过对比两种模式的优缺点及适用场景,揭示了RDMA系统在性能与资源间的权衡机制。

MHD0815的博客 395

Python爬虫:抓取外卖平台餐厅菜单、价格与评价数据

美团外卖:国内领先的外卖平台之一,提供餐饮外卖、超市配送等服务。饿了么:另一大主流外卖平台,覆盖广泛的餐饮品类。等:国际性的外卖平台。在本文中,我们将以美团外卖为例,展示如何抓取餐厅的菜单、价格和评价等数据。我们会使用Python的爬虫库,如Scrapy和Selenium,来解决抓取任务。本文详细介绍了如何使用Python爬虫抓取外卖平台上的餐厅菜单、价格、评价等信息。我们展示了如何使用Scrapy和Selenium抓取静态与动态网页数据,如何清洗和存储数据,并讨论了如何应对外卖平台的反爬虫机制。

2201_76125261的博客 1498

区块链通识——网络层

网络层一丶概述二丶组网方式P2P网络三丶数据传播协议四丶数据验证机制五丶总结觉得不错,对您有所帮助,欢迎任意额度打赏 一丶概述 网络层封装了区块链系统的组网方式,消息传播协议和数据验证机制等要素 结合实际应用需求,通过设计特定的传播协议和数据验证机制 可使得区块链系统中每个节点都能参与区块数据的校验和记账过程 仅当区块数据通过全网大部分节点验证后,才能记入区块链 二丶组网方式P2P网络 组网方式: 区块链系统的节点一般具有分布式,自治性,开放可自由进出等特性 因而一般采用==对等式网络(Peer-t

weixin_43402353的博客 5492

RML2018.01a数据集的读取与使用

基于深度学习的自动调制识别

QAQIknow的博客 1万+

区块链通识——总体架构和概念介绍

一丶第一个区块链:比特币 2008年10月31日,一位化名为“中本聪”的研究者在密码学邮件组中发表了比特币的奠基性论文”Bitcoin:a peer-to-peer electronic cashsystem" 提出了工作量证明(Proof of Work, Pow)概率性共识算法 首次实现,验证了一类大规模可使用的拜占庭容错算法 二丶双花问题 比特币系统采用的区块链技术解决了数字加密货币领域长期以来所必须面对的两个重要问题,即双重支付问题和拜占庭将军问题 双重支持问题又称为“双花”,即利用货币的数字

weixin_43402353的博客 1772

dolphinscheduler集群服务一键安装启动实现流程剖析

通过以上分析我们基本梳理清楚了整个dolphinscheduler项目的一键安装启动逻辑, 我们现在在通过一张图正好理一下整个实现流程。关于一键停止集群服务及一件查询集群各个角色服务实例运行状态的实现也都在stop-all.sh/status-all.sh及dolphinscheduler-daemon.sh这三个脚本中, 有兴趣自行研究。写这篇文章的核心目的不仅在于给大家分享如何优秀的开源项目的一键安装部署的实现过程。

最爱嫣夜来 1207

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

区块链通识

1、区块链前世今生 密码朋克 2、应用场景 资产:数字资产发行、支付(跨境支付)、交易、结算 记账:股权交易、供应链金融、商业积分 不可篡改:溯源、众筹、医疗证明、存在性证明 点对点:共享经济、物联网 隐私:匿名交易 比特币: 是数字货币,用一串数字表示货币。(虚拟货币) 特点:1、财产只受自己控制。 2、无通胀 3、没有假钞 4、流通性好(全球流通、点对点流通) 去中心化的记账系统: 存在网络中...

weixin_45421680的博客 378

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

区块链基础知识

区块链作为一种共享且不可篡改的账本技术,能够记录和跟踪各种有价值的资产,如货币、股票、土地和知识产权等。这些资产可以在区块链网络上公开透明地流转和交易,所有交易记录都可以被验证,减少了欺诈的可能性。由于区块链的信息是同步共享且无法篡改的,各方都可以信任这些数据的真实性,这不仅降低了信任风险,还消除了对第三方中介的需求,从而显著减少了交易成本和时间。在经济活动中,决策通常依赖于信息的真实性和传递速度。区块链能够提供即时、共享、完全透明的信息,确保这些信息在多业务场景中被可靠地传递和使用。

linwq057的博客 2563

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

区块链(一): 以太坊基础知识

区块链是一个交易数据库,在网络中的众多计算机之间更新和共享。每次添加一组新交易时,即称为一个“区块”,区块链由此而得名。大多数区块链都是公有的,用户只能添加而不能删除数据。如果有人想更改系统上的任何信息或欺骗系统,那么他需要在网络中大多数计算机上都如此操作。那将是一个超级大工程。这使得已经建立的区块链(如以太坊)十分安全。以太坊是一种用于在不受中心化监管机构管控的环境下构建应用程序和组织、持有资产、进行交易和通信的技术。使用以太坊时无需提供任何个人详细信息,用户控制自己的数据以及共享内容。

AI时代光年 1万+

区块链基础知识25讲

刚刚读完这本书,总结回顾一下知识点 作者:Daniel Drescher 第1部分 区块链术语与技术基础 第1讲 理解分层的概念 系统分层 应用层与实现层 功能性与非功能性 应用层关注用户的需求,实现层则关注如何满足这些需求 功能性特征关注软件实现了什么,非功能性特征关注这些东西实现得怎么样 完备性是一个很重要的非功能性需求,它包括3个方面的内容 数据完备性 行为完备性 安全性 第2讲 纵观全局 中心化系统和去中心化系统对比 去中心化系统的优势 区块链是去中心化软件系统实现层的一部分 区块链.

KEEP MOVING. 3033

区块链通识问题(四)

一、数据交易 1. 数据作为资产交易的难点 数据的不守恒性,可以随意的复制,具有可扩散性。 数据的使用权和实际控制权是很难分离的。 4. 数据使用权交易比裸数据交易的优势? 数据使用权交易:不交易数据本身,而是交易数据的使用权。 例如:通过数据必须通过API来使用。所有交易记录都在API上留痕,根据记录来对数据的使用权进行收费。 5. 区块链如何助力数据使用权交易? 6. 数据交易的未来挑战? 二、一切皆挖矿 1. 算力挖矿的启示? 2. “XX即挖矿”的前提条件? 3. 存储.

u012802020的博客 1145
上一篇: 区块链:基础知识篇
下一篇: 第二篇:区块链的结构和相关技术概述
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值