区块链学习笔记2

关于比特币(参考自《白话区块链》)

1.回收硬盘空间

实际上,只有运行全功能节点的客户端才会一直保持完整的区块链数据。这里提出了一个思路,删除过老的一些交易数据,同 时不破坏区块的随机哈希值,通过这种方法压缩区块数据。

2.简化的支付确认(移动端的解决方案)

上述提到了,比特币客户端的数据量很大,这么一来,等于不管是 用比特币系统干什么都要带上大量的数据,这岂不是很不方便,而且也 会限制在其他一些终端(比如手机)上的使用。这部分提出了一个模 型,这个模型主要是为比特币的支付服务的。在这个模型下实现的比特 币支付功能并不需要携带那么庞大的数据,而只需要保留体积相对很小 的区块头。 

 

中本聪客户端的功能模块

钱包: 主要用于管理用户的密钥以及提供转账操作等功能,属于比特币的前端功能。

网络路由:底层的网络协议:TCP/IP协议

没有服务器,大家彼此如何来认识对方呢,即如何发现其他 的节点呢?这是需要通过一个协议的,首先节点会启动一个网络端口 ,通过这个网络端口与其他已知的节点建立连接。连接时,会发送一 条包含认证内容的消息进行“握手”确认,比特币网络中是靠彼此共享节 点信息来寻找其他节点的,当一个节点建立与其他节点的连接后,会发 送一条包含自身IP地址的消息给相邻的节点,而邻居收到后会再次发送 给自己的其他邻居,当然节点也不是只能被动地等别人来告诉自己,也 可以自己发送请求给其他节点索取这些地址信息,如果与发现的节点之 间能够成功连接,那么就会被记录下来,下次启动时就会自动去寻找上 次成功连接过的节点。
 

挖矿:挖矿有以下用途:

·抢夺区块打包权

·验证交易事务

·奖励发行新币

·广播新区块

比特币系统没有一个中心服务器,自然也就没有一个传统意义上的权威数据来源了。为保证各节点数据一致,就得有一个约定的规则,大家共同按照这个规则来进行竞争,谁竞争成功了谁就有数据的打包权,也就是记账权,打包完成后广播给别 人,别人只要验证一下有无问题即可,没有问题就存入到自己的数据文 件中。等于就是大家来竞争临时中心服务器的资格,那 么比特币中实行了一种什么样的规则呢?那就是被称为工作量证明 (Proof of Work,PoW)的一种算法,其实就是类似于掷骰子的一种游 戏。比如大家约定掷出一个10位长度的数字,前面6位要都是0,后面的 4位数得小于某个值,看谁先掷出符合要求的数字出来,谁就抢得了打 包权(记账权)。

1.难度值(书讲的有点乱,我试着整理了一下)

首先,既然是大家都在竞争掷骰子,那掷出来的数字必然是要符合 一个难度的,这个难度就是一个门槛,在比特币软件中,规定一个256 位的整数:
x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

作为难度1的目标值。在比特币诞生初期,当时的全网算力,大约 需要10分钟左右的运算能得到一个符合这个难度1要求的值,这也是我 们常常说比特币网络每隔大约10分钟出一个区块的来源。我们在查询创 世区块(也就是0号区块)的信息时,可以看到当时的难度就是1。那 么,所谓符合这个难度为1的要求的值是什么意思呢?就是说通过工作 量证明算法,也就是比特币中的挖矿算法来计算出一个结果,这个结果 要小于这个难度目标值。

这个难度目标值是存储在区块的头部的,在源码中被定义为一个4字节长度的字段,4字节也就是32位,要用 来存储256位长度的难度目标值,因此这256位长度的值需要经过压缩处 理后才能放到这个字段中。以这个难度1的目标值来说,我们查询区块 信息后,看到的值是Bits:1d00ffff,那么,这个值是怎么压缩而来的呢?

首先,Bits字段的最高位字节用于存放目标值的有效位节数(有效位是从第一个不为0开始的字节),在难度1中,共32字节,前4位是0,因此有28位有效位节数,但是在压缩规则中,规定了如果难度值有效位 的最高位为1,则需要在前面补上一个0x00,而难度一的最高位为F,即1111,因此满足条件,需要再加一字节0(也就是0x00),因此,算起来共有29位有效位节数,记作1D。另外3个字节中存储的是目标值有效位的最高3个字节, 此时的目标值有效位前面已经加上了2个0,因此最高3个字节为 0x00FFFF,合起来压缩后的值就是0x1D00FFFF。对于这样的一个压缩 后的十六进制4字节难度目标值,前2位通常称为幂或者指数,后面6位 称为系数。

以此类推,目标值为0x00000000000404CB000000000000000000000000000000000000000000000000时,bits的格式为0x1B0404CB。

那还原时有公式: 目标值=系数*2^(8*(指数-3))次方。
我们就以这个0x1D00FFFF为例来说明,系数是后面6位也就是 00FFFF,指数是前面2位也就是1D,代入进去就是: 0x00FFFF*2^(8*(0x1D-3)),计算后得到的值是: 0x00000000FFFF0000000000000000000000000000000000000000000000000000 

2.挖矿计算

在比特币系统中,每个人都会将通过钱包进行的转账交易数 据广播到网络中,这些都是属于等待打包的未确认交易数据。这些数据 都会放在一个内存池中,总之就是一个缓冲区,当然,这些数据都会被 接受基本的验证,用以判断是否是不合法的或者是不符合格式的交易数 据。
挖矿程序从内存池中获取用来打包区块的交易数据,挖矿公式如下:

