注意:不推荐去玩比特币以及类似的加密货币,那个玩意说涨就涨,说跌就跌,比特币实质上就是一串数字,没有实物,没有信用背书,当这个巨大泡沫破裂之时,大部分人绝对不可能及时套现跑路,了解比特币下的技术可以,但是绝对不能接触或者玩比特币以及类似的加密货币

1个比特币相当于100000000聪,聪(Satoshi)是比特币目前最小的单位,是为了纪念比特币的创建者中本聪(Satoshi Nakamoto)

在中国唯一值得信赖的加密货币是数字人民币,有国家在做信用背书,是有法偿能力的法定货币,和现金等值

区块链技术诞生于比特币,而比特币的诞生又来源于一位叫中本聪的一篇文章(比特币:一种点对点的电子现金系统)

区块链的一个特点就是去中心化,中心化指的是数据中心化,例如支付宝和微信,那些支付的数据全部集中在数据库中,确保交易用户的余额一增一减

而区块链技术就是把数据全部公开,区块链中的每一个节点都可以获得一份完整的区块链,而且全部都是相同的数据,如果篡改了其中一份数据,那么这份数据会和其他节点的数据对比,如果不相同,那么这份数据是不被其他节点承认的

而需要伪造一个区块链需要拥有超过全网51%的(节点)算力

区块链是一个个区块组成的有序链表,区块中记录着一系列信息,每个区块都指向前一个区块,每个区块都有一个哈希标识(又被称为区块哈希),区块链的不可篡改的特性就是由哈希算法提供的(哈希是单向的,哈希算法可以将一段数据计算出一个哈希值,而哈希值不能反推出加密前的数据,只能暴力穷举)

如果两份数据的哈希值相同,那么这两个哈希值的数据就是相同的,只要改动了原始数据任意的数据,那怕只修改一个字节,都会改变哈希值

常见的哈希算法

MD5:128位,16字节

SHA-1:160位,20字节

SHA-256:256位,32子节

SHA-512:512位,64子节

RipeMD160:160位,20子节

哈希函数:Hash(原始数据) = 摘要数据(哈希值)

比特币使用的哈希算法有两种,一种是双重SHA-256(将数据进行两次SHA-256计算),另一种就是先将数据进行SHA-256计算,再将处理过的数据再进行一次RipeMD160计算

区块的头部有一个Merkle Hash字段,记录了该区块的全部交易的哈希树(全部交易的数据通过哈希算法处理为一个汇总的哈希值)

例如:当一个区块中有好几个交易,然后将一对一对的交易数据做差异哈希算法(dhash),得到两个哈希值,将这两个哈希值拼起来,计算出下一层的哈希值,一层一层计算,最后的得到的哈希值就是Merkle Hash

那么如果每一层是单数,那么将每一层的最后的一个数据复制一份,最后计算出最终值

区块本身使用Merkle Hash来表示,而区块本身的哈希值是没有记录在区块头部的,需要通过计算区块头部的数据得到

区块头部的Prev Hash记录了上一个区块的哈希值(不是Merkle Hash,而是区块本身的哈希值),可以通过Prev Hash来追踪到上一个区块,每个区块的Prev Hash都会指向自己的上一个区块,一直反复下去,一直到区块链的第一个区块(创世区块,该区块没有上一个区块)

从对Merkle Hash的计算方法和对区块头部来追踪到上一个区块的方法得出,只要篡改其中任意一个交易的数据(哪怕是一字节的改动)都会让Merkle Hash验证失败,那么这个区块就是无效的,只能重新计算Merkle Hash,然后这个区块本身的哈希值就改变,因此下一个区块指向该区块的链接也断了

篡改一个区块,需要重新计算这个区块的本身的哈希值,然后将下一个的所有区块全部计算并且伪造,才能篡改整个区块链,难度极高,因为区块链是不断增长的,修改的难度也会越来越难,而挖矿实质上就是重新计算区块头部的哈希值,直到于哈希值匹配,挖矿本身的要求就已经很高了,更不用说篡改整个区块链了

比特币交易中使用了一种名叫点对点交易,就是用户对用户,这个交易的特点就是去中心化,整个交易全部依赖于数学加密

用到一个叫公钥和私钥,地址的概念,公钥是可以根据私钥计算出来的,而私钥就不能通过公钥计算出来,因此私钥很重要,不能泄露

地址的计算方法

Hash(Hash(fun(私钥))) = 地址

