最近博主们正在整理一本浅显易懂的关于挖矿的科普画册,希望全面介绍挖矿过程中发生了什么,哪些环节产生了挖矿收益,以及我们常说的计算能力,为什么要这样分配挖矿收益等等,从最初的加密货币交易到挖矿确认交易。
以比特币为例,我们知道比特币网络挖矿的目的是包装交易,维护比特币网络,所以交易其实是与挖矿密切相关的第一个环节。在比特币网络交易过程中,非对称加密技术、数字抽象技术、区块链技术等。都用过,其中很多大神和珍珠都已经实现了,博主就不出丑了。本文的主要目的是用通俗易懂的语言展示比特币的交易过程,让更多像作者这样的技术门外汉了解比特币。
在解释之前,我们需要安利一下非对称加密的几个概念:也叫公钥加密,通过密码算法生成一对公私钥。公钥公开,私钥自己保管。它有两个目的:一是别人可以用公开的公钥加密数据,然后传输给公钥持有者,公钥持有者可以用相应的私钥解密数据,读取信息。这样可以保证信息传输的安全性;第二,公钥持有者可以使用私钥对信息进行签名(签名过程类似于加密过程),然后将信息和签名一起发送给其他人,其他人可以通过公钥对信息签名进行验证(验证过程类似于解密过程)。如果签名的信息与发送的信息一致,则可以证明该信息是公钥持有者发送的,这样可以在不泄露公钥持有者身份和私钥的情况下,保证信息来源的可靠性。(参考链接:https://en.wikipedia.org/wiki/Public-key_cryptography)
哈希算法(Hash algorithm):也叫Hash函数,它可以从一条消息或数据量很大的数据中计算出一个固定格式、数据量很小的数字摘要,也叫指纹、哈希值或hash。好的哈希算法应该是不可逆的(原始信息或数据无法从数字摘要中推导出来)、敏感的(原始数据的任何微小变化都会使数字摘要发生很大变化)和防冲突的(很难找到两条不同的信息,它们的数字摘要是一样的)。(参考链接:https://en.wikipedia.org/wiki/Hash_function)
比特币中的公钥和私钥:在比特币世界中,根据比特币协议生成的一对公钥和私钥用于确定比特币的所有权。它们是由非对称加密算法(椭圆曲线算法)生成的。公钥通过两次哈希算法(SHA256)得到一个哈希值(也叫hash),然后通过Base58Check编码生成比特币的钱包地址。因此,钱包地址被解码后,就可以得到相应公钥的hash,用来验证私钥签名,加密数据等等。
UTXO:Unspent事务输出,未使用事务的输出。它是比特币世界中的抽象货币。每个UTXO都由一个公钥(钱包地址)锁定,只有持有与公钥对应的私钥的人才能用私钥对UTXO进行签名(解锁)和使用。UTXO可以理解为抽象的纸币,但它的面值不是固定的(不仅是5元、10元,而是任何数字)。(参考链接:https://en.wikipedia.org/wiki/Unspent_transaction_output)
抛开代码,我们来看看比特币交易的流程如下图。有A、B、C、D四个人,他们都有比特币钱包。钱包私钥由自己持有,钱包地址(由其钱包公钥生成)在比特币网络上公开,用于UTXO的锁定和验证。
当初A给C 0.7BTC,比特币网络中的记录是UTXO(1): A给C 0.7BTC给B和C 0.5 BTC,比特币网络中的记录是UTXO(2): B给C 0.5 BTC,此时C的比特币钱包的账户余额是这两个UTXO之和,C的比特币总数=UTXO(1) UTXO(2)=1.2BTC,如下图:
这一天,C从丁那里买了一批货,要付给丁0.8BTC。C通过比特币网络转账给丁,但是C现有的两个utxo都不到0.8BTC,需要两个utxo一起使用,类似现金交易:1.2BTC付给丁,0.4BTC由丁给C。但在比特币网络中,这种改变是C自己发起的。
整个交易过程如下:
通过C比特币钱包准备交易信息。交易信息包括输入和输出两部分。输入是UTXO(1)和UTXO(2),C的钱包私钥签名,(因为UTXO(1)和UTXO(2)都是被C的钱包公钥锁定的,需要用C的私钥签名解锁才能使用。)
交易的输出是未确认UTXO(3): 0.8BTC对于C到D,这个新的UTXO指向D的钱包公钥,交易确认后会被D的钱包公钥锁定。
此时对于C来说还有0.4BTC要换,所以还需要输出一个未确认的UTXO(4): C给C 0.3999BTC,这个新的UTXO指向C的钱包公钥,交易确认后会被C的钱包公钥锁定。
为什么变化量不是0.4BTC?因为比特币网络的要求,交易转账需要向比特币网络支付交易费用。剩余的0.0001BTC不指向任何钱包公钥,将作为转账费用支付给打包本次交易的矿工(如果找不到零钱,剩余的所有未指定比特币将作为费用支付给打包交易的矿工,但目前零钱是由钱包自动完成的,不用担心)。
资料准备好后,C的钱包验证交易合法(UTXO合法,签名有效,输入输出金额有效等)后,),交易被广播到比特币网络。挖掘节点验证交易后,将交易打包(记录在比特币块中)并广播到比特币网络,交易完成。
旧的UTXO被消耗,新的UTXO生效。此时丁钱包里有一个未使用的UTXO(3):丙给丁0.8BTC,丙钱包里有一个未使用的UTXO(4):丙给丙0.3999BTC。
以上是比特币交易的抽象流程。比特币交易结构、签名验证、节点验证、交易广播、加入挖掘节点mempool、矿工构造初步区块、最终区块确认的流程将在后续单独介绍。本文不展开。
从这个抽象的交易过程中可以发现,比特币的交易本质上是一堆UTXOs的输入输出过程。随着旧的UTXOs被消费,新的UTXOs被生产,比特币交易一次又一次完成。交易过程受到非对称加密和哈希算法的双重保护。比特币持有者可以放心地完成交易,不用担心自己的身份被泄露。交易过程中也会消耗一部分比特币,用来奖励打包交易的矿工,让矿工们愉快地完成自己维护比特币网络的任务。