【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
区块链技术核心
简单来说,区块链是一个提供了拜占庭容错、并保证了最终一致性的分布式数据库;从数据结构上看,它是基于时间序列的链式数据块结构;从节点拓扑上看,它所有的节点互为冗余备份;从操作上看,它提供了基于密码学的公私钥管理体系来管理账户。
或许以上概念过于抽象,我来举个例子,你就好理解了。
你可以想象有100台机器之间的网络是广域网,并且,这100台机器的拥有者互相不信任。那么,我们采用什么样的算法(共识机制)才能够为它提供一个可信任的环境,并且使得:节点之间的数据交换过程不可篡改,并且已生成的历史记录不可被篡改;节点之间的数据交换过程不可篡改,并且已生成的历史记录不可被篡改;节点之间的数据交换过程不可篡改,并且已生成的历史记录不可被篡改;基于少数服从多数的原则,整体节点维护的数据可以客观反映交换历史。区块链就是为了解决上述问题而产生的技术方案。
散列函数
区块链技术的一个重要组件是将哈希函数用于许多操作。哈希是一种将哈希函数应用于数据的方法,其为几乎任何大小的输入(例如,文件,文本或图像)计算相对独特的输出(称为消息digest,或仅仅是digest)。它允许个人独立地获取输入数据、散列数据并得出相同的结果 - 证明数据没有变化。即使对输入的最小改变(例如,改变单个位)也将导致完全不同的输出。表1显示了这方面的简单例子。
哈希函数具有以下重要的安全属性:
它们具有逆向抗性。这意味着它们是单向的; 在给定一些输出值的情况下计算正确的输入值在计算上是不可行的(例如,给定digest,找到x使得hash(x)=digest)。
它们具有第二逆向抗性。这意味着无法找到哈希到特定输出的输入。更具体地,设计哈希函数以便在给定特定输入的情况下,找到产生相同输出的第二输入(例如,给定x,找到y使得hash(x)=hash(y))在计算上是不可行的。可用的唯一方法是穷举搜索输入空间,但这没有任何成功的可能。
它们具有抗冲击性。这意味着找不到两个散列到同一输出的输入。更具体地,找到产生相同digest的任何两个输入在计算上是不可行的(例如,找到hash(x)=hash(y)的x和y)。
在许多区块链实现中使用的特定哈希函数是安全哈希算法(SHA),其输出大小为256位(SHA-256)。许多计算机在硬件中支持该算法,使其计算速度快。SHA-256的输出为32字节(1字节= 8位,32字节= 256位),通常显示为64字符的十六进制字符串(参见下面的表1)。
公钥加密
在公钥密码体系中,一个难题在于如何保证用户获得的公钥和通信目标节点的公钥保持一致,也就是公钥认证问题。为了避免公钥信息被攻击者篡改,建立合适的公钥系统能够降低节点的公钥信息被篡改的风险。传统的公钥分发方案基于系统中存在的一个可信的中心节点,由可信的中心节点负责系统中的公钥的生成和分发工作。
由于传统上分布式系统存在系统中难以达成一致的共识的难题,因此分布式系统在信息存储相关应用上受到很大的限制。在引入区块链的共识形成机制之后,能够给出一个较为可行的实现方式。通过区块链技术,在分布式网络中能够实现各个节点之间能够构建一个统一的公钥记录表。用户存储在公钥系统中的公钥能够有较高的抗更改性能。本发明通过将区块链技术运用于公钥分发环节,提出了一个分布式的公钥分发系统。
RSA又慢又不安全,所以比特币和以太坊都不采用,而是使用了更安全的椭圆曲线算法 – ECC来做非对称加密基础算法。ECC的210位算法难度就相当于RSA 2048的难度,性能则是数量级的区别。那么椭圆算法又是何方神圣呢?
前面讲过非对称算法无非是设计一个数学难题,使得单向计算很方便,而反向计算很难,如RSA使用因式分解的原理,两个大质数相乘很容易,但大数分解质因子很难。
椭圆算法ECC其实就是利用乘法容易,而除法难的特点,设计一个乘法:K = k * G,其中大K是公钥,小k是私钥,G是生成点。由私钥推导公钥很容易,只需要k个G相加即可。但是从公钥推导私钥很难,也就是无法计算公钥K除以G。
当然这个加法不能用我们日常的整数加减法,而是利用函数所定义的一个特殊椭圆曲线上散列点的特性定义的加法。其中p是一个常数。不同p可以设计成不同的曲线,比特币使用的p = 2256 – 232 – 29 – 28 – 27 – 26 – 24 – 1,这个曲线的名称就叫secp256k1。这是一个非常大的数,曲线上的点是一个复杂散点。
区块链
所谓挖到矿就是要猜到一个nonce值让该区块的摘要值小于一个会根据难度而线性调整的目标值,这也是所谓的工作量证明。简单一点说,就是重复计算去块头额哈希值,不断地改变参数,直到与哈希值匹配的一个过程。当节点创建一个候选区块的时候,那旷工就准备开始进行挖矿。矿机开始超高速运行SHA256算法,这些硬件会通过USB链接到存在于电脑上的挖矿节点上,然后挖矿节点会将区块头信息传给这些硬件,让他们进行非常高频的nonce测试。当一项交易被区块收录的时候,可以被认为是一次确认。在此区块之后每产生一个区块,此项的交易数就再加一。当确认数目到达六次以上的时候,通常就能认为此项交易比较安全并且不可逆转。那么现在,这笔交易已经在比特币网络上传播开,但只有通过验证且加到一个区块中的时候,这笔交易才能成为区块链的一部分。新的交易不断地涌入比特币网络,当节点们看这些交易的时候,会将这些交易临时放到自己各自维护的一个临时的交易池中,当旷工创建出一个区块以后,便可以把这些交易从交易池中拿出放到这个新区块中,然后通过解决一个难度很大的问题去证明这个区块的合法性。
如 今,商业互联网每年的经济估值已达1.5万亿美元。很难想象,曾几何时,几乎所有人都在反对互联网商务。早期的互联网先锋中不乏不折不扣的纯粹主义者,他们认为“商业的铜臭味”会侵蚀互联网这个“合作、共享、信息交换与互助的独特堡垒。” 这些网络纯粹主义者直言不讳,不希望刚刚诞生的互联网被商业势力所左右。但他们未曾料想,到了2016年,每天有超过20亿人在积极主动地使用电子商务。
眼下,区块链就像当年的互联网,正处于获得广泛接纳和应用的临界点上。区块链技术能够像互联网一样改变世界,但前提是,需要解决技术圈内正在探讨的关键性问题,倾听实用主义者和现实型创新者的声音。
因此分布式账本技术在应用于企业和授权管理型网络时必须变革——这个世界并不完美,人为失误、法律缺陷和恶作剧都需要该技术更加灵活;同时,不可编辑让该技术的前景喜忧参半,欧洲出台的“被遗忘权”法律、近期高调的加密货币盗窃活动以及由来已久的“乌龙指”,均给金融服务业带来了日益严重的危害。
如果业界准备引入新技术,就应当允许修正人为失误。因此埃森哲与知名学者共同推出了“可编辑区块链”的概念,埃森哲正在开发的一项区块链技术获得了专利。该技术是允许各方在必要情况下更改数据的许可链,重点探索了如何在出现错误时进行更正。埃森哲相信这个技术有利于使区块链更加成熟,也有意向按照支持者的要求开源该技术,使其能够帮助更多需要它的人。
挖矿
产生新的区块之间的间隔时间。比特币网络将挖矿难度调整为:间隔10分钟。也就是说,每10分钟产生一个区块。那么,比特币网络是如何确保区块产生的间隔时间,保持在10分钟的?答案:比特币网络通过增加或减少PoW(工作量证明)的难度来强制执行。难度增加,矿工需要更多时间来解决这个难题。难度降低,矿工需要更多时间来解决这个难题。以一个交易0.25KB计算:十分钟一个区块:1M / 0.25KB = 1000 kB / 0.25KB = 4000 个交易每秒平均能打包:4000/10/60 = 6.67 个交易所以,很多资料提到比特币每秒处理7笔交易。创建新区块的矿工,得到的新币奖励。100万枚比特币,均由矿工挖得。最开始,每个区块奖励50个比特币。之后每挖完21万个区块(约4年时间),奖励就减半。比特币的每笔交易都可能包含一笔交易费。交易费=每笔交易记录的输入 - 输出。挖矿成功的矿工,将获得该区块所有交易的费用。目前,交易费占矿工收入中很少的一部分,大部分收益来自于区块奖励。然而随着区块奖励的递减,以及每个区块中所包含的交易数量的增加,交易费占总工收益的比重,将会逐渐增加。在2140左右,因为比特币几乎挖完,“挖矿人”挖到的数据块,将不会再产生额外的区块奖励——比特币。但是这一个区块里所有的交易费用,仍然归矿工。
所以,2140之后,矿工的所有收益,都将由交易费构成。
根据比特币基本算法,比特币每10分钟产生1个区块(block),每个区块里有N个比特币作为报酬(N的数量在下文中说明),这个区块包含了最近10分钟所有的比特币交易信息。制造比特币的过程叫做“挖矿”(mining),在这个过程中,计算机把最近收到的帐单打包在刚制造的区块里,这个打包的过程即制作的过程,只有极其稀少的几率被制造成功。(你可以理解成把新收到的帐单合在一起,一次成型不可修改,如果制造失败就要再来一次)一旦制造成功,你就把这个区块广播出去,这就意味着,你获得了这个区块中的N个比特币作为报酬。那么N是多少呢?根据比特币算法,在比特币发布之日起的头4年里,N = 基础报酬(50个比特币) + 交易报酬(过去10分钟内整个比特币网络耗费的交易手续费,前面已经说过,每笔比特币交易会消耗0.001比特币作为报酬给挖矿的人),每隔4年,N的基础奖励将减少一半,也就是说,头4年为50,第5-8年为25,第9-12年为12.5,以此类推。而随着比特币越来越普及,交易越来越频繁,N的交易奖励会逐渐增加。从2013年5月起,比特币正式进入了第5年,因此到2017年5月之前,每个区块的报酬N为25+交易报酬,根据当前的比特币价格,每个区块的报酬约等于19000元人民币。
挖矿的过程就是计算哈希,我们传送的数据都会生成一个哈希,然而,这个值要满足一定的条件。比如规定64位字符串中,前面10位都是0的哈希就是满足条件的,即挖矿成功。
我们的交易数据生成哈希是固定的,是外汇常见问题http://www.kaifx.cn/lists/question/比如,数据为t_data1,哈希值已经固定了,这时,我们就需要计算一个随机数Nonce,区块链中都这么叫,可以理解为随机数x,与我们的交易数据一起进行哈希运算,例如当我们找到一个数为12345时,生成的哈希结果前10位都是0,我们就成功了。
这种挖矿机制比拼的就是算力,即每秒钟哈希运算的次数,每个人都没有捷径可以走,但是,一旦计算出来Nonce值,验证非常快速,我们计算之后会全网广播,其他节点验证之后没有问题就可以上链了。所谓比特币10分钟出一个区块,也是动态计算的,如果全网的算力增大,系统会自动调节难度值,将哈希结果变小,难度就会上升。
来源:oschina
链接:https://my.oschina.net/u/4219976/blog/3151375