什么是区块链技术?

我们先来给区块链技术下个定义:

区块链是一种分类帐,它使用加密技术和激励措施并以防篡改的方式记录交易。这使匿名双方进行信任最小化(trust-minimized)交易,而不需要可信中介。

现在,让我们整合这些零散的知识,以便你在文章的最后对区块链技术有一个完整认识。

基元

在我们深入研究区块链之前,需要建立一些基元。基元类似于建筑材料。如果你想建造一间房子,你需要木料、螺丝、电钻和锯子。在你开始建造之前,最好对每个工具都足够了解。区块链也类似。

区块链的基本构成要素就是加密基元。

而密码学是研究在第三方(即敌人)的存在下安全通信的技术。

现代密码学被应用于网址、信用卡芯片和计算机密码之中。它用来阻止第三方(黑客,小偷等)窃取敏感数据,如信用卡信息。

第一个基本构成要素是哈希函数。

哈希函数

哈希函数是一种允许你对数据进行加密的数学函数。

哈希函数有三个属性:

它的输入可以是任意大小。

例如,我可以使用“我喜欢冰淇淋”这个短语作为输入,或者我也可以使用《战争与和平》的全部文本,两者都行。

不论使用任何大小的输入,哈希函数的特定散列算法决定了其固定大小的输出。为了让算法过于简单,我们将使用256位输出(它是比特币所使用的)。

不论我使用“我喜欢冰淇淋”这一短语作为输入,还是使用《战争与和平》的全文作为输入,两者都会产生相同大小的输出。

使用SHA 256算法,短语“我喜欢冰淇淋”(没有引号)创建输出:

138F4504A873C01D0864343FAD3027F03CA9BEA2F0109005FA4FC8C7DCC12634

从古腾堡计划(project Gutenberg)复制的整本《战争与和平》(全587,287词)创建输出:

57027F5B3877ABBE43ACB101D59E963BC2CC0E86A6EBCCC34DFD035BBF83B096

即使输入的文本长度相差146,821倍,你也可以获得相同大小的输出。这一点很酷也很有用。

函数是可高效计算的,对于任何给定的输入字符串,你可以在合理的时间内获得输出。

即使我使用《战争与和平》的整个文本作为输入,它仍然可以在较短时间内将其转换为输出。

以上是一般哈希函数的属性。一般哈希函数允许你将大量数据映射到一个小空间,这有助于存储和处理不同类型的数据。

不过,我们应把重点放在加密哈希函数上,因为它是区块链中使用的函数。

加密哈希函数有三个附加属性:

抗碰撞性(Collision Resistance)

确定隐匿性(Deterministic Hiding)

难题友好性(Puzzle Friendliness)

加密哈希函数

抗碰撞性

这里的碰撞是指两个不同的输入产生相同的输出。虽然输出大小相同,但输出本身不会与其他输出相同。“我喜欢冰淇淋”与《战争与和平》的整个文本产生相同大小的输出,但字符不同。

如果它们产生完全相同的输出,你解密了我发送给你的加密文本之后,并不会知道我是想告诉你“我喜欢冰淇淋”还是你应该阅读《战争与和平》。

值得注意的是,两个“邻近”输入不会产生邻近的输出。《战争与和平》的哈希与改变了一个字符的《战争与和平》的哈希完全不同。

使用SHA 256,整本《战争与和平》生成哈希值:

57027F5B3877ABBE43ACB101D59E963BC2CC0E86A6EBCCC34DFD035BBF83B096

如果我删除最后一个句点,但保留其他所有内容,则会生成哈希值:

E2E2E4FFD582E20474F0310C2132EAE5F2D766C6A253C1BC4AF57861095B30FA

这非常类似于混沌系统中的两个“邻近”起点非常迅速地导致两个完全不同的未来轨迹。哈希函数的这种“混乱不规则性”会产生抗碰撞性。它的输出几乎随机(理论上并不随机),因此不太可能发生碰撞。我们还能压缩数据,因为它可以将「无穷大」映射到有限空间。

这一特性在汇款时尤其重要。钱包的公钥是使用加密哈希函数从私钥生成的。谁都不希望其他人能够通过逆向工程获取公钥来计算你的私钥(因为你的钱可能被偷)。

如果没有人能找到碰撞的情况,则可以认为哈希函数是抗碰撞的。从理论上讲,我们知道碰撞的存在是因为输入的数量是无限的,但输出的数量是有限的——只有有限种方法可以排列64个字符。

