深入浅出:从一笔比特币交易的生命周期看懂区块链技术(上)

放下焦虑,不断增值

动动手指,关注我们

关注

基本常识:

区块链不等于比特币,区块链只是比特币系统用来记录交易信息的账簿;

比特币没有账户余额的概念,所有的交易只记录资金的来源和去向,所谓账户余额是区块链中计算出来的结果;

挖矿奖励是为了维护整个系统鼓励人们利用自己设备的算力资源来共同验证每笔交易的有效性而给予的奖励;

交易的完整过程:从创建新交易到新区块产生

假设一笔比特币交易A一旦被创建,它的生命周期就开始了。随后,交易A会被一个或者多个签名加密(这些签名用来说明交易 A 的资金流向是被资金的拥有者所许可的)。而后,交易A被广播到比特币网络中,最快收到广播信息的是相邻的2-3个节点,这些节点都会参与验证这笔交易,于此同时将交易在网络中再次进行广播,直到这笔交易A被网络中大多数节点(所有下载比特币客户端的设备都有可能成为这样的节点)接收。

最终,交易A被一个正在参与挖矿的节点验证,交易A连同其它一些近期被创建的交易一起被打包到一个区块B中,并被添加到区块链上,这时整个区块链就被延长并新增了一个区块B。区块B获得6次以上的“确认”时就被认为是不可撤销的,因为要撤销和重建六个区块需要巨量的计算,交易被打包在一起放进区块中时需要极大的计算量来证明,但只需少量计算就能验证它们已被证明。

我们将上面的交易过程描述简单细分为以下6个步骤:

产生新交易

签名加密

交易在比特币网络中传播

整合交易&构建新区块

挖矿

新区块连接到区块链

接下来,我们将详细分析6个交易步骤中的具体细节和所采用到的底层技术,在解释每个步骤和具体的概念时,我都将举出适当的例子来帮助理解,如果依然没有读懂,那肯定是你看的太快了……

01 产生新交易

当隔壁老王想要将自己钱包中的一个比特币转账给老张时,这个交易就被老王的钱包所构建了。

将一笔比特币交易理解成纸质支票有助于我们的理解,一笔比特币交易是一个有着货币转移目的工具,如同当收款人或持票人拿着支票到银行时,银行会无条件支付其规定数量的金额。并且交易发起人并不一定是签署该笔交易的人。

比特币交易可以被任何人在线上或线下创建,即便创建这笔交易的人不是这个账户的授权签字人。就像一家企业中秘书开出的这张支票(发起交易),需要等待Boss签署该笔交易(数字签名)。

有以下4个概念需要展开理解,用以更加深入地理解“新交易构建”的一些细节:

UTXO

交易输出

交易输入

交易费

UTXO

UTXO易于理解的说就像是账户的余额。它是比特币交易的基本单位,是未经使用的一个交易输出,Unspent Transaction Output,简称UTXO,“未花费的交易输出”。UTXO不能再分割,1个UTXO可以是1“聪”的任意倍,就像美元可以被分割成“美分”一样,“分”就不可以再分割了。UTXO被记录于区块链中,比特币网络监测着以百万为单位的所有可用的UTXO。

假设隔壁老王此时拥有1.9比特币,当隔壁老王接收到0.1比特币时,这个金额被当作UTXO记录到区块链里,现在老王一共拥有的2比特币,同样都被当作UTXO分散到数百个交易和数百个区块中。实际上,并不存在一个储存比特币的地址或账户余额的地方,只有被老王(所有者)锁住的、分散的UTXO。

因此,“隔壁老王的比特币余额”这个概念,是通过扫描区块链并聚合所有属于该用户的UTXO来计算该用户的余额。

交易的输出

一笔比特币交易是一个含有输入值和输出值的数据结构,其中包含了将一笔资金从初始地址(输入)转移至目标地址(输出)的代码信息:版本规则、输入&其数量、输出&其数量、时间戳。

每一笔比特币交易创造输出,输出都会被比特币账簿记录下来。所有的输出都能创造一定数量的可用于支付的比特币(也就是UTXO)。这些UTXO会被整个网络所识别记录,其所有者可在未来的交易中使用它们。给隔壁老王发送比特币实际上是创造新的UTXO,并且能被他用于新的支付。

交易的输入

交易输入是指向UTXO的指针,当用户付款时,他的钱包通过选择可用的UTXO来构造一笔交易。

