博客
技术记录

快速入门区块链

比特币原理、哈希算法、数字签名、UTXO 模型的技术深度解析。

· 10 min read

缘由

区块链(Blockchain)技术源于比特币。在比特币中,为了保证每笔交易可信并不可篡改,中本聪发明了区块链,它通过后一个区块对前一个区块的引用,并以加密技术保证了区块链不可修改。随着比特币的逐渐发展,人们发现区块链本质上其实是一个分布式的,不可篡改的数据库,天生具有可验证、可信任的特性,它不但可用于支持比特币,也可用于数字身份验证,清算业务等传统的必须由第三方介入的业务,从而降低交易成本。

比特币

比特币是一种数字货币,数字货币是基于数学加密原理构建的不可伪造的货币系统,而比特币是第一个基于数学加密原理构建的分布式数字货币系统,比特币使用区块链技术实现了数字货币的可信支付。

  • 世界上最早的纸币出现在中国宋朝,称为"交子"。纸币的发行机制决定了必须由政府发行,并且强行推广使用,因此纸币又称法币。
  • 电子货币本质上仍然是法币,它仍然是由央行发行,只是以计算机技术把货币以实体纸币形式的流通变成了银行计算机系统的存款。和纸币相比,电子货币具有更高的流动性。我们每天使用的网上银行、支付宝、微信支付等,都是这种方式。
  • 而比特币作为一种数字货币,它和电子货币不同的是,比特币不需要一个类似银行的中央信任机构,就可以通过全球P2P网络进行发行和流通,这一点听上去有点不可思议,但比特币正是一种通过密码学理论建立的不可伪造的货币系统。

比特币解决的问题

比特币通过技术手段解决了现金电子化以后交易的清结算问题。传统的金融行业的交易是基于中央数据库的数据增减进行的,这些交易高度依赖专业的开发和运维人员,以及完善的风控机制。

总的来说,比特币具有以下特点:

  • 创建了无需信任中心的货币发行机制
  • 发行数量由程序决定,无法随意修改
  • 交易账本完全公开可追溯,不可篡改
  • 密码学理论保证货币防伪造,防双花
  • 数字签名机制保证交易完整可信,不可抵赖和撤销

即为点对点的电子现金系统。

区块链的原理

区块链就是一个不断增长的全网总账本,每个完全节点都拥有完整的区块链,并且,节点总是信任最长的区块链,伪造区块链需要拥有超过51%的全网算力。

区块链是由一个一个区块构成的有序链表,每一个区块都记录了一系列交易,并且,每个区块都指向前一个区块,从而形成一个链条:

区块链结构

每一个区块上都有唯一的哈希标识,称为区块哈希,区块通过记录上一个区块的哈希来指向上一个区块:

区块哈希链

每一个区块上面还有 Merkle Hash 用来确保该区块的所有交易记录无法被篡改。

Coinbase 交易是每个区块中的第一笔交易,没有输入(UTXO来源),由矿工创建,用于生成新的比特币。比特币网络通过 Coinbase 交易实现货币发行,是系统中新比特币进入流通的唯一方式。Coinbase 奖励需100区块确认(约16小时)后才可花费,防止双花攻击。

哈希算法

哈希算法,又称散列算法,它是一个单向函数,可以把任意长度的输入数据转化为固定长度的输出。类似的,Git 的 commit 每一次也生成的是哈希算法。

要设计一个安全的哈希算法,必须满足:通过输入可以很容易地计算输出,但是,反过来,通过输出无法反推输入,只能暴力穷举。

哈希碰撞

碰撞是指,如果两个输入数据不同,却恰好计算出了相同的哈希值,那么我们说发生了碰撞。哈希碰撞的本质是把无限的集合映射到有限的集合时必然会产生碰撞。输出位数越多,输出集合就越大,碰撞率就越低。

安全的哈希算法还要满足:输出无规律。输入数据任意一个bit的改动,会导致输出完全不同,从而让攻击者无法逐步猜测输入,只能依赖暴力穷举来破解。

常用哈希算法

哈希算法输出长度(bit)输出长度(字节)
MD5128 bit16 bytes
RipeMD160160 bits20 bytes
SHA-1160 bits20 bytes
SHA-256256 bits32 bytes
SHA-512512 bits64 bytes

比特币当中使用的两种哈希算法是 SHA-256 和 RipeMD160。

  • 一种是对数据进行两次SHA-256计算,这种算法在比特币协议中通常被称为hash256或者dhash。
  • 另一种算法是先计算SHA-256,再计算RipeMD160,这种算法在比特币协议中通常被称为hash160。

区块链不可篡改特性

Merkle Hash

Merkle Hash 是把一系列数据的哈希根据一个简单算法变成一个汇总的哈希。假设一个区块有4个交易,我们对每个交易数据做dhash,得到4个哈希值 a1,a2,a3 和 a4,然后两两拼接计算,最终得到 Merkle Hash。

Merkle Hash 的计算过程如下(以4个交易为例):

Merkle Hash 4个交易

只有3个交易时:

Merkle Hash 3个交易

5个交易时:

Merkle Hash 5个交易

