比特币交易实际上如何运作?

无论您是想成为区块链应用程序的开发人员,还是只是想了解将比特币发送给朋友时幕后发生的事情,最好能了解如何创建和广播比特币时会发生什么情况交易到比特币网络。为什么?

因为交易是在其上构建比特币区块链的基本实体。事务是密码术,数据结构和简单的非图灵完备的脚本完美碰撞的结果。它们足够简单,以至于常见的交易类型不会过于复杂,但是足够灵活,以允许开发人员也可以对相当定制的交易类型进行编码。今天我们将参观前者.

作为开发人员,您的比特币客户如何将新交易发布到网络上(以及收到新交易后会发生什么)?

当您向朋友发送比特币时,到底发生了什么?

这篇文章将假定读者对散列,非对称密码学和P2P网络有基本的了解。即使您不熟悉任何特定的机制,也要对区块链的确切含义有个很好的认识,这也是一个好主意.

比特币交易及其在更大范围内的作用

比特币由几个主要部分组成:节点和区块链。典型节点的作用是维护自己的区块链版本,并在听到“更好”(更长)版本后对其进行更新。简而言之,区块链有区块,区块有交易.

考虑到这种简化但准确的情况,您可能想知道从中进行的交易到底是什么.

  • 了解交易将如何帮助我成为更好的区块链开发人员?
  • 交易如何让我将一些比特币转移给朋友?

事实证明,这些问题的答案因许多因素而异。即使假设我们只是在谈论比特币,我们也可以通过多种创新方式使用交易来实现各种个性化目标。让我们从头开始,即让我们看一下一种很好的老式的按付款方式对PK哈希交易类型。毕竟,此类交易占该交易中所有交易的99%以上 比特币区块链.

首先,让我们建立一个心理模型。将比特币视为基于帐户的系统是很诱人的。毕竟,当我将比特币发送给某人时,该人收到了钱,剩下的余额就给了我。但是,在现实世界中,事物的表示方式有所不同。一般来说,当我汇款给某人时,我就是在花光所有的钱(减去交易费用)。如果存在余额,其中一些钱将被花回到我自己的个人帐户中。关键是所有的钱每一次都会移动. 您可以跳至第3.1节 解释为什么该模型更可取.

考虑到这一点,我们可以概括地说一个比特币交易具有一些输入和输出。图形表示可能看起来像这样:

比特币交易实际上如何运作?

当我第一次看到它时,这有点让我感到困惑,所以我将详细说明。当我发布交易时,实际上是在“声明”输出,并证明我有权在该输出上花费金额。因此,如果我是Bob,并且想支付Alice的款项,这些证明就是我已经获得一定金额的证明(尽管这可能只是我总余额的一部分),并且输出将与Alice的帐户相对应。在这种简单情况下,将只有一个输入和一个输出.

更深入地了解比特币交易

让我们了解真正的比特币交易的机制。我们将使用上面的图片作为参考.

如果要进行典型的比特币交易,最终将需要三个主要部分:标头,输入和输出。让我们简要看看这些部分中对我们有用的字段,因为它们对于讨论很重要。请注意,这些是所谓的原始事务中的字段。创建交易时在同级之间广播原始交易.

标题

  • 杂凑:整个交易的哈希值。比特币通常使用散列值既是指针又是检查数据完整性的手段。我们将在下一部分中对此进行详细介绍.
  • 版本:用于验证此块的版本号。最新版本是在软分叉中引入的,该分叉于2015年12月启用.
  • vin_sz:此事务的输入数量。同样,vout_sz计算输出数量.
  • 锁定时间:我们将在以后的文章中对此进行详细介绍,但这基本上描述了最早可以将区块添加到区块链的时间。它是块的高度或unix时间戳.

输入

  • 以前的输出哈希:这是指向以前未使用的事务输出(UTXO)的哈希指针。本质上,这是您将要在此次交易中花费的属于您的钱.
  • n:上一个交易的输出列表的索引。这是您实际花费的支出.
  • scriptSig:这是一个支出脚本,证明该交易的创建者有权支出1和2引用的资金。.

输出

  • 价值:中本聪的消费金额(1 BTC = 100,000,000中本聪).
  • scriptPubKey:比特币交易中提供的两个脚本中的第二个,指向收件人的哈希公钥。本文最后一部分将对此进行更多介绍.

交易验证

比特币节点的工作之一是验证传入交易的正确性(数据未被篡改,金钱未被创建,仅预期的接收者花费了UTXO等)。可以在网上找到更详尽的列表,但是我将在此处列出一些重要的列表:

  • 此事务的输入所声明的所有输出都位于UTXO池中。未使用的输出只能声明一次.
  • 每个输入上的签名均有效。更准确地说,我们说的是组合的脚本一个接一个地执行后返回true。在上一节中对此有更多的了解.
  • 此交易不会花费一次以上的UTXO。请注意,这与第一项有何不同.
  • 交易的所有输出值均为非负.
  • 此交易的输入值之和大于其输出值之和。请注意,如果数字不同,则差额被视为矿工可以要求的交易费.

基本的支付到PK哈希交易

比特币拥有自己的自定义(类似于Forth)脚本语言,其功能强大到足以允许开发人员创建复杂的和自定义类型的交易。标准比特币客户接受五种左右的标准交易类型[5],但是,存在其他客户将收费接受其他类型的交易。我们将在这里介绍付费PK哈希机制.

为了使任何事务有效,组合的scriptSig / scriptPubKey对必须评估为true。更具体地说,交易支出者提供了一个scriptSig,该脚本将被执行,然后跟在声明的交易输出的scriptPubKey之后(还记得我们所说的输入如何声明先前未使用的交易输出吗?)。两个脚本共享相同的堆栈.

为了提高效率,让我们使用(官方比特币Wiki)作为我们讨论的参考。当您访问链接时,大约走到一半以找到包含7行的表。下表显示了脚本的组合方式,执行方式以及每个步骤的堆栈外观.

需要注意的一件事是,因为比特币地址实际上是哈希值(嗯,它变得更加复杂了). 看到 ),发送者无法知道实际的公钥来对照私钥。因此,赎回者同时指定了公共密钥和私有密钥,并且scriptPubKey将复制并散列公共密钥以确保赎回者确实是预期的接收者.

在执行期间,您会看到常量在遇到常量时会直接放置在堆栈上。在评估项目时,操作会从堆栈中添加或删除项目。例如,OP_HASH160将从堆栈中取出最上面的项目,并将其两次,首先是SHA-256,然后是RIPEMD-160。评估完脚本中的所有项目后,如果堆栈中仍为true,则整个脚本的评估结果为true,否则为false.

总而言之,按PK哈希支付是一种非常简单的交易类型。它确保只有具有适当公钥/私钥对的赎回者才能申领并随后花费比特币。假设满足所有其他条件(请参阅上一节),那么该事务是一个很好的事务,可以将其放入一个块中.

在以后的文章中,我将细分更复杂的交易类型。我们将看到有两个以上的参与者可以参与交易,并且将看到如何实现运行时间更长的交易类型.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me