区块链教程
区块链(Blockchain)技术源于比特币。在比特币中,为了保证每笔交易可信并不可篡改,中本聪发明了区块链,它通过后一个区块对前一个区块的引用,并以加密技术保证了区块链不可修改。
随着比特币的逐渐发展,人们发现区块链本质上其实是一个分布式的,不可篡改的数据库,天生具有可验证、可信任的特性,它不但可用于支持比特币,也可用于数字身份验证,清算业务等传统的必须由第三方介入的业务,从而降低交易成本。
比特币
什么是数字货币?一句话概括,数字货币是基于数学加密原理构建的不可伪造的货币系统,而比特币是第一个基于数学加密原理构建的分布式数字货币系统。
比特币和区块链有什么关系?一句话概括,比特币使用区块链技术实现了数字货币的可信支付。
比特币的历史可以追溯到2008年10月,一个名叫中本聪的神秘人物在一个密码学朋克论坛上发表了一篇比特币:一种点对点的电子现金系统的文章,这篇文章被看成是比特币的白皮书。
数字货币 vs. 电子货币
而比特币作为一种数字货币,它和电子货币不同的是,比特币不需要一个类似银行的中央信任机构,就可以通过全球P2P网络进行发行和流通。
比特币解决的问题
比特币通过技术手段解决了现金电子化以后交易的清结算问题。
传统的基于银行等金融机构进行交易,本质上是通过中央数据库,确保两个交易用户的余额一增一减。这些交易高度依赖专业的开发和运维人员,以及完善的风控机制。
比特币则是通过区块链技术,把整个账本全部公开,人手一份,全网相同,因此,修改账本不会被其他人承认。比特币的区块链就是一种存储了全部账本的链式数据库,通过一系列密码学理论进行防篡改,防双花。
总的来说,比特币具有以下特点:
- 创建了无需信任中心的货币发行机制;
- 发行数量由程序决定,无法随意修改;
- 交易账本完全公开可追溯,不可篡改;
- 密码学理论保证货币防伪造,防双花;
- 数字签名机制保证交易完整可信,不可抵赖和撤销。
区块链原理
区块链是由一个一个区块构成的有序链表,每一个区块都记录了一系列交易,并且,每个区块都指向前一个区块,从而形成一个链条。每个区块都有一个唯一的哈希标识,被称为区块哈希,同时,区块通过记录上一个区块的哈希来指向上一个区块。
哈希算法
区块链的不可篡改特性是由哈希算法保证的。
哈希算法,又称散列算法,它是一个单向函数,可以把任意长度的输入数据转化为固定长度的输出:h=H(x)
通过输出无法反推输入,只能暴力穷举。
哈希碰撞
一个安全的哈希算法还需要满足另一个条件:碰撞率低。碰撞是指,如果两个输入数据不同,却恰好计算出了相同的哈希值,那么我们说发生了碰撞。
哈希算法有什么作用?假设我们相信一个安全的哈希算法,那么我们认为,如果两个输入的哈希相同,我们认为两个输入是相同的。如果输入的内容就是文件内容,而两个文件的哈希相同,说明文件没有被修改过。
常用哈希算法
比特币使用两种哈希算法,
一种是对数据进行两次SHA-256计算,这种算法在比特币协议中通常被称为hash256或者dhash。
另一种算法是先计算SHA-256,再计算RipeMD160,这种算法在比特币协议中通常被称为hash160。
区块链不可篡改特性
在区块的头部,有一个Merkle Hash字段,它记录了本区块所有交易的Merkle Hash
区块本身用Block Hash——也就是区块哈希来标识。但是,一个区块自己的区块哈希并没有记录在区块头部,而是通过计算区块头部的哈希得到的
如果一个恶意的攻击者修改了一个区块中的某个交易,那么Merkle Hash验证就不会通过。所以,他只能重新计算Merkle Hash,然后把区块头的Merkle Hash也修改了。这时,我们就会发现,这个区块本身的Block Hash就变了,所以,下一个区块指向它的链接就断掉了。由于比特币区块的哈希必须满足一个难度值,因此,攻击者必须先重新计算这个区块的Block Hash,然后,再把后续所有区块全部重新计算并且伪造出来,才能够修改整个区块链。
在后面的挖矿中,我们会看到,修改一个区块的成本就已经非常非常高了,要修改后续所有区块,这个攻击者必须掌握全网51%以上的算力才行,所以,修改区块链的难度是非常非常大的,并且,由于正常的区块链在不断增长,同样一个区块,修改它的难度会随着时间的推移而不断增加。
小结
区块链依靠安全的哈希算法保证所有区块数据不可更改;
交易数据依靠Merkle Hash确保无法修改,整个区块依靠Block Hash确保区块无法修改;
工作量证明机制(挖矿)保证修改区块链的难度非常巨大从而无法实现。
P2P交易原理
比特币的交易是一种无需信任中介参与的P2P(Peer-to-peer)交易。
传统的电子交易,交易双方必须通过银行这样的信任机构作为中介,这样可以保证交易的安全性,因为银行记录了交易双方的账户资金,能保证在一笔交易中,要么保证成功,要么交易无效,不存在一方到账而另一方没有付款的情况。
数字签名
在比特币交易中,付款方就是通过数字签名来证明自己拥有某一笔比特币,并且,要把这笔比特币转移给指定的收款方。
使用数字签名时,每个人都可以自己生成一个秘钥对,这个秘钥对包含一个私钥和一个公钥:私钥被称为Secret Key或者Private Key,私钥必须严格保密,不能泄漏给其他人;公钥被称为Public Key,可以公开给任何人。
当私钥持有人,例如,小明希望对某个消息签名的时候,他可以用自己的私钥对消息进行签名,然后,把消息、签名和自己的公钥发送出去。
数字签名的三个作用:防伪造,防篡改,防抵赖。
首先,签名不可伪造,因为私钥只有签名人自己知道,所以其他人无法伪造签名。
其次,消息不可篡改,如果原始消息被人篡改了,那么对签名进行验证将失败。
最后,签名不可抵赖。如果对签名进行验证通过了,那么,该消息肯定是由签名人自己发出的,他不能抵赖自己曾经发过这一条消息。
数字签名算法
比特币采用的签名算法是椭圆曲线签名算法:ECDSA,使用的椭圆曲线是一个已经定义好的标准曲线secp256k1:y^2 = x^3+7
由于比特币账本是全网公开的,所以,任何人都可以根据公钥查询余额,但是,不知道持卡人是谁。这就是比特币的匿名特性。如果丢失了私钥,就永远无法花费对应公钥的比特币!
比特币钱包
比特币钱包实际上就是帮助用户管理私钥的软件。
小结
比特币使用数字签名保证零信任的可靠P2P交易:
- 私钥是花费比特币的唯一手段;
- 钱包软件是用来帮助用户管理私钥;
- 所有交易被记录在区块链中,可以通过公钥查询所有交易信息。
私钥
比特币的私钥本质上就是一个256位整数,对私钥进行WIF格式编码可以得到一个带校验的字符串。
使用非压缩格式的WIF是以5
开头的字符串。
使用压缩格式的WIF是以K
或L
开头的字符串。
公钥和地址
比特币的公钥是根据私钥由ECDSA算法推算出来的,公钥有压缩和非压缩两种表示方法,可互相转换。
比特币的地址是公钥哈希的编码,并不是公钥本身,通过公钥可推导出地址。
通过地址不可推导出公钥,通过公钥不可推导出私钥。
签名
通过私钥可以对消息进行签名,签名可以保证消息防伪造,防篡改,防抵赖。
挖矿原理
在比特币的P2P网络中,有一类节点,它们时刻不停地进行计算,试图把新的交易打包成新的区块并附加到区块链上,这类节点就是矿工。因为每打包一个新的区块,打包该区块的矿工就可以获得一笔比特币作为奖励。所以,打包新区块就被称为挖矿。
比特币的挖矿原理就是一种工作量证明Proof of Work(POW)机制。
一个有效的工作量证明在于:计算过程非常复杂,需要消耗一定的时间,但是,验证过程相对简单,几乎可以瞬间完成。
比特币挖矿的工作量证明原理就是,不断尝试计算区块的哈希,直到计算出一个特定的哈希值,它比难度值要小。
所以比特币的工作量证明被通俗地称之为挖矿。在同一时间,所有矿工都在努力计算下一个区块的哈希。而挖矿难度取决于全网总算力的百分比。
比特币总量被限制为约2100万个比特币,初始挖矿奖励为每个区块50个比特币,以后每4年减半。
小结
比特币挖矿是一种带经济激励的工作量证明机制;
工作量证明保证了修改区块链需要极高的成本,从而使得区块链的不可篡改特性得到保护;
比特币的网络安全实际上就是依靠强大的算力保障的。
可编程支付原理
UTXO模型
Segwit地址
HD钱包
以太坊
账户
区块结构
交易
智能合约
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!