目录
1.人类交易发展史
2.比特币(bitcoin)
2.1 比特币诞生背景
2.2 神秘组织CypherPunk
2.3 中本聪Satoshi Nakamoto
2.4 比特币(bitcoin)
3.区块链(blockchain)
3.1 区块链和比特币
3.2 中心化与去中心化
3.3 区块链(blockchain)
4.比特币专业名词
4.1 记账
4.2 钱包
4.3 节点
4.4 采矿(mining)
4.4.1 采矿本质
4.4.2 难度值
4.4.3 矿
4.4.4 采矿过程
4.5 算力
4.6 比特币参数
4.6.1 出块时间
4.6.2 出块奖励
4.7 p2p网络
4.8 工作量证明POW
4.9 比特币地址(bitcoin address)
4.10 比特币结构
4.10.1 区块结构
4.10.2 区块头结构
1.人类交易发展史
以物换物->实物货币->传统货币->人工货币,其中人工货币可以细分为
货币发展总是从大到小,使用越来越便捷,而且下级货币总是因为解决了上级货币的一些缺陷而产生的。
2.比特币(bitcoin)
在比特币之前已经存在数个电子支付系统,例如:
在07-09年的环球金融危机爆发的时候,货币系统出现严重问题是导致数字货币诞生的直接原因。从另一方面来说,密码学与计算机设备技术的成熟也是催生数字货币出现的另一直接原因。前文中我们提到下级货币的提出总是因为解决了上级货币的某些缺陷,数字货币的提出显然就是解决了纸质货币的【生产发行成本太低,受国家影响太大】的缺陷。
cypherpunk,中文直译为密码朋克,是一个提倡信仰使用强加密算法将能够使个体保持安全的私人性的组织。组织中的人大多为电脑黑客、密码学专家和追求隐私的狂热者,例如Assange阿桑奇(维基解密创办人)等人就是其中的一份子。他们反对任何政府规则的密码系统,或许他们崇尚的是个人信息的绝对私密性。
中本聪,自称日裔美国人(注意是自称,因为其真实身份仍不为外界所知)。曾于2008年在“metzdowd.com”网站的密码学邮件列表发表了一篇名为《比特币:一种点对点式的电子现金系统》(Bitcoin: A Peer-to-Peer Electronic Cash System)的论文,描述了一种被他称为“比特币”的电子货币及其算法。其中详细描述了如何创建一套去中心化的电子交易体系,且这种体系不需要创建在交易双方相互信任的基础之上。在2009年1月3日,他开发出首个实现了比特币算法的客户端程序并进行了首次“采矿”(mining),获得了第一批的50个比特币,这也标志着比特币金融体系的正式诞生。而在2010年的12月12日,他在比特币论坛中发表了最后一篇文章,提及了最新版本软件中的一些小问题,随后不再露面,电子邮件通讯也逐渐终止。
必须清楚的一点就是比特币并不是什么我们通常意义上的固有货币,例如人民币或者美元等。比特币本质是一个软件,是一个电子支付系统。在这个电子支付系统中流通的用于相互交易的数据,才是我们通常认为的比特币。所以比特币软件和比特币两者并不是同一个概念,但由于人们认知和理解上的误区而导致经常会将其混淆。既然比特币本质只是一组数据,那么对于数据就有了很大的可能。
(1)首先数据作为货币就解决了货币发行的问题。数据是基于计算机算法产生的,而不是由某个人或某个国家机构产生,所以规避了纸币的随意超发就有效的避免了通货膨胀
(2)其次数据作为货币还解决了货币归属安全问题。数据在计算机算法中是可以允许进行加密的,而不是客观物理世界中的持有。只有确切知道加密算法和加密密钥(可以简单认为就是密码)的人才能够确定数据的归属,这也规避了纸币的非主观变更货币归属权问题(简单说就是抢劫)
3.区块链(blockchain)
区块链和比特币并不是同一个东西。在上一节中我们分析过了比特币虽然被称为xx币,但本质其实就是一个电子支付系统,而区块链最初只是这个电子支付系统中的一个重要底层技术,它的本质是一个去中心化的数据库。可以理解为因为有了区块链技术才导致比特币软件的产生,而比特币软件的产生才是区块链技术真正被人们知道的重要原因。
由于理论问题过于繁杂,而且专业名词一个接着一个也不利于说明,所以选择使用最直白的语言来说明。如果用宿舍取食堂打饭例子来说明,那么:
其实上面的例子就非常直观的解释了什么叫中心化和去中心化。中心就是权威,顾名思义必然存在一个说了算的人或机构,而少数权威机构就必然会产生寡头与垄断。例如上面的例子中张三和具有权威的人的关系最好,那么很有可能每一次都会获得最多的饭菜和很少去食堂打饭的辛苦,这就是权威对于行为产生垄断带来的负面影响。
而去中心化的本质就是为了解决寡头和垄断问题,如果每一个人都有可能亲自去打饭也有可能来分发打回来的饭菜。那么为了避免别人分发饭菜的时候对自己少分发,那么必然在自己打饭或者分发饭菜的时候对每一个人都做到平均平等。这就解决了寡头和垄断带来的少数人获利这种负面影响。(当然这只是一个例子,真实情况还是要具体情况具体分析的。)
前文中已经说明,区块链本质只是一个去中心化的数据库,是一种数据的存储方式而已。至于如何使用区块链并不是说只有比特币这一种实现使用方式,因此将区块链和比特币之间画一个等号的行为是很无趣的。就像前人说的一样:能力并无善恶之分,善恶之分拥有能力的人。如何使用区块链也将是我们未来需要考虑的一大问题。
4.比特币专业名词
既然区块链技术是最初从比特币发展而为人们所知,因此通过学习比特币原理可以更好更清楚的对区块链技术有深刻的理解。那么需要先了解一些比特币技术行业内的一些专业名词。
将系统中产生的交易数据存储到数据库中的过程称为记账。比特币记账方式与传统的记账方式有很大的不同:
传统记账方式 | 比特币记账方式 |
由某个人(会计)进行记账 | 所有参与交易的人共同记账 |
只有会计自己知道每一笔交易的细节 | 所有人都知道每一笔交易的细节 |
有一笔交易记录一次 | 间隔一定时间记录一次 |
显然传统记账方式中记账人(会计)就可以认为是我们前文中提到的信息垄断者,因为记账人唯一持有对每一笔交易的信息,因此如果记账人对交易信息进行删改那么其他人无从知晓。而比特币记账则将每一个参与交易的人都当做了记账人,单一记账人对某一笔交易作出的修改无法影响其余所有人的记录,因此保证了交易信息的公平。
同时传统记账方式有一笔交易记录一次,如果某一笔交易没有记录也不会有人知晓。因为交易与交易之间是不存在任何关联的。但是比特币的记账方式则杜绝了这种问题,因为记账是按照时间来进行。在一定时间内例如10分钟,不管有没有发生交易所有人都会进行一次记录,那么在这10分钟之内的所有可能发生的交易就被所有参与交易的人记录在了自己的账本上。那么如果有人想要故意少记录一笔交易,所有参与交易的人在下一次完成交易的时候就会发现这个人账本上少了一笔交易,那么这个人的这次交易就不会生效。大白话说就是不带这个人玩了。
一个私钥,能够产生一个公钥,一个公钥能够计算出一个hash账户地址。
可以暂时认为私钥就是比特币本身,那么存放管理私钥内容的wallet.dat文件就称为钱包,这个文件内存放了各种私钥相关的信息。但是由于wallet.dat文件无法单独操作,因此一般将管理这个wallet.dat文件的比特币客户端称为钱包。
ps:多说一句,某人使用比特币客户端进行每一次交易的时候,“银行卡账户地址”都是不同的。但这并不意味着这个人就会拥有无限多个比特币账户,这时计算机加密算法提供的一种数据保护。能够防止账户被有心人追踪交易记录从而对账户信息进行窃取。
每一个运行比特币客户端的节点称为节点。对节点而言
对于客户端而言
所有交易的信息集合都会使用levelDB数据库存储,比特币网络中每一个节点都会同步相同的一个账本。节点之间竞争向账本中记账权利的过程就叫做采矿。竞争成功者获得记账的权利,并向账本中进行一次记账操作,即为采到矿。
基于现在的区块数据添加一个随机数,并对这个数据做sha256加密运算,寻找其运算结果小于难度值的数字。
难度值由系统统计前2016个区块产生区块的平均时间调节,可能变高可能变低。难度值不可能由某一个人来设定。
矿实际上就是计算出的数字。
假设:
(1)比特网络中有5个矿工,分别为A、B、C、D、E
(2)难度值是:0x0000123456780012
(3)比特网络前2016个区块的数据内容是:
过程:
(1)所有人同时开始计算:sha256(12345678abcd1234abcd5678+一个整数数字)的hash值结果
目的是找到使得【hash值结果 < 难度值】表达式成立的这个整数数字
(2)假设矿工C在某一时刻计算出了整数数字当是100的时候能够使得表达式成立,那么矿工C会立即将这个整数数字公布到比特网络中
(3)同一时刻其余所有矿工立即停止计算,并开始验证这个数字是否真的能让表达式成立
(4)所有矿工验证通过后,证明矿工C这次计算是有效的,那么就允许矿工C将这个计算结果添加到本地的区块链中
(5)同时所有矿工也将这个计算结果添加到自己本地的账本中
(6)比特网络更新难度值,所有矿工重新开始计算,下一轮采矿周期开始
通过上面的采矿过程概述能够发现,谁计算的速度越快谁就更有可能采到矿。那么很多人会有疑问这个计算是不是很容易?事实上对于一次sha256的计算很容易,但是我们都知道sha256是一种不可逆的单向加密机制,其雪崩效应决定了任何一个微小的变更都会导致最后的计算hash结果变得完全不同,因此想要通过某几次计算得到目标数字几乎是一个不可能的行为,因此必须从1开始逐步累加计算比对(相信我这是一个无聊枯燥的过程),直到突然发现某个数字符合要求为止。那么运算速度就决定了谁能更快速的发现这个数字,而算力就是度量hash运算速度的一个标准。在比特币中算力指的是每秒钟进行的hash运算次数。
目前比特币网络的全网算力已经进入到了P时代,所以可想而知我们之前奢望的几次hash运算就能得到结果是多么一种玩笑的想法。目前市面上普通的家用电脑的CPU运算素的也不过就是10^12次浮点数运算/s,这个运算速度换算成hash值计算还要打很多个折扣,所以计算hash值来查找目标数字是一个很苦难的事情。
ps:补充一句,由于家用电脑的运算速度不够快才出现了GPU、FPGA还有ASIC之类的东西。ASIC就是俗称的矿机(蚂蚁矿机),是一种专门用来执行hash256计算的工具,然鹅单一的矿机其实并没什么用(依然算不过其他人)。
pss:一个ASIC就是矿机,多个矿机放在一起就是矿场,多个矿场放在一起就是矿池。
出块时间指的是,一个区块(矿工C算出一个数字,写到账本上的内容)产生的时间是10分钟左右(全网所有人10分钟左右才能算出一个数字,可以自己算算要进行多少次计算,很恐怖的)。比特网络会根据前2016个区块的出块时间动态调整难度值,大约是2周左右。出块时间包括同步时间,校验时间,计算时间等。
出块奖励才是比特币网络中最根本的内容和比特币最真实的来源,也是为什么这么多人想要进行采矿的原因。比特网络是一个特殊的网络,最初是不存在比特币的。每当有一个人采到一个矿,那么这个人会进行一次记账,比特网络就会奖励这个人一些比特币。而这就是比特币的来源。
比特网络规定每产生21万个区块奖励就会减半,最初每采到一个矿比特网络会奖励这个人50个比特币。由于比特网络固定10分钟会出现一个区块,因此简单计算210000*10/60/24/365可以得出大约4年左右会进行一次奖励衰减。截止到目前为止一次采矿比特网络所奖励的比特币数量已经经历了两次衰减,即12.5个。
所以经由简单的数学逻辑可以知道,最终采矿比特网络一定会出现不再奖励任何比特币的现象产生。那就意味着比特币发行完毕,不会再进行发放了。而这个计算过程相信你有等差数列数学基础就都能够很快算出,只有2100万个。这就对应了2.4小节中说的比特币能够有效遏制通货膨胀的原因,因为货币的发行是计算机算法决定的,而不是“某个具有权威”的人或政府机构决定。
p2p,peer to peer,即点对点技术。是指无中心服务器,依靠用户群交换技术的互联网技术。其特点是:耐攻击、高容器、地位平等
pow,proof of work,即工作量证明。是指出示结果表示你做过的一件事情。如何获取结果的过程通常很艰辛,但验证却很简单。比如赫拉克勒斯的十二试炼一样过程简直要人命,但是赫拉检验他的结果却是一句话的事情。比特币采矿的哈希sha256运算过程就非常漫长而又痛苦,但是全网在检验某个矿工的计算结果的时候却只需要进行一次计算。
实际上就是4.2中提到的hash账户地址,这个地址的计算非常复杂,具体流程可以大致参考如下:
(1)本地随机数列获取私钥,然后由私钥生成公钥
(2)使用公钥进行一次sha256运算,然后再使用RIPMD160算法对刚才的结果进行加密得到一个160bit,即20byte字节的数据.
ps:[RIPMD160算法并不是go内置的hash函数,需要下载]
(3)然后将当前网络版本1byte字节的数据作为数据头添加到20byte数据前面,得到21byte字节数据
(4)然后copy这21byte字节数据,然后对他做两次sha256加密运算后,取前4byte字节数据
(5)将刚才的21byte字节数据+这个4byte子节的数据,获得25byte字节的数据
(6)然后进行base58编码,得到bitcoin地址
字节长度 | 字段 | 说明 |
4 | 区块大小 | 用字节表示的该字段之后的区块大小 |
80 | 区块头 | 组成区块头的几个字段 |
1-9 | 交易计数器 | 该区块包含的交易数量,包含coinbase交易 |
不定 | 交易列表 | 记录在区块里的交易信息 |
字节长度 | 字段 | 说明 |
4 | 区块版本号 | 区块版本号 |
32 | 父区块头哈希值 | 前一个区块头的哈希值 |
32 | Merkle根哈希 | 交易列表生成的默克尔树根哈希 |
4 | 时间戳 | 该区块产生的近似时间,精确到秒的UNIX时间戳 |
4 | 难度目标 | 难度目标,挖矿难度值 |
4 | Nonce | 挖矿过程中使用的随机值 |
ps:数字签名在交易中的应用验证可以通过在bitcoin软件的console中输入【gettransaction 交易hash】指令,从而获取交易具体信息。然后再通过输入【decoderawtransaction 获得的交易信息中的交易hex】指令就能够看到每一次的交易当中都必须存在【scriptSig字段】,这个字段就是签名字段,其中包括【asm】字段和【hex】字段。