Part I

区块链基础-区块链用到了哪些技术

前一主题已经介绍了区块链都用到了哪些技术,本主题将逐一介绍。

数据区块

比特币的交易记录会保存在数据区块之中,比特币系统中大约每10分钟会产生一个区块,每个数据区块-般包含区块头( Header)和区块体(Body)两部分

区块结构

区块头封装了当前的版本号、前一区块地址、 时间戳、随机数、当前区块的目标哈希值、Merkle树的根值等信息。

区块体中则主要包含交易计数和交易详情。交易详情就是比特币系统中的记账本,每一笔交易都会被永久地计入到数据区块中,而且对所有人开放查询。区块体中的默克尔树将会对每一笔交易进行数字签名, 确保每一笔交易都不可伪造且没有重复交易。

什么是时间戳 比特币时间戳服务器有什么不同

时间戳,英文叫 timestamp , 最早指的就是一个物理的橡胶戳,扣到一个文件上表示这个文件的发布要早于时间戳上的当前时间。 但是本文中我们聊的其实是数字时间戳,后面我们就都简称为时间戳了。 时间戳就是计算机生成的一个时间,例如某年月日几点几分,格式有很多种,但是总之就是一个很简短的用来表示时间的字符串。

区块的时间戳其实也只是记录区块创建的大概时间,也不能作为判断交易先后顺序的依据。 比特币上的所谓的时间戳服务器,其实就是它的整个 POW 系统,因为这个系统可以保证系统上每十分钟就创建一个区块。 同时系统会未每一个区块计算出哈希,每个区块中都保存着之前区块的哈希,有了这些哈希作为定位符,区块链就是一条单向的先后顺序明确的链条了。 每个区块自然也就有了明确的先后顺序,同时也就是意味着里面包含的交易也都有了明确的交易顺序,这就是比特币时间戳服务器的基本原理。

p2p网络和共识算法

P2P网络,字面上的意思就是一种点对点的网络或是对等就算,在国内也很早就有应用,比如大名鼎鼎的种子,也就是被人们经常使用的迅雷,还有已经消亡的快播,可以说P2P网络,在你很早之前就已经出现,只是在这里加上了共识算法,进一步的稳定这个对等网络的安全。

挖矿和工作量证明机制

说到比特币就不得不提挖矿,而挖矿不是传统意义上去煤窑里挖矿,而是通过计算机的计算能力和一种特殊的算法模型来实现,同等情况下谁的计算能力和速度快,谁就有机会获取本次奖励的机会,而工作量证明就是在挖矿的时候,比特比系统的算法会给一个评价,每一个矿工都是平等的,统一对待,最终只有多个人会获取本次挖矿的奖励,也就是每个矿工的工作量证明。在工作量证明之后,也推出了很多新的模式,比如PoS、Dpos等新的权益算法,在后文会一一介绍。

匿名交易机制和比特币钱包

首先为什么会出现匿名交易机制?当初中本聪在创建比特币的时候,他作为一个极客,自然对隐私也是很注重的,比如现在10年过去了,仍然没有人知道中本聪是谁,或许就是这样的原因让比特币附有了匿名交易机制,为了不被追踪到,当然也是为了个人隐私的防泄漏。

既然有匿名交易,那么就来分析一下传统意义上的匿名机制和比特比的匿名机制有何区别?首先说传统的隐私模型,比如股票交易,每一笔成交都会出现一个交易的订单,而作为托管方是知道交易双方的信息,只是作为中介不会把信息泄露出去,这就出现了假匿名现象,而比特币的匿名机制是通过比特币的去中心化网络来协调双方交易,对外可见的信息仅仅只有双方的钱包地址,而这个地址背后属于谁并没有人知道,因此比特币的匿名相对传统交易有更健全的匿名机制,但是如果通过交易的地址及交易额做关联分析,也可以获得交易者的一点蛛丝马迹,比特币的匿名交易并没有实现完全的匿名交易,目前市面上的匿名交易数字货币比较好的有:门罗币(Monero)、zcash(大零币)、horizen、grin(笑脸币)、verge、komodo(科摩多币)、Zcoin(小零币)等

比特币钱包目前分类有很多中,比如轻钱包、全节点钱包、冷钱包、在线钱包、硬件钱包等,而对于初期投资者而言,如果是需要长期投资,那可以选择一个冷钱包或一些比较大型机构出的钱包用来长期存储,比如coinbase、火币钱包、trust wallet、luno、bitpay,当然也可以直接选择硬件钱包,比如ledger、keepkay、trezor等,如果你只是玩玩并不是一个忠实的HODL,那么你完全可以在交易所存储,当然需要是一些知名的大型交易所,比如国内的币安、火币、okex、国外的:coinbase、p网、B网、bitmex等平台,还有一种情况就是,如果你不是一个折腾的人,或者是投资额度比较小,那么用币安或coinbase、luno直接当存储也是可以的,用一个去中心化的钱包也是很安全的。