而需要不通过泄露私钥的情况下,表明拥有某个私钥,需要用到签名,先将交易信息进行哈希计算,然后签名计算,sign(‘交易信息的哈希值’,‘私钥’),最后得到一个签名值

而进行付款时,会向区块链的节点进行广播,广播信息包括,交易信息和签名值,而验证签名信息的确是某个私钥的,验证过程例如:

verify(‘签名值’,‘付款方地址’),获得的值为交易的哈希值

if(verify(‘签名值’,‘付款方地址’) == hash(’{交易信息}’))

如果当某一个节点验证通过,那么该节点也会进行再一次的广播

交易信息中没有包含任何个人的信息,因此区块链具有匿名性

而比特币的交易是根据私钥来验证的,只要不泄露私钥,那么比特币的账户是安全的,私钥破解,私钥的个数有2的256次方,相当于人类可观测宇宙的原子数,根据当前计算机的计算速度,根本不可能碰撞出来,除非倒霉到碰撞第一次就匹配到了

挖矿:将交易记录,交易的时间,以及序号等等数据进行哈希打包的节点就是矿工节点,而完成哈希打包任务,并且认为其有效的,就会获得比特币奖励

一段时间内只能一个矿工节点成功记账,并且被证明为有效的,这个时间一般为10分钟,奖励比特币的机制为每4年减半

而且需要进行POW工作量证明竞争来获得记账权(也就是传说中的挖矿,因为要进行大量的计算,因此挖矿需要大量的算力,竞争该记账权是具有一定随机性的)

其他节点复制记账结果(也会获得比特币奖励)

POW工作量证明

Hash(上一个Hash值,交易记录集,随机数)= 哈希值

而比特币中有个机制,哈希值要小于某个目标值,因此需要不断修改随机数的值,比特币因为矿工节点越来越多,挖取比特币的难度也会越来越难,难度越难,那么目标值就越小

交易记录集:收集广播中还没有被记录账本的交易,交易的有效性验证,添加给自己转账的交易(挖矿奖励)

目前比特币的共识机制:优先选择工作量最大的区块链,最长的区块链,因此矿工会延长计算,已确保自己是工作量是最大最长的

如果两条链被广播到其他节点,因为网络具有不确定性,有可能某个节点会先收到某个链,在这个链上挖矿,从而导致链出现分叉,如果两个链都同时收到,那么会优先选择工作量最大的区块链,另一个链为备用链保存

解决分叉:如果当前链的上一级链更长的话,优先选择,而短一点的链会被抛弃

分叉分为硬分叉和软分叉

硬分叉:区块链发生永久性改变,在新共识发布后,那些没有更新的节点无法验证已经升级的节点的所产生的区块,改变挖矿难度

软分叉:区块链发生改变,但是不会像硬分叉那样影响没有更新的节点,旧节点会兼容新节点,但是新节点不兼容旧节点而已

解决分叉的方法就是所有矿工都遵从同样的机制(升级机制,保证机制为最新),而且那些没有遵从的就会发生分叉

最经典的例子就是拜占庭将军问题

主要讲的是:拜占庭帝国去攻击一个敌人,派了10支军队,要将这个敌人打败需要至少6支军队,而且必须在分散包围状态下同时攻击,需要依靠通信兵来进行传递信息,但是不清楚这些通信兵或者将军中是否有叛徒,而这些叛徒可能会传递假消息来导致进攻失败,而拜占庭将军们需要在这种分布式下进行传递消息

而在区块链中,完美解决这个问题,进行区块链广播需要进行POW工作量证明,而且限制一段时间内只允许一个账号能广播,降低了虚假信息传播的量和成本,而且进行广播需要进行不可伪造的签名(私钥和公钥),每隔一段时间,信息就进行更新,节点进行验证,根本不让虚假信息的传播发送成功得逞,不可逆的哈希算法加密加上信息传递速度的限制,把区块链打造成了一个无需信任的数据信息交互平台

假如:将军a发送进攻消息给将军b,为了防止信息泄露,使用非对称加密算法将消息进行加密,因为将军b的公钥是公开的,也就可以使用将军b的公钥进行信息加密,而将军b只能使用他的私钥进行解密,因为使用公钥加密的信息,可以通过私钥进行解密,主要是保护信息是完整的,但是依然可以传递虚假的信息给将军b(因为公钥是公开的,谁都可以进行公钥加密),因此,为了证明是将军a发的,还需要在信息上加签名,也就是将私钥加密成一个签名,然后将军b得到这个签名,需要将这个签名和将军a的公钥来验证,来确定发送这个消息的人的身份