一个完整的比特币交易流程是怎么样的?
本文解释了比特币交易的内容,目的和结果。下面的解释适用于新手和中级比特币用户。
作为加密货币用户,你需要熟悉交易雏形——为了你对这种不断发展的创新有信心,以及作为理解新兴多签名交易和合约的基础,这两者都将在本系列的后期进行探讨。这不是纯技术文章,解释将集中在你需要了解的标准比特币交易——我们通常做的支出交易——并且我们将掩盖你可以安全忽略的内容。
本文底部的信息图提供了从钱包到区块链的整个比特币交易流程的全面说明。
注意:即使是核心开发人员也承认,用于描述交易及其组件的某些语言可能导致人们误解了实际发生的事情。在下面的解释中避免了这些误解。因此,在尝试尽可能简单的描述的同时,借助一些图表,让我们直接开始。
术语和缩写的定义
- Bitcoin:具有大写
B
的比特币指的是协议——代码,节点,网络及其对等交互。 - bitcoin:用小写字母
b
表示货币——我们通过比特币网络发送和接收的加密货币。 - tx:在文本中使用的任何地方——是比特币交易
‘Bitcoin transaction
的缩写。 - txid:是
transaction id
的缩写——这是人和协议引用交易的哈希。 - Script:是比特币协议的脚本系统的名称,用于处理和验证交易——脚本是一个聪明的,基于堆栈的指令引擎,它使得从简单支付到复杂的oracle监督合约的所有交易成为可能。
- UTXO:
Unspent Transaction Output
的缩写,也称为“输出”。 - satoshi:1 BTC = 100,000,000 satoshi
什么是比特币交易?为什么?
1.定义
比特币交易是一个经过签名的数据,它被广播到网络上,如果有效,最终会进入区块链的一个区块。
2.目的
比特币交易的目的是将一定数量的比特币的所有权转移到比特币地址。
3.结果
当你发送比特币时,你的钱包客户端会创建一个单一的数据结构,即比特币交易,然后广播到网络。网络上的比特币节点将中继和重新广播交易,如果交易有效,节点将把它包含在他们正在挖掘的块中。通常,在10-20分钟内,交易将与区块链中的一个区块中的其他交易一起被包括在内。此时接收者能够看到他们钱包中的交易金额。
4.例子
以下是今年早些时候区块链中包含的示例交易:
image此标准交易的主要组成部分采用颜色编码:
- 交易ID(以黄色突出显示)
- 描述符和元数据(蓝色花括号在右边详细说明)
- 输入(粉色区域)
- 输出(绿色区域)
比特币交易输入和输出
首先,关于交易的四个公理:
- 我们发送的任何比特币金额总是发送到一个地址。
- 我们收到的任何比特币金额都被锁定在接收地址——这通常与我们的钱包相关联。
- 每当我们花费比特币时,我们花费的金额将始终来自之前收到的并且目前存在于我们钱包中的资金。
- 地址接收比特币,但他们不发送比特币——比特币是从钱包发送的。
进入我们钱包的金额并不像实体钱包中的硬币那样混乱。收到的金额不会混合,但保持独立且与钱包收到的确切金额不同。这是一个例子:
示例:
你创建一个全新的钱包,并及时收到三个0.01,0.2和3BTC的金额,如下所示:你将3BTC发送到与钱包相关联的地址,并由Alice向另一个地址付款。
image钱包报告的余额为3.21BTC,但如果你真的看钱包里面,你会看到——不是321,000,000 satoshi(321 mil satoshi),但是三个不同的数量仍然由他们的原始交易组合在一起:0.01,0.2和3BTC。
image收到的比特币金额不会混合,但保持分开,作为发送到钱包的确切金额。上例中的三个金额称为其原始交易的输出。
比特币钱包始终保持输出分离和独特。
输出output
是(通过标准交易)发送到比特币地址的金额,以及解锁输出金额的一组规则。在比特币用语中,输出称为“未使用的交易输出”或UTXO
。
可以使用与接收地址相关联的私钥解锁标准交易输出。地址及其相关的公钥/私钥对将在本系列的后面部分介绍。目前,我们只关注总数。
示例:
让我们考虑一个例子,在你向Bob发送0.15BTC的情况下跟踪钱。
正如我们所看到的,你的钱包没有选择15mil miloshi(0.15 BTC)来自一个无差别的321 mil satoshi组成钱包余额。相反,钱包从钱包中包含的三个现有输出outputs
中选择一个支出候选者。因此,它选择(由于各种原因,现在不重要)0.2BTC输出。钱包将解锁0.2 BTC输出并使用全部0.2BTC作为新的0.15 BTC交易的输入input
。0.2BTC输出在此过程中花费spent
。
你的钱包创建的花费交易将向Bob的地址发送0.15BTC——它将作为输出存放在他的钱包中——等待最终花费。
0.05BTC差额(0.2 BTC输入减去0.15 BTC输出)称为改变change
,交易将通过新创建的地址将其发送回你的钱包。0.05 BTC改变的金额将作为新输出存放在你的钱包中——等待最终花费。所以,现在你钱包里会显示以下内容:
“等待花费”的三个输出中的每一个被锁定到其接收地址,直到选择它们中的一个或多个作为新花费交易的输入为止。
在后台,当选择UTXO
作为新交易的输入时,不同的钱包客户端应用不同的逻辑规则。一个理智的钱包策略是尽可能先使用旧的UTXO
,但实现方式不同。我们现在并不关注选择UTXO
的方式,因为我们的目标一直是强调我们的钱包收到的金额是分开的和不同的。
比特币交易如何完成的总结
各种收到的金额不会像在实体钱包中那样混合。相反,在我们花费比特币时,收到的金额(UTXO)被单独使用(或组合使用)。在创建支出交易时,我们的钱包选择UTXO(具有足够的价值以满足我们想要发送的金额)并且通常创建两个新输出:一个用于接收器,一个用于我们收到的更改到钱包。更改成为我们钱包中的全新UTXO,我们发送的金额成为锁定到收件人地址的UTXO——可能与钱包相关联,也可能不与钱包相关联,例如冷存储。用作支出交易的输入的原始UTXO将“花费”并永久销毁。
这是钱包软件如何处理输出(UTXO)的介绍。一旦选择了UTXO用于支出,它就需要与接收它的地址相关联的私钥。此私钥兑换UTXO并允许它成为新支出交易中的输入。以前的交易输出被重新用作新交易的输入的机制是比特币协议功能的核心——完全符合Satoshi的设计。
建议你浏览我们汇智网的各种编程语言的区块链教程和区块链技术博客,深入了解区块链,比特币,加密货币,以太坊,和智能合约。
- java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
- php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
- php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
- java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
- 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
- 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
- python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
- C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
- EOS入门教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
汇智网原创翻译,转载请标明出处。这里是原文