SHA256(      

    SHA256(version + prev_hash + merkle_root + ntime + nbits + nonce )    

) < TARGET


SHA256是一种哈希算法,可以通过对一段数据进行计算后输出一 个长度为256位的摘要信息。在这个公式中,对参数进行两 次SHA256计算,如果计算出来的值小于那个TARGET(也就是难度目 标值),那就算是挖矿成功了。那么,这些参数都是由哪些组成的呢? 请看下表:

我们可以看到,要通过这样的参数来计算出符合条件的值,基本上 也就只能靠暴力计算匹配了,这种不断执行SHA256计算的过程很消耗 算力,因此这个过程被形象地称为“挖矿”。简单地说,挖矿就是重复计 算区块头的哈希值,不断修改该参数,直到与难度目标值匹配的一个过 程。

而挖矿的奖励其实是作为一 条交易事务包含在区块的交易事务中的,相当于系统给矿工转账了一笔 比特币,这种交易事务由于特殊性,通常称为coinbase交易,这个交易 一般是位于区块中的第一条。

 

如果在同一时间内多 个矿工都计算出了符合条件的值,都拥有了打包权,那以谁的为准呢? 比特币中的解决方案是让节点自己选择,最终传播最广、处于最长链中的区块将被保留。
这里实际上隐含着FLP原理:在网络可靠,存在节点 失效(即使只有一个)的最小化异步模型系统中,不存在一个可以解决 一致性问题的确定性算法。这个其实也很好理解,来看个例子:三个人 在不同房间投票,虽然三个人彼此之间是可以通电话沟通的,但是经常 会有人时不时地睡着。比如,A投票0,B投票1,C收到了然后睡着了 (类比节点失效了),则A和B永远无法在有限时间内和C共同获得最终 的结果。看到这里,我们也就明白了挖矿的作用了,除了发行新的比特 币外,主要就是维持网络共识,让每个节点对区块链的数据保持最终一 致性。

 

 

比特币地址的形成:
1)首先使用随机数发生器生成一个私钥,私钥在比特币中的作用 非常重要,可以用来证明用户的身份,也可以签发交易事务。
2)私钥经过SECP256K1算法处理生成了公钥,SECP256K1是一种 特定的椭圆曲线算法,需要注意的是,通过算法可以从私钥生成公钥, 但是却无法反向从公钥生成私钥,这也是公钥为什么可以公开的原因。
3)公钥接下来先使用SHA256哈希算法计算,再使用RIPEMD160 哈希算法计算,计算出公钥哈希。比特币的代码通过2次哈希来计算地 址值,这样能进一步确保哈希后的数值唯一性,进一步降低不同数据进 行哈希后相同的概率。与SHA256一样,RIPEMD160也是一种哈希算 法。
4)将一个地址版本号连接到公钥哈希(比特币主网版本号为 0x00),然后对其进行两次SHA256运算,将计算得到的结果取前面4字 节作为公钥哈希的校验值。
5)将0x00版本号与公钥哈希以及校验值连接起来,然后进行 BASE58编码转换,最终得到了比特币地址。

这个过程如下图所示:

 

很多时候,我们在进行支付的时候,只是想通过一个支付验证,知 道支付已经成功发起就可以了。对于完整的交易验证(需要在完整的账 本数据上校验,比如是否包含足够的余额,是否双花等)可以交给核心 节点,这样就可以将钱包功能部分剥离出来,由此产生了SPV钱包,SPV钱包的大致过程如下所示。

1)首先下载完整的区块头数据,注意是区块头,而不是所有的区 块链数据,这样可以大大减少需要获取的账本数据量,区块头中包含有 区块的梅克尔根,SPV方式主要就是靠它来实现的。 

2)如果想要验证某笔支付交易,则计算出这笔交易事务的哈希值 txHash。

 

3)找到txHash所在的区块,验证一下所在区块的区块头是否包含 在账本数据中。
4)获得所在区块中计算梅克尔根所需要的哈希值。

5)计算出梅克尔根。

6)若计算结果与所在区块的梅克尔根相等,则支付交易是存在的。
7)根据该区块所处的高度位置,还可以确定该交易得到了多少个 确认。
 

比特币交易事务的数据结构:UTXO(直接看例子更好理解)

1)001号交易为Coinbase交易,也就是挖矿交易,在这个交易 中,“输入”部分没有对应的“输出”,而是由系统直接奖励发行比特币, 矿工Alice得到了12.5个比特币的奖励,放在001号交易的“输出”部分。 此时,对于Alice来说,拥有了这12.5个比特币的支配权,这12.5个比特 币的输出可以作为下一笔交易的“输入”,顾名思义,这笔“输出”就称之 为是Alice的未花费输出,也就是Alice的UTXO的意思。

2)002号交易中,Alice转账6比特币到Bob的地址,Alice找到了自己的UTXO(如果Alice不止一笔UTXO,可以根据一定的规则去选用, 比如将小金额的先花费掉)。由于只需要转账6比特币,可是UTXO中 却有12.5个,因此需要找零6.5个到自己的地址中,由此产生了002号中 的交易输出,注意,在002号交易输出中的Alice地址是可以和001号中的 Alice地址不一样的,只要都是属于Alice自己的钱包地址就可以。

3)003号交易中,Bob转账了2比特币到Lily的地址,过程与002号 交易相同,就不再赘述了。
 

 

 

 


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值