区块链:基础知识篇

区块链(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、椭圆曲线系列算法

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

相关推荐

基础知识补充篇:认识区块链浏览器

在《基础知识补充篇:什么是区块链RPC节点》文中笔者详细介绍了什么是区块链的RPC节点,在其中我提到了一点:我们每个人都可以用自己的电脑搭建一个rpc节点。假设我们真的搭建好了一个rpc节点,那么我们怎么样让其他人也能使用呢?毕竟其他人也许并不具备编程知识别说使用命令行了也许就连http请求工具都不会使用。那么有没有一种图像化的界面能完成这一点?最好是连APP都不用安装,直接浏览器就能打开使用的。这就是区块链浏览器。

银二码的代码博客 1446

区块链通识——共识层

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

weixin_43402353的博客 3459

基础知识补充篇:什么是区块链RPC节点

在实战开发过程中我们在连接合约的时候必须要用到的就是RPC节点,那么什么是RPC节点呢?本篇将为你简单讲解一下。

银二码的代码博客 1875

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

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

Hock2023的博客 2222

一个完整的区块链入门学习整理,吐血推荐!!!

一个完整的区块链入门整理,吐血推荐!!! 入门介绍与原理: 一、比特币 1.比特币白皮书 这是一切的开始 2.精通比特币 讲比特币很详细的一本书,看完基本对比特币的认识就清楚了。 3.TheProof-of-Work Concept PoW机制理论介绍,英文 4.比特币的原理及运作机制 这篇是新手向,适合向圈外人介绍什么是比特币什么是区块链 5.比特币pow难度调节机制 P...

6万+

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

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

HongYingClub-优快云 1829

智能语音电销机器人开源代码\install

智能语音电销机器人开源代码\install

w519021660 394

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

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

snvlongquan的博客 5117

【区块链学习笔记】基础知识篇

目录一、数字货币二、接触区块链的小故事三、区块链的起源四、比特币1. 比特币与区块链的关系2. 比特币的作用机制五、信任的建立和区块链的形象解释1. 区块链建立信任的方式2. 区块链的定义3. 区块链的分类六、哈希算法1. 哈希算法的特征2. 典型的哈希算法3. 哈希算法在区块链中发挥着怎样的作用4. Merkle树在区块链中发挥着怎样的作用七、挖矿1. 工作量证明2. 工作量证明的过程八、 钱包、私钥、签名与交易1. 钱包2. 比特币交易 一、数字货币 区块链确实脱胎于数字货币,它生来就是为数字货币服务的

Famidlistimo的博客 3828

区块链基础知识

angelliusa的博客 6269

软考软件评测师备考避坑指南:过来人告诉你这5个章节最容易丢分(附2024最新考纲解析)

本文为软考软件评测师考生提供备考避坑指南,深度解析5个高频失分章节,包括标准化与信息化基础、中间件技术、软件测试模型、白盒测试覆盖准则和性能测试指标。文章结合2024最新考纲,分享实战技巧和记忆口诀,帮助考生精准打击失分重灾区,提升备考效率。

weixin_29223603的博客 467

第二章 | 智能合约 & 区块链基础知识{介绍篇}

简单来说,区块链是一种分布式数据库,但它比传统数据库更强大。👉 EVM 是目前应用最广泛的智能合约平台👉 支持 EVM 的公链生态强大、兼容性高👉 Solidity 一套代码,跑遍多个链(Ethereum、BNB Chain、zkSync、Arbitrum 等)👉 你写好一个合约,能上线无数链,快速参与不同生态项目!

白马区块Crypto100 1775

别再手动拆解字节了!用博图这个功能指令,5分钟搞定ARRAY转BOOL数组

本文详细介绍了西门子博图中`ARRAY_TO_BOOL`功能指令的高效应用,帮助工程师快速实现ARRAY到BOOL数组的转换。通过实战案例和参数配置指南,展示了如何5分钟内完成传统方法需半小时的任务,大幅提升PLC编程效率,特别适用于通信报文解析和设备状态监控。

weixin_42653691的博客 260

【WEB3.0零基础转行笔记】基础知识篇—第一讲:区块链基础

比特币是由中本聪于2009年创建的第一个成功的数字货币系统,它通过去中心化的点对点网络、密码学技术和工作量证明共识机制,在无需可信第三方的情况下,实现了安全、透明、有限供应的价值存储与转移,重塑了人类对货币、财产和信任的认知。它是一种基于密码学原理和点对点网络实现的、总量恒定且去中心化的数字货币系统。1. 从技术本质看去中心化的分布式账本:没有中央服务器或控制机构,账本由全球数以万计的节点共同维护。密码学货币:使用非对称加密(公私钥体系)确保资产所有权和交易安全。点对点价值传输协议。

tianp123的博客 1600

从零到一:AnythingLLM与Ollama的本地知识库搭建实战

本文详细介绍了如何使用AnythingLLM与Ollama从零开始搭建本地知识库,涵盖技术选型、环境部署、系统配置及优化策略。通过RAG技术架构,实现安全高效的文档管理与智能问答,特别适合企业及个人构建私有化知识管理系统。

weixin_29079643的博客 562

VMvare 桥接模式无法联网、没有未桥接的主机网络适配器,无法将网络更改为桥接状态。

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!战项目源码讲义》点击传送门即可获取!**

q16974058的博客 4330

专栏:区块链入门到放弃查看目录

为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块链更多知识如区块链底层实现、区块链专业术语等等,请网上查阅更专业的资料。笔者本专栏只是为了方便一些没有区块链经验和相关知识的开发者以入门使用。

银二码的代码博客 581

五种音频器件综合对比——《器件手册--音频器件》

音频器件当在蜂鸣片的两片电极之间接通交流音频信号时,蜂鸣片会根据信号的大小和频率发生振动,从而产生相应的声音。结构简单、造价低廉。广泛应用于玩具、电子表、电子仪器、电子钟表、定时器等电子电器方面。蜂鸣器是一种一体化结构的电子讯响器,采用直流电源供电,广泛应用于各种电子产品中作发声器件有源蜂鸣器:内部带震荡源,通电即发声,程序控制方便。无源蜂鸣器:内部不带震荡源,需用方波驱动,声音频率可控,价格相对便宜。计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品。

XU157303764的博客 1534

《区块链技术与应用》课堂笔记(五):实现

区块链的具体实现

目前专注区块链相关技术的学习与分享 1067

【python科研数据处理】将Endnote自动搜索的所有pdf文件,全都移动指定文件夹中

将Endnote自动搜索到的全部pdf文件,全都移动指定文件夹中1 背景2 问题解决 手动反爬虫,禁止转载:原博地址 https://blog.youkuaiyun.com/lys_828/article/details/122370892(优快云博主:Be_melting) 知识梳理不易,请尊重劳动成果,文章仅发布在优快云网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息 1 背景 在进行期末考试周后,面对最后一门功课,需要提交至少80篇SCI参考文献,因此最快下载文献的方式就是通过Web of S

lys_828的博客 1825

海康VisionMaster与西门子PLC1200进行S7通信

通信是连通算法平台和外部设备的重要渠道,在海康VisionMaster算法平台中既支持外部数据的读入也支持数据的写出,当通信构建起来以后既可以把软件处理结果发送给外界,又可以通过外界发送字符来触发相机拍照或者软件运行。 本文以西门子PLC1200作为外部设备为例,讲解海康VisionMaster与西门子PLC1200进行S7通信。......

haier123888的博客 1万+

先立一个flag,今年学好区块链

立个flag:今年学会区块链: 分阶段: 1.区块链简介: 2009-2018区块链发展史 区块链基本原理 区块链架构 公有链、联盟链和私有链 共识机制,非对称加密和挖矿 区块链1.0比特币、区块链2.0智能合约、区块链3.0互联网迁徙 分叉原理与案例 代币经济的价值与区块链商业模式 数字货币的投资逻辑 区块链的社区文化 区块链全球布局与行业发展现状 2.Go...

StarLight-Na 1941

【经验&技巧】DDR仿真中的挑战与解决方案

由于DDR的数据总线具备双向数据传输功能,需要对读写模式进行独立仿真环境的创建,并且分为连续和突发模式,再加之有单端和差分信号、有数据总线和地址总线,需要在数据传输过程中额外注意串扰的影响,并选择合适的驱动和负载以找寻设计裕量与串扰强度之间的平衡,因此,实际操作步骤和分析过程还是较为繁琐耗时的,需要设计者具有足够的耐心。

一只豌豆象的博客 1642

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

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

cryptocxf的博客 6万+

深度学习工具包 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")

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

这33篇区块链必读论文, 读过5篇以上的竟不到1%

作者 |Bhaskar Krishnamachari译者 | Guoxi责编 | Aholiab出品 | 区块链大本营(blockchain_camp)区块链行业中,很...

区块链大本营 4万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: kafka简介安装和使用
下一篇: 第一篇:区块链通识基础知识总结
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值