例如:隔壁老王想要支付0.015比特币,他的钱包应用会选择一个0.01UTXO和一个0.005UTXO,使用它们加在一起来得到想要的付款金额。

交易费

大多数交易包含交易费,这是为了在网络安全方面给比特币矿工一种补偿。大多数钱包自动计算并计入交易费,交易费被挖出这个区块的矿工得到,并且记录在这个交易的区块链中。交易的数据结构没有交易费的字段,意味着你无法从交易信息中直接看到交易费的金额。

例如:隔壁老王想要消费支付0.015比特币,为了自己的交易被矿工优先处理,他愿意支付0.001比特币作为交易费,那么老王的钱包至少需要从区块链记录中整合至少0.016比特币的UTXO。假设他的钱包有一个0.2比特币的UTXO可用,那么这笔新的交易就会产生一个0.2比特币的输入,和两个输出:一个是0.015比特币的消费金额被支付给目标地址,另一个0.184比特币的输出作为找零支付给老王的钱包地址,其中有0.001比特币未分配,就是“隐藏的”交易费用。

值得说明的是:一定要定义清楚0.184比特币是一个指向老王自己钱包的输出,这样找零才会有效“退回”给老王的钱包,否则0.184比特币也都将成为交易费,被矿工挖到这份惊喜的“红包”。

02 签名加密

一笔比特币交易一旦被创建,它就会被资金所有者(可能存在多位所有者)签名。如果它是合法创建并签名的,则该笔交易现在就是有效的。它包含资金转移时所需要的所有信息。用户的私钥用于生成支付比特币所必需的签名,来证明资金的所有权,这样的签名加密是为了确保交易内容不被篡改。这和前面介绍的纸质支票的授权签字效果相同。

网络中节点收到交易信息后,会对交易的合法性进行检查,资金所有者的签名加密是重要的验证依据,检查都通过后,则将交易标记为合法的未确认交易,才会在网络中进行广播。

有以下4个概念需要展开理解,用以更加深入的理解“签名加密”的一些细节:

私钥

公钥

钱包

交易脚本

私钥

一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。私钥是一个数字,通常是随机产生的。一个比特币地址中的所有资金的控制取决于相应私钥的所有权和控制权。私钥必须保密,因为一旦被泄露,相当于该私钥保护下比特币也就丢失了。

通过在一个密码学安全的随机源中取出一串随机字节,对其使用SHA256哈希算法进行运算,生成了一个256位的数字,这样的一个数字就可以作为私钥。以十六进制格式表示一个随机生成的私钥,即:1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

公钥

通过椭圆曲线算法可以从私钥计算得到公钥,这是不可逆转的过程。由公钥经过单向的加密哈希算法生成的比特币地址以数字“1”开头,在交易中比特币地址就是收款人的地址。

钱包

比特币钱包是私钥的容器,钱包只包含私钥而不是比特币,每一个用户有一个包含多个私钥的钱包。钱包中包含成对的私钥和公钥,用户用这些私钥来签名交易。

其中一种常见且典型的钱包就是使用“助记码词汇”做为种子,而生成私钥的钱包。这样的单词的序列可以重新创建种子,并重新创造钱包以及所有私钥。在首次创建钱包时,带有助记码的钱包应用程序将会向使用者生成一个12至24个单词,单词的顺序就是钱包的备份。

交易脚本

交易脚本是检验交易是否合法的核心机制。一般每个交易都会包括两个脚本:输出脚本,scriptPubKey和输入脚本,scriptSig。

输出脚本一般由付款方对交易设置锁定,用来对收款方进行权限控制,例如限制必须是某个公钥(比特币地址)的拥有者才能花费这笔交易。

输入脚本(签名脚本)常常含有一个被用户的私钥生成的数字签名,用来证明自己可以满足交易输出脚本的锁定条件,即对某笔交易中比特币资金的拥有权。

值得注意的是:比特币交易的输入和输出并非只是简单对应了付款人的私钥和收款人的公钥地址,而是还包含了更多的内容,通过脚本可以直接验证交易的有效性,并且实现了更多复杂的交易方式,比如“多重签名脚本”,保证只有自己和第三方钱包共同签名后才可动用输出,这样保证了黑客在攻击了第三方钱包后也无法花掉用户的比特币。

未完待续...

来源:人人都是产品经理

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180329A1AV5L00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券