1.1 什么是比特币
a.区块链的实现
b.数字货币(拥有存在数字钱包里的密钥是使用比特币的唯一条件)
1.2 挖矿
不同于央行统一发行的人民币,比特币是通过“挖矿”产生的。挖矿其实就是比赛解决一个数学问题,算得快的人得到新币作为奖励。在这个过程中,每个矿工都用他的算力在验证和记录交易。相当于将央行货币发行和结算的任务分配给了每一个参加挖矿比赛的人,这就是“分布式”计算。
1.3通货紧缩货币
通货膨胀的产生原因之一是政府超量地发行货币,这让我们每个人手里的钱都会越来越不值钱。而比特币的协议规定的是,新币的开采速度每四年就会减半,总的来说比特币总量不会超过2100万枚,并将在2140年左右。比特币总量的变化曲线如下图。
所以,从长期来看,比特币是通货紧缩货币。持有比特币是规避通货膨胀的手段之一。
我们看到越往后能挖出去的比特币会越少,自然挖矿成本就越高
1.4 去中心化
传统货币系统的操作是“中心化”的,买卖东西总是要通过银行或大公司来拿钱或者收钱,否则就没有办法建立信任。例如,我们在淘宝上买东西,需要先把钱付给阿里巴巴,等确认收货了,阿里巴巴再把钱转给商家。
比特币的创新之处就在于,完全“去中心化”,不依赖阿里巴巴这样的中央权威。我可以直接把钱打给你,但也不怕你抵赖,因为在交易发生的时候全网无数的账本都会共同记录下这笔交易。而这个同步的记录过程是分布式、去中心化的。
1.5 比特币的四个创新点
1. 一个去中心化的点对点网络:我可以直接向你发钱,不用通过银行、阿里巴巴等大公司
2. 一个公共的交易账本:所有的交易都被记录在了全网共同维护的大账本中,也就是大名鼎鼎的“区块链”技术。
3. 一个去中心化的数学的和确定性的货币发行:世界各地的矿工们都在比赛解数学题找币,币出现的速度会越来越慢,总量是确定的。
4. 一个去中心化的交易验证系统:不需要权威机构就能互相“验明正身”。纸币可能会出现“造假”的情况,一张钱出现在不同的两个地方。但比特币通过数学验证机制保证了不会出现这样的“双重支付”。
1.6 比特币的客户端
参与比特币交易基本有两种方式,一种是维护一个“完整客户端”,自己保存所有的比特币整个交易历史,不依赖于其他的服务器和第三方服务。另外一种是普通用户常用的“轻量级客户端”,不保存完整历史,而通过信赖的第三方服务器来获取交易信息。大家通过okcoin、云币网购买BTC就是这种形式。
由于第三方介入是有风险的,即使比特币的交易账本是全网公开透明的,选择了不可靠的在线钱包服务还是可能会丢币。所以大家一定一定要选择有信用的靠谱的第三方交易客户端。
1.7 使用比特币客户端
比特币客户端通常由一个钱包和多个比特币地址组成。比特币地址是可以公开的,任何人都可以通过这些地址转钱到你钱包。
发送比特币只需要输入地址和金额,收到钱的人会用私钥(以下会介绍)签名这笔交易,这就公告了全网:比特币从一个地址转移到了另外一个地址。从交易完成到“确认”大概需要10分钟,因为交易须由矿工开采打包成区块,这样才会被全网接受为“已确认”。
就像微信扫一扫支付一样,比特币也可以通过扫描二维码轻松付款。付款交易就是将比特币从一个地址转移到另一个地址,那么这个转移的过程是怎么实现的呢?
2.1 私钥
比特币的地址相当于带锁的信箱,私钥就好比这个锁唯一的钥匙。比特币地址是公开的,每个人都可以往这个地址发钱,但只有握有“私钥”的人才能打开用这个地址上锁的比特币。因为只要知道私钥就可以取走你的比特币,所以私钥一定要好好保管。
2.2 比特币交易过程
A给B付款0.1BTC的过程是这样的:A将要付B的0.1BTC用B的”专属地址“锁起来,然后向全网发送,相当于向所有人吼了一声:“我向能打开这把锁的人发送了0.1BTC”。
B在网络中会马上收到这条信息,于是拿出私钥试试能不能打开这把锁。因为只有B钱包里的私钥才可以匹配这个地址,所以只有B能兑换这笔钱。
2.3 将交易记录在总账本中
交易信息必须要被传送到比特币网络中,成为总账本的一部分。这个账本叫做区块链。一个“区块”里面记录了一段时间内的所有交易信息,“链”则是因为所有的历史数据块会一个个串联起来。
(1)全网传播
比特币的账本是分布式的,网络中的每个节点都在帮助记账。A给B付款0.1BTC的时候,只需要向身边的节点大吼一声,收到信息的节点又迅速向自己的邻居发送这个消息。一传十十传百,只要几秒钟就能传遍整个网络。现在,所有人都知道“A给B付款0.1BTC”。
(2)挖矿验证
这个交易在比特币网络上传播开来,但只有被矿工们“挖矿”验证并加到一个新区块中里,这个交易才会成为总账本的一部分。
2.4 挖矿
挖矿的过程是将过去一段时间的交易记录打包成一个区块,这个过程也会创造新比特币。
挖矿其实可以想象成很多人一起来找“数独”游戏的解(9x9的数独就是要求每行每列每个对角线都有1-9),矿工们解题的办法就是笨笨地不断去试,没有更快的方法,只能比谁试得更快运气更好。
数独游戏的难度可以通过改变行列大小来调整。想象一下求解一个几千乘几千的数独,确实有难度。但是,如果给你一个已经填好的数独,你就可以很快验证这个解是否有效(检查每行每列有没有重复的数)。
“解起来困难而验证容易”就是比特币解谜游戏的最大特点。当然,真实的比特币谜题其实是基于哈希加密算法,我们以后还会更详细地谈到。
一笔交易需要通过解题构建区块来证明它有效,矿工们都在齐心协力地为这个区块贡献计算量,计算量越多意味着更多的人信任这笔交易是有效的。
2.5 矿池
矿池就是矿工们组队解题,赢了就按工作量分配收获的比特币。在这个时代,单打独斗已经很难做成一件事情了,挖矿也一样。
2.6 区块链
区块链就是一个一个区块链起来。
区块一个接一个产生,当前区块链的产生基于前一个区块,所以每次解当前的区块都会为之前的交易增加一次证明,也就在网络中得到了更多的信任。
随着链的增长,计算复杂度不断增加,以往的区块也就越来越难以删改(一个区块获得6次以上证明就基本不可能撤销了)。所以验证一个交易有效的简单手段就是确定这个交易在区块链中、后面有几个新的区块。
你可以这么理解,写好的区块就像泼出去的水。
此外,我们可以通过区块链顺藤摸瓜追溯每一笔历史交易,这就保证了比特币的来源都是清晰有记录的。
3.1 完整客户端
自己维护一个全节点客户端的成本比较高,但是可以保证你的钱包是安全的。如果你有几千个甚至几万个比特币,可以考虑用这种方式来实现安全存储。
从bitcoin.org下载的客户端包含了比特币系统的所有方面,是一个独立的完整节点。但是正因为包含了所有历史数据,下载整个区块链可能就需要好几天,请确保你有足够的容量的硬盘、带宽和时间。
3.2 编译比特币源码
对于开发者,可以从GitHub上的比特币页面https://github.com/bitcoin/bitcoin下载代码自行编译,从终端运行bitcoind,也需要下载所有区块。
在书里面一步步教授了比特币核心的JSON_RPC API接口的使用,包括以下技能点:
1.获取比特币核心客户端状态信息
2.钱包设置及加密
3.钱包备份、纯文本导出和恢复
4.钱包地址及接收交易
5.查看区块信息
6.基于UTXO(未花费的交易输出)的建立、签名与提交
4.1 密钥
比特币交易需要用有效的“数字密钥”产生的签名认证。
密钥是成对出现的,由一个“私钥”和一个“公钥”所组成。公钥就像银行的帐号,而私钥就像控制账户的PIN码或支票的签名。
公钥用来接收比特币,私钥用来对收到的比特币进行签名。公钥可以由私钥唯一产生,但是知道公钥却不能反向推导出私钥,这就保证了比特币的安全性。 如果你知道一点密码学的知识,这就是非对称加密。
4.2 地址
比特币的地址是通过账户主人的公钥产生的,只需要把比特币地址告诉其他人,别人就可以给你转账。
4.3 私钥、公钥、比特币地址之间的关系:
从私钥可以唯一生成公钥,公钥可以生成比特币地址。但反向都是解不出来。私钥必须始终保持机密,丢了私钥就相当于丢了比特币。
4.4 钱包与助记词
由于完全无规律的密钥对不便于维护和记忆,现在的钱包多是从一个“种子”出发生成许多关键的钥匙。如图所示,子子孙孙地繁衍出新的密钥。
种子可以是随机生成的数字,也可以用助记词来生成。单词的顺序就是钱包的备份,可以用来恢复或重新创造新的钱包的钥匙。助记词可以让人们更容易抄写和储存。
这里要提醒的是,由于知道了助记词就能重新创建种子恢复钱包,助记词一定要妥善保管。不少人使用imtoken的时候给助记词截了图,导致钱包信息泄露。
4.5 椭圆曲线加密(从私钥到公钥)
通过椭圆曲线加密算法,可以从私钥计算得到公钥,这是不可逆转的过程:K = k * G 。其中k是私钥,G是被称为生成点的常数点,而K是所得公钥。
小明就读于小学二年级,会计算加法,但是不会计算除法。
你:“小明小明,过来,叔叔问你,1+1等于几?”明:“等于2。”你:“那考你个难的,7+7等于几?”明:“切,等于14呗。”你:“行,那叔叔再问你,几个7相加等于56?”明:“……”,默默掏出草稿纸、铅笔、手指头、脚趾头,进行了10分钟的深度计算:2个7等于14,3个7等于21,4个7等于28……。“叔叔,我算出来了,是8个,对不对?”你:“好小子,叔叔就不信考不倒你。几个7相加等于864192?” 你心中默念,以小明的计算能力,要算到这个数恐怕得一年半载的。明:“叔叔好厉害呀,我算不出来。”
具体的说,这个加法可以表现为以下两个图。将两个点连线之后求曲线交点关于x轴的对称点。图a是两个不同的点相加,图b是两个相同的点相加。
这个加法有两个很重要的特点
(1)正向计算(从私钥计算公钥)很简单。
(2)逆向计算(从公钥反推私钥)很困难。从公钥反推私钥只能像例子中的小明一样用傻瓜穷举法,以目前的计算能力,攻破椭圆曲线是不现实的。
看个例子理解一下为什么正推容易,反推难:
椭圆曲线加密公式:K=k*G。
正推:已知k,G,求k*G。反推:已知K,G,求k。先看反推,反推只能用最傻瓜的穷举法,比如k=10。G==K?[No]G+G=2G==K?[No]2G+G=3G==K?[No]3G+G=4G==K?[No]4G+G=5G==K?[No]5G+G=6G==K?[No]6G+G=7G==K?[No]7G+G=8G==K?[No]8G+G=9G==K?[No]9G+G=10G==K?[Yes]花了10步找到答案, k=10。再看正推。已经知道k=10。G+G=2G2G+2G=4G4G+4G=8G8G+2G=10G=K四步就找到答案。
哈哈,有点晕了吗?不是很复杂,如果没看懂建议你再看一遍。如果实在看不懂,你记住正推容易,反推几乎不可能就好了。
4.6 哈希函数(从公钥到比特币地址)
比特币地址是由公钥经过单向的哈希函数生成的。
哈希(Hash)是一种数据编码方式,将大尺寸的数据(如一句话,一张图片,一段音乐、一个视频等)浓缩到一个数字中,从而方便地实现数据匹配、查找的功能。
比如这里有一万首歌,给你一首新的歌X,要求你确认X是否在那一万首歌之内。
将一万首歌每一个音符和X比对非常慢。那么,我们可以将每一首的数据浓缩到一个数字指纹上(称为哈希码),得到一万个数字,再将X的数字指纹和这一万个数字比对,就能知道X是否在那一万首歌中。
显然,有可能多首歌的哈希码是同一个。好的哈希算法会尽量减少这种冲突,让不同的歌有不同的哈希码。
就算真有极小概率出现不同的歌有相同的哈希码,那也只有寥寥几首歌,此时再一首首比对即可。
作为例子,如果要你要哈希那一万首歌,一个简单算法就是让歌曲所占硬盘的字节数作为哈希码。这样的话,你可以让一万首歌“按照大小排序”,然后遇到一首新的歌,只要看看新的歌的字节数是否和已有的一万首歌中的某一首的字节数相同,就知道新的歌是否在那一万首歌之内了。
再说一个题外话,我是一名程序员,我几次面试都中算法题都被考到了 Hash 的实现。
所以,如果你也是一名程序员,一定了解了解 Hash
5.1 比特币交易的生命周期
5.2 交易在全网的传播
每个比特币节点都和一些其他节点相连,形成一个巨大的网状结构。每个节点收到交易之后都会进行验证,如果有效就传播到其他节点,如果无效就拒绝并返回。一笔有效的交易在几秒钟能就会传遍全网。
比特币网络有以下特点:
1. 没有中心,所有节点的地位都是同等的
2. 传播灵活高效,能够抵御攻击。
3. 每个节点在传播交易之前都会独立验证,增加可靠性。
5.3 UTXO
这个概念很重要,对你理解很有帮助,要认真理解。
比特币交易的基本单位是UTXO“未花费过的一个交易输出”。在比特币的世界里既没有账户,也没有余额,只有分散到区块链里的UTXO。
要理解UTXO,我们假设一个这样的场景:张三挖到12.5 枚比特币。过了几天,他把其中 2.5 枚支付给李四。又过了几天,他和李四各出资 2.5 比特币凑成 5 比特币付给王五。
我们正常理解,应该是按照上面的图
但在比特币中,这个过程是通过 UTXO 实现的,图示如下:
看图你会发现,上一笔交易的输出是下一笔交易的输入,形成一条交易链。在一笔交易中,被交易消耗的UTXO被称为交易输入,由交易创建的UTXO被称为交易输出。
比特币钱包通过扫描区块链并聚合所有属于该用户的UTXO来计算该用户的余额。当用户付款时,他的钱包通过选择可用的UTXO来构造一笔交易。一旦UTXO被选中,钱包会为它生成包含签名的解锁脚本,相当于把钱柜打开取钱出来支付。
5.4 交易费
大多数交易都需要支付交易费,作为对辛勤工作的比特币矿工们的劳动费。交易费可当做矿工们确认区块的奖励,交易费的多少会影响处理的优先级,有足够费用的交易会更早被包含在下一个挖出的区块中,也就更早得到确认和验证。交易费大多数情况下都是由钱包程序替你自动计算出来的。
5.5 交易验证:UTXO的锁定与解锁
比特币的交易验证引擎依赖于两类脚本来验证比特币交易:一个锁定脚本和一个解锁脚本。
(1)锁定脚本
A给B的比特币地址付款时,A会输出一个UTXO,用含有B地址的锁定脚本给这个输出的UTXO上锁,相当于告诉大家:花这笔钱的条件是能打开这个锁。
(2)解锁脚本
B要使用UTXO来付款时,需要用解锁脚本证明自己能把之前A上的锁打开,说明自己满足花这笔钱的条件。解锁脚本包含一个用B的私钥生成的有效签名。
(3)交易验证
每一个比特币客户端都会同时执行锁定脚本和解锁脚本来验证这一笔交易。只有一笔有效的交易才会导致UTXO被标记为“已使用”,然后从有效的(未使用)UTXO集中所移除。
以上知识来自于金马带你定投区块链,更多区块链的知识,识别二维码来订阅学习。