信息数据采集与隐私泄露已经成为互联网上屡见不鲜的话题,早已不是当初Berners-Lee期望的那个“自由、平等、开放”的互联网世界。
密码学之于整个社会的意义,犹如欧洲中世纪的活字印刷术发明改进的意义。印刷术的兴起改变了中世纪教会的社会权力结构,密码学会从根本上改变企业的本质和随意干涉经济交易的本质。
Hal finney于1956年5月4 日出生于加利福尼亚的Coalinga,他于1979 年加入加州理工学院,获得工程学学士学位,从加州理工学院毕业后,finney开始从事计算机游戏事业。
1990年代初期,Finney与创始人Phil Zimmermann基于RSA共同开发了PGP(Tor的前身)邮件加密系统,它能确保邮件内容不被纂改,并创造性的把RSA公钥体系结合起来,并在数字签名和密钥认证管理机制上有巧妙的设计。
RSA公钥体系的特点使它非常适合用来满足隐私性和认证性,其算法简单的说就是找两个很大的质数,一个公开给世界(公钥),一个不告诉给任何人(私钥)。两个密钥是互补的,公钥的加密的密文可以用钥匙解密,反过来也一样。举例来说:
A给B发送一个文件,他们互相知道对方的公钥,A用B的公钥地址发送。
B收到A发送的文件,B可以用自己的私钥打开A发送过来文件。
没有人知道B的私钥,即使发送者A也无法打开,因此解决了保密的问题。
但是,由于每个人都知道B的公钥,任何人都可以给B发送任何文件,那么B就无法确认是不是A发送过来的,认证问题的出现,就有了数字签名:
A在给B发送的文件上用B的公钥加密,获得摘要后,使用A自己的私钥加密进行数字签名。
然后,A向B发送文件….
B会接受到A的密钥文件和A的数字签名,B通过B的私钥进行文件解密,通过A的公钥进行解密获得摘要,最后验证A签名摘要的一致性。
RSA是一种非对称加密算法,早在1977年由Ron Rivest、AdiShamirh和Len Adleman这三个科学家,在MIT(美国麻省理工学院)发明出来的RSA公钥加密算法。RSA取自他们三人的名字,实际上1973年,英国数学家Cliford Cocks就已经提出了一个类似的原理,但被作为最高机密封存了,直到1998年才发表。
1991年,Stuart haber和 Scottstornetta 发表论文: How to TimeStamp a Digital Document,这里面提出用时间戳确保数字文件安全的协议,主要处理时间戳的文档化——他们的目的是建立一个“数字公证”的服务,这也是今天比特币区块链链条的雏形。
Wei Dai 的B-money无疑开了一个好头,任职期间,Finney加入的Cypherpunk的邮件社区,这种思想激荡出的火花无疑会形成了某种牵引。通过与Wei Dai 和 Nick Szabo的广泛交流,逐渐意识到已经存在让比特币成为现实的想法。
到 1999 年,点对点技术(P2P)成熟并大范围流行( BT下载),从它的定义来看——“网络的参与者共享他们所拥有的一部分硬件资源(处理能力、存储能力、网络连接能力、打印机等),这些共享资源通过网络提供服务和内容,能被其它对等节点(Peer)直接访问而无需经过中间实体”。
2005年,Finney设计出了RPOW - 复用工作量证明,这是一种对分布式现金达成共识的机制,Adam Back的Hashcash的问题之一就是它们无法重复使用,RPOW在Hashcash基础上进行了扩展,提供了一种有限按照顺序重复使用的方式,使POW创造出来的金钱可以在每个人直接移动并保持等同的价值。
工作量证明主要特征就是发送方需要做一定难度工作得出一个结果,接收方却很容易通过结果来验证发送方是不是做了相应的工作,这种方案的设计有个核心的特征就是非对称性,我们举例说明:
给定一个基本的字符串“新宝,你好”。
给定的工作量要求:可以在字符串后面添加一个叫“Nonce”的整数值,对变更后的(添加Nonce)的字符串进行SHA256哈希运算,如果得到哈希结果是以”0000” 开头的(16进制),则完成该工作。
为了完成这个目标,我们需要做的就是不停的递增”Nonce”值,并对其SHA256哈希运算。
按照上述工作要求,我们需要经过4500次以上的计算才能找到恰好前4位为“0000”哈希散列。以上是一个工作量证明的简单过程,我们将上面的变更为:
SHA256(“新宝,你好“+整数值)
整数值取1到1000,也就是,将输入变成一个由1000个值组成的数组:“新宝,你好!1、新宝,你好!2、新宝,你好...1000“。
然后对数组中的每个输入依次进行上述例子进行工作量证明,找出前“0000”的哈希散列。
预期获得结果需要2^16次尝试,才能得到“0000”的哈希散列,进行1000次的实际计算结果,平均每个哈希散列需要计算66958次,这就是我们要求的工作量。
而比特币网络中的任何一个节点,如果想生成一个新的区块并写入区块链,必须解出比特币网络中工作量证明的数学题,有三个要素:
工作量证明函数
区块
难度值
工作量证明函数:
比特币工作量证明函数使用的是SHA256,SHA是安全散列算法的缩写,由美国国家安全局(NSA)设计,美国国家标准与技术研究院(NIST)发布的,主要适用于数字签名标准,SHA256就是这个函数家族中的一个,是输出值为 256位的哈希算法,到目前为止,还没有出现对SHA256算法的有效攻击。
区块:
比特币的区块由区块头及该区块所包含的交易列表组成,区块链头的大小为80字节,由以下部分组成:
4字节的版本号(Version)
32字节的上一个区块的散列值(Hash)
32字节的Merkle Root Hash(Merkle root)
4字节的时间戳(Timestamp)
4字节的当前难度(Bits)
4字节的随机数组(Nonce)
拥有80个字节固定长度的区块头,就是用于比特币工作量证明的输入字符串。因此,为了使区块头能体现区块包含的所有交易,在区块的构造过程中,需要将该区块要包含的交易列表,通过Merkle Tree算法生成Merkle Root Hash,并以此作为交易列表的摘要存在区块头中。
区块包含的交易列表附加在区块头后面,其中的第一笔交易是Coinbase交易,这是一笔为了让矿工获得奖励及手续费的特殊交易。
难度值:
难度值是矿工在挖矿的重要参考指标,它决定了矿工大约需要经过多少次哈希运算才能产生一个合法的区块。比特币每10分钟产生一个区块,如果要在不同的全网算力条件下,新区块的产生保持都基本这个速率,难度值必须根据全网算力的变化进行调整。简单说,难度值被设定在无论挖矿能力如何,新区块的速率都保持在10分钟一个。
难度值是在每个完整的节点中独立自动发送的,每2016个区块,所有节点都会按统一的公式自动调整难度,这个公式是由最新2016个区块所花费的时长与期望时长(期望时长为20160分钟,按每10分钟一个区块的产生速率计算出总时长,两周时间)比较得出的,根据实际时长与期望时长的比值,进行相应调整(变难或变容易)。也就是说,如果区块链产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。总结这个公式如下:
新难度值 = 旧难度值 *(过去2016个区块话费时长/20160分钟)
工作量证明需要一个目标值,比特币工作量证明的目标值计算公式如下:
目标值 = 最大目标值 / 难度值
其中,最大目标值为一个恒定值:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目标值的大小与难度值成反比,比特币工作量证明达成的区块哈希散列必须小于目标值。上述例子要求为“0000”的值越多,代表难度越大。
我们简单梳理上述工作量证明的过程:
1.生产Coinbase交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle Tree算法生成Merkle Root Hash
2.把Merkle Root Hash及其他相关字段组装成区块头,将区块头的80字节数据(Block Header)作为工作量输入
3.不停的变更区块头的随机数,即Nonce值,并对每次变更后的区块头做双重SHA256运算(SHA256(SHA256(Block Header)),将结果值与当前网络的目标值做对比,如果小于目标值则完成该工作量。
至此,比特币的技术全部搭建完毕,静静等待着那个名叫中本聪的人将它完善,而Hal finney将成为中本聪发送第一笔比特币交易的接收者被永久的载入比特币历史。
网友评论