Notice:为什么推荐了币安,而不是火币,已经出海和未出海,作为投资者你懂的。

UTXO 和 Account 模型

  • UTXO(Unspent Transation Outputs)是未花费的交易输出,它是比特币交易过程中的单位。除创世区块以外,所有区块中的交易(Tx)会存在若干个输入(Tx_in,也称资金来源)和若干个输出(Tx_out,也称资金去向),创世区块和后来挖矿产生的区块中给矿工奖励的交易没有输入,除此之外,在比特币系统中,某笔交易得到输入必须是另一笔交易未被使用的输出,同时这笔输入也需要上一笔输出地址所对应的私匙进行签名。当前整个区块链网络中的UTXO会被存储在每个节点中,只有满足了来源于UTXO和数字签名条件的交易才是合法的。所以区块链系统中的新交易并不需要追溯整个交易历史,就可以确认当前交易是否合法。

  • 优点:

    • 计算是在链外的,交易本身既是结果也是证明。节点只做验证即可,不需要对交易进行额外的计算,也没有额外的状态存储。交易本身的输出 UTXO 的计算是在钱包完成的,这样交易的计算负担完全由钱包来承担,一定程度上减少了链的负担。

    • 除 Coinbase 交易外,交易的 Input 始终是链接在某个 UTXO 后面。交易无法被重放,并且交易的先后顺序和依赖关系容易被验证,交易是否被消费也容易被举证。

    • UTXO 模型是无状态的,更容易并发处理。

    • 对于 P2SH 类型的交易,具有更好的隐私性。交易中的 Input 是互不相关联的,可以使用 CoinJoin 这样的技术,来增加一定的隐私性。

  • 缺点:

    • 无法实现一些比较复杂的逻辑,可编程性差。对于复杂逻辑,或者需要状态保存的合约,实现难度大,且状态空间利用率比较低。

    • 当 Input 较多时,见证脚本也会增多。而签名本身是比较消耗 CPU 和存储空间的

  • ACCOUNT 模型

    • 对于 Account 模型,Account 模型保存了世界状态,链的状态一般在区块中以 StateRoot 和 ReceiptRoot 等形式进行共识。交易只是事件本身,不包含结果,交易的共识和状态的共识本质上可以隔离的。

  • 优点:

    • 合约以代码形式保存在 Account 中,并且 Account 拥有自身状态。这种模型具有更好的可编程性,容易开发人员理解,场景更广泛。

    • 批量交易的成本较低。设想矿池向矿工支付手续费,UTXO 中因为每个 Input 和 Out 都需要单独 Witness script 或者 Locking script,交易本身会非常大,签名验证和交易存储都需要消耗链上宝贵的资源。而 Account 模型可以通过合约的方式极大的降低成本。

  • 缺点:

    • Account 模型交易之间没有依赖性,需要解决重放问题。

    • 对于实现闪电网络/雷电网络,Plasma 等,用户举证需要更复杂的 Proof 证明机制,子链向主链进行状态迁移需要更复杂的协议。

Merkle树

Merkle树

Merkle树是一种数据结构中的一种树,可以是二叉树,也可以是多叉树,它具有树结构的所有特点。merkle树最早由Ralph Merkle在1980年提出,在区块链系统出现之前,曾广泛用于文件系统和P2P系统中。

梅克尔树,一般意义上来讲,它是哈希大量聚集数据“块”(chunk)的一种方式,它依赖于将这些数据“块”分裂成较小单位(bucket)的数据块,每一个bucket块仅包含几个数据“块”,然后取每个bucket单位数据块再次进行哈希,重复同样的过程,直至剩余的哈希总数仅变为1:即根哈希(root hash)。

矿工把区块内所有交易(约2000多笔)的哈希值一字排开,让相邻的两个交易哈希值牵手(相加),再算出新哈希(如上图红框所示,交易A和交易B算出的哈希值N0和N1,然后再把N0和N1相加算出新的哈希值N4)。继续类似的操作直到只剩下顶部的一个节点,即Merkle根,存入区块头。矿工验证、记录和整理交易的过程称为“打包”。往上叠加哈希值,直到顶点就完成打包过程。

Merkle树有两点特别神奇,首先它是逆生长的,先长叶子,然后是树枝,最后是树根;其次它的整个形状也像是一棵树倒过来的样子,叶子在最下面保存着所有交易记录,树根长在了最上面,存放在区块头里。2000多笔交易,需要2000多个叶子节点存放,所以真实的merkle树要茂盛很多。

双重支付

