2.6区块链
区块链就是一个一个区块链起来。
区块一块块产生,每次解当前的区块都会为之前的交易增加一次证明,也在网络中得到了更多的信任。
随着链的增长,计算复杂度不断增加,以往的区块也就越来越难以删改,(一个区块获得6次以上证明就基本不可能撤销了)。所以验证一个交易有效的简单手段就是确定这个交易在区块链中,后面有几个新的板块。
写好的区块就像泼出去的水。此外,我们可以通过区块链顺藤摸瓜追溯每一笔历史交易,这也保证了比特币的来源都是清晰有记录的。
第三章:比特币客户端
3.1完整客户端
自己维护一个全节点客户端成本比较高,但是可以保证安全,大客户比较实用。
从bitcoin.org下载的客户端包含了比特币系统的各个方面,是一个独立的完整节点。但是正因为包含了所有历史数据,下载整个区块链就需要好几天,需要足够容量的硬件,带宽,和时间。
3.2编译比特币源码
对于开发者,可以从GitHub上比特币页面下载代码自行编译,从终端运行bitcoind,也需要下载所有区块。
比特币核心的JSON-RPC API 接口的使用,包括以下技能点。
1.获取比特币核心客户端状态信息;
2.钱包设置及加密;
3,钱包备份,纯文本导出和恢复;
4.钱包地址及接收交易;
第四章:密钥,地址,钱包
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” “......?”小明艰难的用加法算出来了。“=8”
“几个7相加=8.....92”,小明当然算不出来坏叔叔出的题。
对于椭圆曲线密码来说,固定的生成点G就是例子里面的7;私钥k就是例子里面的8,也就是对G进行加法的次数(G+G+.......+G=K*G);公钥k是得到的结果(56和8......92)
和上面的例子不同的是,椭圆曲线密码中的“加法”是建立在“有限域上的二元三次曲线的点”上的。
具体的说,这个加法可以表现为以下两个图。将两个点连线之后求曲线交点关于x轴的对称点。图a是两个不同的点相加,图b是两个相同的点相加。
这个加法有两个很重要的特点
(1)正向计算(从私钥计算公钥)很简单。
(2)逆向计算(从公钥反推私钥)很困难。从公钥反推私钥只能像小明一样用傻瓜穷举法,以目前的计算能力,攻破椭圆曲线是不现实的。
看个例子理解一下为什么正推容易,反推难。
椭圆曲线加密公式:K=k*G。
正推:已知k,G,求k*G。
反推:已知K,G,求k。
先看反推,反推只能用最傻瓜的穷举法,比如k=10。
G==K?
G+G=2G==K?
2G+G=3G==K?
3G+G=4G==K?
4G+G=5G==K?
5G+G=6G==K?
6G+G=7G==K?
7G+G=8G==K?
8G+G=9G==K?
9G+G=10G==K?[Yes]
花了10步找到答案, k=10。
再看正推。
已经知道k=10。
G+G=2G
2G+2G=4G
4G+4G=8G
8G+2G=10G=K
四步就找到答案。
4.6哈希函数(从公钥到比特币地址)
比特币地址是由公钥经过单向的哈希函数生成的。
哈希(Hash)是一种数据编码方式,将大尺寸的数据(如一句话,一张图,一段音乐,一个视频等)浓缩到一个数字中,从而方便的实现数据匹配,查找的功能。
比如这里有一万首歌,给你一首新的歌x,要求你确认x是否在那一万首歌中。
将一万首歌每一个音符和X比对非常慢。那么,我们可以将每一首的数据浓缩到一个数字指纹上(称为哈希码),得到一万个数字,再将X的数字指纹和这一万个数字比对,就能知道X是否在那一万首歌中。
第五章:交易
5.1比特币交易的生命周期
交易产生——被签名加密——全网广播——全网节点验证并接受——挖矿节点验证并添加到区块中——被足够多的后续区块确认有效
5.2交易在全网的传播
每个比特币节点都和一些其他节点相连,形成一个巨大的网状结构。每个节点收到交易之后都会进行验证,如果有效就传播到其他节点,如果无效就拒绝并返回。一笔有效的交易几秒钟就传遍全网。
比特币网络有一下几个特点:
1.没有中心,所有节点的地位都是平等的。
2.传播灵活高效,能够抵御攻击。
3.每个交易节点在传播交易之前都会独立验证,增加可靠性。
5.3UTXO
这个概念很重要。比特币交易的基本单位是UTXO“未花费过的一个交易输出”。在比特币的世界里既没有账户,也没有余额,只有分散到区块链里的UTXO。
要理解UTXO,我们假设一个这样的场景:张三挖到12.5个比特币,之后,他把2.5个比特币支付给了李四,又过了几天,他和李四各出资2.5个比特币凑成5个支付给王五。
如果是基于账户的设计,张李王三人在数据库里各有一个账户,则他们三人的账户都有记录。
而比特币交易过程是不一样的,上一笔交易的输出是下一笔交易的输入,形成一条交易链。在一笔交易中,被交易消耗的UTXO被称为交易输入,由交易创建的UTXO被称为交易输出。
比特币钱包通过扫描区块链并聚合所有属于该用户的余额。当用户付款时,他的钱包通过选择可用的UTXO来构造一笔交易。一旦UTXO被选,钱包会为他生成包含签名的解锁脚本,相当于把钱柜打开取钱出来支付。
5.4交易费
大多数交易都需要支付交易费,作为对辛勤工作的比特币矿工们的劳动费。交易费可当做矿工们确认区块的奖励,交易费的多少会影响处理的优先级,有足够费用的交易会更早被包含在下一个挖出的区块中,也就更早得到确认和验证。交易费大多数情况下都是由钱包程序替你自动计算出来的。
问题?为什么steem bts eos 不需要交易费?
5.5交易验证:UTXO的锁定和解锁
比特币的交易验证引擎依赖于两类脚本来验证比特币交易:一个锁定脚本和一个解锁脚本。
(1)锁定脚本
a给b的比特币地址付款时,a会输出一个UTXO,用含有b地址的锁定脚本给这个输出的UTXO上锁,相当于告诉大家:花这个钱的条件是能打开这把锁。
(2)解锁脚本
b要使用UTXO来付款时,需要用解锁脚本证明自己能把之前a上的锁打开,说明自己满足花这笔钱的条件。解锁脚本包含一个用b的私钥生成的有效签名。
(交易验证)
每一个比特币客户端都会同时执行锁定脚本和解锁脚本来验证这一笔交易。只有一笔有效的交易才会导致UTXO被标记为“已使用”,然后从有效的(未使用)UTXO集中所移除。