最近国内有做区块链的公司被朝鲜Lazarus打了,分析流量时遇到很多不懂的参数,顺势补一下课。虽然上车比较晚,但种一棵树最好的时候是十年前,其次是现在。去中心化金融,对于每个想要“玩自己的游戏的人”都是必修课。

区块链のtutorial

区块链的本质,是一种特殊的分布式数据库。

区块链的主要作用是存储信息,任何需要存储的信息都可以写入区块链也可以从里面读取,所以它是数据库。

去中心化→任何人都可以架设服务器,加入区块链网络,作为一个节点。每个节点最后都会同步,保证区块链的一致,都保存着整个数据库。

区块链的最大特点:彻底无中心。其他的数据库都有DBA,但是区块链从原理上防止了居于中心地位的管理当局(Cool)。

区块链的可信原理:区块链由一个个区块即block组成,类似于数据库的记录。每次写入数据,将创建一个区块。每个区块包含两部分,区块头head和区块体body,分别记录当前区块的特征值和实际数据。**区块头包含了当前区块的多项特征值:生成时间,区块体的hash,上一个区块区块头的hash,等等。**SHA256是区块链的hash算法,由于区块头中包含上一个区块的hash,所以可以实现链式结构(想到单向链表)。如果当前区块的区块体改变,或者上一个区块的区块头改变,都会引起当前区块头hash的改变。每一个区块都连着上一个区块,所以称之为“区块链”。

如果有人要修改一个区块,为了让后面的区块还能连到它(因为下一个区块包含上一个区块的哈希),必须依次修改后面所有的区块,否则被改掉的区块就脱离区块链了。由于后面要提到的原因,哈希的计算很耗时,短时间内修改多个区块几乎不可能发生,除非有人掌握了全网51%以上的计算能力。

挖矿:因为必须保证节点间的同步,所以新区块的添加速度不能太快。否则时间都消耗在同步上,因为同步之后之前做的计算已经没有意义。故中本聪在设计上让添加新区块变得非常困难,平均10分钟全网才能生成一个新区块。这种产出速度不通过命令达成,而是海量计算,计算的过程即挖矿。

学到此处的疑问:①是否对于同一时刻世界上所有的矿机而言,都在对同一区块进行计算?②比特币的经济价值从何而来?③谷歌的量子计算会不会对当前区块链的逻辑造成影响?(毕竟快到开始用“平行时空”来解释了)。④当前区块的有效hash指的是什么?⑤SHA256的计算怎么才能够变成海量?普通文件的hash不到一秒钟便能够算完。hash值不是确定的吗,为什么能够计算很多次?⑥当前五花八门的币种和区块链、比特币是什么关系?

难度系数:④的答案,不是任何一个hash都可以被区块链接受,只有足够难(计算出来的hash值小于target值)的hash才会被区块链承认。由于目标值非常小,所以需要计算非常多的次数才能达到要求,所以速度会非常慢。

target = targetmax / difficulty

其中targetmax=0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,difficulty的值写在区块头中。

⑤的答案,如果要对同一个区块反复计算哈希,就意味着,区块头必须不停地变化,否则不可能算出不一样的哈希。区块头里面所有的特征值都是固定的,为了让区块头产生变化,中本聪故意增加了一个随机项,叫做 Nonce。Nonce 是一个随机值,矿工的作用其实就是猜出 Nonce 的值,使得区块头的哈希可以小于目标值,从而能够写入区块链。Nonce 是非常难猜的,目前只能通过穷举法一个个试错。根据协议,Nonce 是一个32位的二进制值,即最大可以到21.47亿。⑥理论上一个新区块需要再生长出5个区块才能确认,所以一笔交易平均需要1个小时才能确认?

也有可能出现算完了21.47亿次,发现不可能计算出满足条件hash的时候,协议允许矿工改变区块体重新进行计算。

难度系数的动态调节:挖矿具有随机性,没有办法保证十分钟正好产出一个区块。为了将产出速率恒定在十分钟,中本聪设计了对于难度系数的动态调节机制。难度系数每两周即2016个区块调整一次(想起今年BTC产量将减半的新闻)。过去两周生成的区块链过快时,难度系数便会增加,反之减小。

区块链的分叉:如果两人同时向区块链写入数据,应该采用哪一个区块?现在的规则是,新节点总是采用最长的那条区块链。如果存在分叉的情况,看哪个分叉的节点(包括自身)先达到6个新区块(称之为“六次确认“)。由于新区快的生成速度由计算能力决定,拥有大多数计算能力的那条分支,将会成为区块链。

区块链的弊端:①数据写入区块链,最少需要等待10min,所有节点同步数据,需要更多时间。②矿工需要进行无数无意义的计算,非常消耗能源(在AI兴起,算力资源更加珍贵的现在尤甚)。所以区块链的适用场景:

