比特币系统是一种完全通过点对点技术实现的电子现金系统,即它使得在线支付能直接从一方发起并直接支付给另外一方,中间不需要任何的金融机构。数字签名(digital signatures)解决了所有权的问题,但是并不能解决双重支付问题,于是中本聪提出了一种解决方案,通随机散列(hashing)对全部的交易加上时间戳,把他们合并入一个只增不减的基于随机散列的工作量证明(proof of work)的链条中,作为全网的交易记录。只要不是全网51%以上的节点都是不诚实的攻击节点,那么诚实节点生成的链条最长,是全网所有交易的证明也被看做是来自cpu计算能力最大的池。节点可以随时离开和重新加入比特币网络。
1.比特币的提出背景
互联网上的交易,几乎都需要可信赖的第三方来处理电子支付信息,这是基于“信任模式”的电子交易系统。由于金融中介的存在,使在线交易有着人们无法完全实现不可逆的交易,还会增加交易的成本,限制了最小交易规模,索取不必要的个人信息之类的弊端。
所以中本聪提出了比特币系统,它基于密码学原理而不基于信用,任何达成一致的双方都可以直接支付。但是比特币系统,代替的是中心化的中介的信用,并不能保证交易双方的信用。
2.比特币系统上的交易
说白了,一枚比特币就是数字签名。交易就是一串加密过的数据。
比如有一个交易是A要给B 两个BTC。则这个交易数据里包括是上一次交易的哈希值(A是怎么得到这些比特币的)和B的公钥(这次交易要付给谁,就需要谁的公钥。公钥就是地址。一个公钥代表一个人,不需要现实生活中的任何个人信息,从一定程度上讲比特币保证了交易人的安全。通过非对称加密技术生成)的随机散列。并在这个随机散列后附加上交易发起者的数字签名。
非对称加密算法:
(sk,pk) := generateKeys(keysize) generatekeys方法根据keysize来产生一对公钥和私钥。私钥被安全保存,用来签名一段消息;公钥是人人都能找到的,用来验证你的签名。
还是用上面A要给B 两个BTC这个例子。
这个交易就是一个数据结构:
A的数字签名:证明这条记录是由A创建的
一个付给B的公钥(地址)的指令:写了一些交易的具体信息,并用B的公钥进行了交易,只有用B的私钥才能解开这个,即B拥有了这条记录。
一个哈希指针(指向先前的一笔交易的输出): 表示A之前收到并现在要消费这个比特币
数字签名技术解决了交易所有权的问题,但是它是不完善的。该过程的问题在于收款人B没办法知道A是不是对这枚电子货币进行了双重支付。通常的解决办法就是引入第三方权威机构,对每一笔交易进行检验,防止双重支付。在每笔交易结束后,这枚电子货币都要被造币厂回收,而造币厂将发行一枚新的货币,只有造币厂直接发行的货币才有效,这样能防止双重支付。在比特币系统中,没有中心化机构,我们只需要确保之前的所有者A没有对更早发生的交易实施签名。也就是说A给B的两个比特币,他并没有付给别人。所以,我们只需要关注在A与B的交易之前的交易。为了确保某一次交易是不存在的,那么唯一的方法就是查询到之前发生过的所有的交易。所以,在没有第三方中介机构的比特币系统里,交易信息应该被全部公开,而且每一个交易都有唯一的交易序列。收款人要确保全网大多数的节点都认为这个交易是首次出现的。(也就是说超过51%的节点认为A之前没有用掉这笔钱,这个交易完全合法)。
3.时间戳服务器
时间戳服务器通过对以区块形式存在的一组数据实施随机散列而加上时间戳,并将该随机散列进行广播。
时间戳:能够证实特定数据在某个特定的时间是确实存在的。
如何获得去中心化的时间:来自于连接的其他节点时间的中位数,要求连接的节点数至少为5个,中位数和本地系统时间差别不超过70分钟,否则会提醒你更新本机的时间。同时,在接收到新的区块时会拒绝与自己相差+2小时和-(前11个区块时间中位数)的区块。
多笔交易打包成一个区块,并把这个区块加盖上时间戳并做hash。
这个图说明了时间和区块挂钩,区块和hash挂钩,因为区块链的性质,之前挂钩的时间戳是不可被篡改的。
Hash:标识着时间,和当时时间联系在一起。
这些区块形成链条,区块的增长是cpu算力的证明。因为链上一个新的区块需要消耗cpu,那么之前的hash就一定是正确的。(可信度不断被增强)
4.工作量证明
我们还需要一个类似亚当伯克的哈希现金的工作量证明机制,来实现构建一组分散化的时间戳服务器。比特币系统是用哈希函数解谜来证明工作量的。
比特币系统中的任何一个节点,想生成一个新的区块并写入区块链,必须解出比特币网络出的工作量证明的谜题。
解谜题的三要素:工作量证明函数,区块及难度值
工作量证明:这道题的计算方法
区块:决定了这道题的输入数据
难度值:决定了解这道题所需要的计算量
比特币系统中的工作量证明函数是SHA256
区块由区块头及该区块所包含的交易列表组成
区块头的大小是80字节:包含4字节的版本号,32字节的上一区块的散列值,32字节的merkle root hash ,4字节的时间戳,4字节的当前难度值,4字节的随机数。
区块包含的交易列表附加在区块头后面,其中一笔交易是coinbase交易,为了让矿工获得奖励及手续费的特殊交易。
Merkle tree是一颗哈希值构成的二叉树,每个指针不仅告诉我们去哪里指到一个信息,而且还告诉我这个信息的哈希值。
5. 网络
新的交易向全网进行广播
每个节点对接收到的新交易进行核验:
①针对每个前序交易的输出运行核验脚本
②检查是否有双重支付的问题
③检查这笔交易是否被本节点接受
④只接受白名单上的脚本
节点始终都在最长的链条视为正确的链条。如果同时有两个节点同时广播不同版本的新区块,因为其他节点收到该区块的时间上存在先后差别。那么在率先收到的区块继续工作,但也会保留另外一条链,防止后者变成最长的链。
6. 激励
每个区块的第一笔交易是产生由该区块创造者拥有的新的电子货币。
另一个激励来自于交易费,每笔交易的输出值小于输入值,那么差额就是交易费。
7. 回收硬盘空间
已经被纳入足够多的区块中的交易,丢弃掉该交易之前的数据,以回收硬盘。
交易信息被随机散列时,被构成merkle tree的形态,只有根被纳入了区块的随机散列值。通过剪纸的方法,压缩老区块。
8. 简化的支付确认
一个用户需要保留最长的工作量证明链条的区块头的拷贝,它可以不断先向网络发起询问,知道它取芯自己拥有最长的链条,并通过merkle的分支通向它被加上时间戳并纳入区块的那次交易。
9. 价值的组合与分割
每次交易都有多个输入和两个输出
一般而言是某次价值较大的前次交易构成的单一输入,或者由某个几个价值较小的前次交易共同构成的并行输入,但是输出最多只有两个:一个用于支付,一个用于找零。
10. 隐私
公钥可以保持匿名,但由于并行输入的存在 ,一定程度的追溯不可避免。
11. 计算
攻击成功的概率随区块数的增长而呈指数化下降 ,比特币是至少在6个区块后交易成功(大概一小时),以太坊是至少15个区块(大概三分钟)