认识区块链(四):区块链的底层实现之密码学

密码学概述

区块链起源于密码学,可以说区块链的核心,以及安全性、不可篡改性的来源很大一部分都是基于密码学实现的。

密码学相信对大家来说都有接触过,但是不搞安全的同学可能没有深入学习过,密码学是网络安全、信息安全等专业的奠基学科。按照时间分类,我们可以把密码学分为古典密码学和现代密码学。

古典密码学主要是通过一些移位对应、字母重排、替换字母、或者简单的其他方法进行加密的。比如a-> i, b->u 进行一个简单的加密,在现代计算机面前显然是没有任何安全性的。

现代密码学除了关注信息的保密性和可传递性,还涉及到了信息的完整性、不可抵赖性,以及防攻击性等等。

区块链中的密码学

哈希算法

哈希也被称为散列算法,指的是对一个任意的输入,都能给出一个定长的字符串,它能够代表一段数据的唯一特征,类似于人类的指纹,所以在后端开发中我们也会使用哈希算法对某些数据进行加密,通过这个哈希值来保证数据的唯一性。

在前文我们已经说过,每一个区块链中的区块都有一个值previous hash,这个值指向的是当前区块的上一个区块。

同时,在一个区块中会使用哈希树(Merkle Tree)来组织交易数据,以确保数据的完整性,提高效率。

以一个长度为4的交易作为例子,哈希树的构建方式如下

  • 将4个交易按顺序排列,作为树的叶子结点
  • 对每两个相邻的交易数据进行哈希操作,得到它们的哈希值
  • 将得到的哈希值组成新的一层节点,再次进行两两哈希操作

这就保证了树的根节点作为区块头的一部分,存储在区块链上。这个头的值是对所有交易数据进行哈希计算得到的,因此任何一个交易数据的变化都会导致树头结点的变化。

非对称加密

区块链中的参与者通过会使用椭圆曲线算法生成一堆公私钥对组合,公钥对外公开,私钥自己持有。通过公钥对数据进行加密,私钥对数据进行解密。因为私钥是自己持有的,并且不需要在网络中进行传递,这样就能够验证身份的唯一性、保证身份的安全性。

包括区块链的数字钱包也用到了这个技术,数字资产通常存储在加密货币钱包中,这些钱包使用非对称加密来保护用户的私钥,私钥进行签署交易,公钥用于接收资产。

同时,私钥会用于生成数字签名,而相应的公钥用于验证这个数字签名。区块链中的交易通常都包含数字签名,以验证交易的真实性和完整性。其他参与者可以使用发送者的公钥验证数字签名,确保交易没有被篡改,并且确实是由合法的私钥签名生成的。

在白皮书中,因为数字签名的唯一性,数字签名还用来防止double-spending问题,通过数字签名来确保交易的唯一性,避免同一份资金被重复使用。

推荐阅读

当说到云原生时,我们究竟在谈论什么? - 掘金

不太熟悉Git? 不妨看看这篇文章 - 掘金

一文搞定常见分布式事务实现 - 掘金

你真的理解分布式理论吗? - 掘金

深入了解异地多活 - 掘金

02.K8S架构详解 - 掘金

01.你为什么需要学习K8S - 掘金

相关推荐
酷爱码1 小时前
springboot 动态配置定时任务
java·spring boot·后端
计算机-秋大田1 小时前
基于SpringBoot的美食烹饪互动平台的设计与实现(源码+SQL脚本+LW+部署讲解等)
vue.js·spring boot·后端·课程设计·美食
加油,旭杏2 小时前
【go语言】grpc 快速入门
开发语言·后端·golang
brzhang2 小时前
墙裂推荐一个在 Apple Silicon 上创建和管理虚拟机的轻量级开源工具:lume
前端·后端
沈韶珺3 小时前
Visual Basic语言的云计算
开发语言·后端·golang
沈韶珺3 小时前
Perl语言的函数实现
开发语言·后端·golang
美味小鱼4 小时前
Rust 所有权特性详解
开发语言·后端·rust
我的K84094 小时前
Spring Boot基本项目结构
java·spring boot·后端
慕璃嫣5 小时前
Haskell语言的多线程编程
开发语言·后端·golang
晴空๓5 小时前
Spring Boot项目如何使用MyBatis实现分页查询
spring boot·后端·mybatis