双重支付问题又称为“双花”问题,即利用货币的数字特性用“同一笔钱”完成两次或者多次支付。在传统的金融和货币体系中,由于金钱货币是物理实体,具有客观唯一存在的属性,所以可以避免双重支付的情况。但在其他的电子货币系统中,则需要可信的第三方管理机构提供保证。区块链技术则在去中心化的系统中不借助任何第三方机构而只通过分布式节点之间的相互验证和共识机制,有效地解决了双重支付问题,在信息传输的同时完成了价值转移。区块链技术通过区块链接形成的时间戳技术加上验证比特币是否满足UTXO(未花费交易)和数字签名,有效避免了双重支付的问题。如果有人用同一笔UTXO构造了两笔付给不同交易方的交易,则比特币客户端只会转发最先被侦听到的那个。矿工会选择将那笔交易包入未来区块,当其中一笔交易所在的区块后有5个链接的区块,这笔交易已经得到了6次确认。在比特币区块链上,通常的做法是6次确认后基本上该比特币被双花的概率会很小。按照中本聪在比特币白皮书中的计算,6个确认后双花的概率大概在0.024%

哈希函数

哈希函数在比特币系统中也有着重要的应用区块链中的数据并不只是原始数或者交易记录,还包括它们的哈希函数值,即将原始数据编码为特定长度的、由数字和母组成的字符串后,记入区块链。哈希函数有着很多适合存储区块链数据的优点。

1)哈希函数处理过的数据是单向性的,通过处理过的输出值几乎不可能计算始的输入值。

2)哈希函数,例如SHA256,将需要处理的数据分块,每块512字节,然后用 Merkle-Damgard转换函数把初始向量256字节)和第一块做输入,生成256字节,再作为初始向量与下一数字块进行 Merkle-Damgard转换,如此重复直到最后最后一个数据块。最后结果就是一个256字节的哈希值。因此,输入数据越长,哈希函数处理的时间就越长

3)哈希函数的输入值即使只相差一个字节,输出值的结果也会迥然不同。比特币系统中最常采用的哈希函数是双SHA256哈希函数,通俗来说就是将不同长度的原始数据用两次SHA256哈希函数进行处理,再输出长度为256的二进制数字来进行统一的识别和存储。总之,哈希函数是比特币系统中的关键技术,为比特币系统提供了很多便利。本主题后面的章节将会对哈希函数做详细介绍,此处不赘述。

加秘算法

  • 除了哈希算法以外,比特币中还存在一种为交易加密的非对称加密算法(椭圆曲线10.加密算法加密算法)。非对称加密算法指的就是存在一对数学相关的密钥,使用其中一个密钥进行加密的数据信息,只有使用另一个密钥才能对该信息进行解密。这对密钥中,对外公开的密钥叫作公钥,不公开的密钥就叫作私钥打个比方来说,公钥就像银行的账户,私钥就像是该账户的密码或者账户所有者的签名。区块链之上的有效交易有一个用于交易发起方私钥签名有效的数字签名,而该交易的签名可以通过使用交易发起方的公钥进行验证。公钥可以通过算法从私钥中计算得出,但私钥却不能从公钥中推出。比特币系统中使用的就是一种非常典型的非对称加密算法—椭圆曲线加密算法(ECC)。

比特币系统加秘算法
  • 如上图所示,比特币系统一般从操作系统底层的一个密码学安全的随机源中取出一个256位随机数作为私钥,私钥总数为256个,所以很难通过遍历所有可能的私钥得出与公钥的对应的私钥。用户使用的私钥还会通过SHA256和Base58转换成易书写和识别的50位长度的私钥,公钥则首先由私钥和Secp256k1椭圆曲线算法生成65字节长度的随机数。一般情况下,比特币钱包的地址也由公钥所生成,其生成过程为首先将公钥进行SHA256和 RIPEMD1160双哈希运算,并生成20字节长度的摘要结果(即Hash160结果),这个将作为比特币地址的主体(body)信息,再在前面加上版本前缀0x00,在后面添加4个字节的地址校验码。地址校验码通过对摘要结果进行两次SHA256运算,取哈希值的前4位产生。最后通过Base58处理把连在一起的版本前缀、主体信息和校验码转换成可以容易让人识别的比特币字符地址。

数字签名

  • 数字签名就是在信息后面加上另一段内容,作为发送者的证明并且证明信息没有被篡改。一般是发送者将信息用哈希算法处理得出一个哈希值,然后用私钥对该哈希值进行加密,得出一个签名。然后发送者再将信息和签名一起发送给接收者。接收者使用发送者的公钥对签名进行解密,还原出哈希值,再通过哈希算法来验证信息的哈希值和解密签名还原出来的哈希值是否一致,从而可以鉴定信息是否来自发送者或验证信息是否被篡改。

参考资料:

知乎

简书

区块链技术指南--邹均、张海宁、唐屹、李磊等