但在实践中,加密哈希函数SHA 256是抗碰撞的,因为没有人发现过碰撞,并且它发生的几率是天文数字。如果人类制造的每台计算机自宇宙开始以来一直试图发现碰撞,那么它发生的可能性低于地球在接下来的两秒钟内被巨大的流星摧毁的可能性。

所以,碰撞是可能发生的,但我们首先还有很多其他更重要的问题要解决。

确定隐匿性

哈希值看起来是随机的,但实际上是确定的。因此,它们的输出是可重现的,只要你使用相同的输入,就可以持续获得相同的输出。这意味着,知道输入的两方可以通过向第三方显示他们的哈希来验证对方是否知道输入。

加密哈希函数的第二个属性是隐匿性。隐匿性意味着即便给出输出,也没有可行的方法来计算输入。

也就是说,第三方观察者无法知道

138F4504A873C01D0864343FAD3027F03CA9BEA2F0109005FA4FC8C7DCC12634

的意思是“我喜欢冰淇淋。”

但是,如果我知道输入是“我喜欢冰淇淋”,那么通过检查你的哈希,我可以轻松验证你是否知道输入。

然而,如果其他人看到哈希,他们就无法使用它来计算输入。这允许知道输入的人使用散列后的输出在公共频道中安全地进行通信,而不必担心第三方观察者获取信息。

难题友好性

第三个属性是加密哈希函数的难题友好性。这意味着如果有人想要生成一个与“我喜欢冰淇淋”相同的输出的哈希,那么找到一个完全符合这一输出的另一个值是非常困难的。

生成哈希的算法是尝试每个可能的字符串,按长度排序,然后按字母顺序排序,直到得到哈希为相同值的字符串。这等于是大海捞针,所以我们得到的概率表明,小行星消灭地球上的所有生命是一个更紧迫的问题。

另一方面是加密哈希函数难以逆转(reverse)。相较于数据结构或压缩算法中使用的哈希,这是加密哈希的主要特点。

这也是区块链军备竞赛的一部分——黑客在逆向推演哈希函数方面做得越来越好,因此密码学家总是得想出更强大的哈希函数。

除此之外,难题友好属性使区块链难以篡改。如果我想替换像“我喜欢冰淇淋”这样的项,我不可能在没有其他参与者知道的情况下做到。



主链侧链开发数字货币交易所白皮书区块链浏览器跨境支付场内场外宠物挖矿游戏基金会牌照 181-4069-6008 微信电话同号

被加密哈希函数散列后,输入的微小变化也会导致输出的显著不同,从而达到防篡改的目的。

加密哈希函数看起来是随机的(因此没有碰撞),无法逆转,并隐匿输入,但同时它们又是完全确定的。这就是它们有用的原因!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

手把手:四色猜想、七桥问题…程序员眼里的图论,了解下?(附大量代码和手绘)

64640
来自专栏C语言及其他语言

[每日一题]台球碰撞

今天这题可大有来头了,湖南省第六届大学生计算机程序设计竞赛题目,比较经典也比较有名 题目描述 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上...

37360
来自专栏数据结构与算法

洛谷2017 5月月赛R1

我只想说面对这种难度的题目就是冲着20%的数据暴力。。。 分数:40+20+36.1+38+0+19 T1 签到题 III 题目背景 pj组选手zzq近日学会了...

28750
来自专栏趣学算法

数据结构 第10讲 好玩贪吃蛇——数字矩阵

11130
来自专栏程序员与猫

使用抽象类和接口的优解

1. 前言 笔者相信,每个使用面向对象语言的开发者自编码以来,肯定便琢磨过抽象类(Abstract)和接口(Interface)的区别。可能一些人已经找到了适...

23450
来自专栏Java帮帮-微信公众号-技术文章全总结

Java案例-贪吃蛇小游戏

Java案例-贪吃蛇小游戏 先来看看,这个游戏的截图。 ? 这里可以自定义难度系数(其实就是蛇自己移动的速度),共分10级。这里后面我会说实现方法,这都可以改...

1.4K70
来自专栏Java呓语

装饰者模式(动态组合)

如果您是第一次阅读我的设计模式系列文章,建议先阅读设计模式开篇,希望能得到您宝贵的建议。

13930
来自专栏数据结构与算法

√n求单值欧拉函数

基本定理: ? 首先看一下核心代码: 核心代码 ? 原理解析: 当初我看不懂这段代码,主要有这么几个问题: 1.定理里面不是一开始写了一个n*xxx么?为什么代...

38370
来自专栏小樱的经验随笔

hihoCoder #1015 : KMP算法【KMP裸题,板子】

#1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程...

27750
来自专栏程序员与猫

使用抽象类和接口的优解

9810

扫码关注云+社区

领取腾讯云代金券