修改任意一个交易哪怕一个字节,或者交换两个交易的顺序,都会导致 Merkle Hash 验证失败,也就会导致这个区块本身是无效的,所以,Merkle Hash 记录在区块头部,它的作用就是保证交易记录永远无法修改。

Block Hash

区块本身用 Block Hash 来标识。区块头部的 Prev Hash 记录了上一个区块的 Block Hash:

Block Hash 结构

区块链链条

这样,可以通过 Prev Hash 追踪到上一个区块。这些区块串起来就形成了区块链。

区块链的第一个区块(又称创世区块)并没有上一个区块,因此,它的 Prev Hash 被设置为 00000000...000。

如果一个恶意的攻击者修改了一个区块中的某个交易,那么 Merkle Hash 验证就不会通过。攻击者必须先重新计算这个区块的 Block Hash,然后,再把后续所有区块全部重新计算并且伪造出来,才能够修改整个区块链。这个攻击者必须掌握全网51%以上的算力才行,所以,修改区块链的难度是非常非常大的。

P2P(peer to peer)交易原理

比特币的交易是一种无需信任中介参与的P2P(Peer-to-peer)交易。传统交易需要一个中间商确保交易安全性例如银行,因为银行记录了交易双方的账户资金,能保证在一笔交易中,要么保证成功,要么交易无效。

在比特币这种去中心化的P2P网络中,并没有一个类似银行这样的信任机构存在,要想在两个节点之间达成交易,就必须实现一种在零信任的情况下安全交易的机制。

数字签名

如何确认这个声明是 B 做出的,这就要用到数字签名,而且不可篡改。在比特币交易中,付款方就是通过数字签名来证明自己拥有某一笔比特币,并且,要把这笔比特币转移给指定的收款方。

使用数字签名时,每个人都可以自己生成一个秘钥对,这个秘钥对包含一个私钥和一个公钥:

  • 私钥(Secret Key / Private Key):必须严格保密,不能泄漏给其他人
  • 公钥(Public Key):可以公开给任何人

数字签名:防伪造,防篡改,防抵赖。

数字签名算法

常用的数字签名算法有:RSA算法,DSA算法和ECDSA算法。

比特币采用的签名算法是椭圆曲线签名算法:ECDSA,使用的椭圆曲线是标准曲线 secp256k1:

ECDSA 椭圆曲线 secp256k1

可以这么类比,公钥就是银行卡号,私钥就是银行卡密码。但是比特币私钥(密码)事先确定,然后计算出公钥(卡号),密码不可以更改,更改了密码之后相当于所有的东西都改了。

由于比特币账本是全网公开的,所以,任何人都可以根据公钥查询余额,但是,不知道持卡人是谁。这就是比特币的匿名特性。

⚠️ 私钥不能丢失,丢失了之后里面对应的比特币也丢失了。比特币的P2P网络不存在中央节点,私钥只有持有人自己知道,因此,丢失了私钥,对应的比特币就永远无法花费。

⚠️ 绝不能自己想一个私钥或者使用伪随机数创建私钥。

比特币钱包

比特币钱包实际上就是帮助用户管理私钥的软件。分类有:

  • 本地钱包:是把私钥保存在本地计算机硬盘上的钱包软件,如 Electrum
  • 手机钱包:和本地钱包类似,但可以直接在手机上运行,如 Bitpay
  • 在线钱包:是把私钥委托给第三方在线服务商保存
  • 纸钱包:是指把私钥打印出来保存在纸上
  • 脑钱包:是指把私钥记在自己脑袋里(不建议使用)

交易与 UTXO

在区块链当中,每一个区块都至少记录了一笔交易,一笔交易就是把一定金额的比特币从一个输入转入到一个输出,实际记录的是双方的公钥地址。

未花费的输出被称为 UTXO:Unspent Transaction Output。

交易费用 = 输入 - 输出(差额算入矿工奖励)

私钥、公钥与地址的推导关系

  • 私钥 → 通过 ECDSA 算法推导出 → 公钥
  • 公钥 → 通过 Hash160(SHA256 + RipeMD160)计算 → 地址(以1开头的字符串)

比特币的地址并不是公钥,而是公钥的哈希,从公钥能推导出地址,但从地址不能反推公钥,因为哈希函数是单向函数。

签名

签名算法是使用私钥签名,公钥验证的方法,对一个消息的真伪进行确认:

signature = sign(message, sk)      // 用私钥签名
isValid = verify(message, signature, pk)  // 用公钥验证

数字签名算法能通过密码学理论证明:

  • 签名不可伪造,因为私钥只有签名人自己知道
  • 消息不可篡改,如果原始消息被人篡改了,对签名进行验证将失败
  • 签名不可抵赖,如果对签名进行验证通过了,签名人不能抵赖自己曾经发过这一条消息

对消息进行签名,实际上是对消息的哈希进行签名,这样可以使任意长度的消息在签名前先转换为固定长度的哈希数据。

比特币对交易数据进行签名和对消息进行签名的原理是一样的,只是格式更加复杂。对交易签名确保了只有持有私钥的人才能够花费对应地址的资金。

0 次阅读

最后更新于

评论

欢迎聊聊这篇文章。评论无需登录,审核后公开。

本页目录