不存在所有成员都信任的管理当局
写入的数据不要求实时使用
挖矿的收益能弥补使用区块链的成本

所以⑥错误,如果不存在分支情况,只需要一个区块便能够确认。存在分支情况才需要1小时。

BTCのtutorial

**非对称加密:**基于公钥和私钥的加密算法。公钥是公开的,任何人都可以获取。私钥是保密的,只有拥有者才能使用。他人使用你的公钥加密信息发送给你,你可以使用私钥解密。你也可以使用私钥加密信息,别人使用你的公钥解开。

比特币钱包:对于比特币来说,钱不是支付给个人的,而是支付给某笔私钥的,这就是交易匿名性的根本原因。所以比特币交易的第一件事,就是拥有自己的公钥和私钥。在交易所开户,首先会让你生成一个比特币钱包。这个钱包不用来存放比特币,而是用来存放公钥和私钥,

公钥:即钱包地址,根据协议,公钥的长度是512位。这个长度不太方便传播,因此协议又规定,要为公钥生成一个160位的指纹。所谓指纹,就是一个比较短的、易于传播的哈希值。160位是二进制,写成十六进制,大约是26到35个字符,比如 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2。这个字符串就叫做钱包的地址,它是唯一的,即每个钱包的地址肯定都是不一样的。你向别人收钱时,只要告诉对方你的钱包地址即可,对方向这个地址付款。由于你是这个地址的拥有者,所以你会收到这笔钱。

交易过程:一笔交易的过程就是一个地址的比特币,转移到另一个地址。由于比特币的交易记录是全部公开的,所以公钥拥有多少比特币是可以验证的。问题出现在如何证明申报一笔转出交易的人确实是转出方。故比特币协议规定,申报交易时除了交易金额,转出比特币的一方还必须提供①上一笔交易的hash②本次交易双方的地址。③支付方的公钥④支付方私钥生成的数字签名

验证交易的过程:①找到上一笔交易,确定支付方比特币的来源。②计算出支付方公钥的指纹,确认与支付方的地址一致,从而保证公钥属实。③使用公钥解开数字签名,保证私钥属实。

确认交易的真实性后,交易还需要写入数据库被公众承认才算真正完成,BTC使用的数据库即区块链。

首先所有的交易数据都被传送的矿工,矿工负责将这些数据写进区块体中。根据BTC协议,一个区块的大小最大时1MB,一笔交易大概500byte,因此一个区块最多包含2000多笔交易。矿工负责将这些交易打包成一个区块,然后计算这个区块的hash。矿工间相互竞争,谁第一个将新区快写入区块链谁便获得全部收益。

**比特币不存放在钱包里,只存放在区块链上。**实际上你每次使用比特币,都需要第一笔交易开始计算收入减去支出。

矿工的收益,BTC协议规定挖到新区块的将会获得奖励,08年是50个比特币,每4年减半,流通中的新比特币是这样产生的。在挖矿奖励趋近于零之后,矿工的收益就完全依靠交易手续费了。

所谓交易手续费,就是矿工可以从每笔交易抽成,具体的金额由支付方自愿决定。你完全可以一毛不拔,一分钱也不给矿工,但是那样的话,你的交易就会没人处理,迟迟无法写入区块链,得到确认。矿工们总是优先处理手续费最高的交易。

区块的扩容:比特币网络每10分钟只能处理2000多笔交易,即全网3-5笔每秒,相比于传统支付来说非常慢。比特币扩容即将区块大小从1MB增加到更大,以提高单位时间内的处理交易数量。

**点对点网络:**比特币是一个全世界的开放网络,只要你有服务器,就能加入这个网络,成为一个节点。每个节点都包含了整个区块链(目前大概 100多 GB),并且节点之间时刻不停地在同步信息。当你发生了一笔支付,你所在的节点就会把这笔交易告诉另一个节点,直至传遍整个网络。矿工从网上收集各种新发生的交易,将它们打包写入区块链。一旦写入成功, 矿工所在节点的区块链,就成为最新版本,其他节点都会来复制新增的区块,保证全网的区块链都是一致的。

去中心化金融(DeFi)

Decentralized Finance,俗称DeFi,是一种建立于区块链上的金融,不依赖于券商、交易所或银行等金融机构提供的金融工具,而是利用区块链上的智能合约(例如:以太坊)进行金融活动。DeFi平台允许人们向他人借出或借入资金,交易加密货币,并在类似储蓄的账户中获得利息。

智能合约(Smart contract)

是一种智能协议,在区块链内制定合约时使用,当中内含了代码函数 (Function),亦能与其他合约进行交互、做决策、存储资料及发送以太币等功能。智能合约主力提供验证及执行合约内所订立的条件。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。

智能合约的目的是提供优于传统合同方法的安全,并减少与合同相关的其他交易成本。

参考:阮一峰的技术博客