主页 > 怎么下载imtoken苹果版 > 比特币交易数据结构

比特币交易数据结构

怎么下载imtoken苹果版 2023-03-18 05:30:46

了解交易在比特币系统中的运作方式非常重要。可以说,比特币的整个工作流程都是围绕着交易展开的。我们先描述一下比特币的交易流程,对交易有一个宏观的认识。后面我们会讲到事务数据结构以及在程序中是如何定义的。我们先来看看比特币交易流程。

比特币交易流程

比特币交易不是通常意义上的单手交割、单手交割的交易,而是转账。为每次转账构建交易数据会很笨拙。为了使价值易于组合和分割,比特币交易被设计成包含多个输入和输出,即一笔交易可以转移给多个人。从生成到在网络中传播,到工作量证明,整个网络节点的验证,最后到区块链,就是一个区块链交易的整个生命周期。整个区块链交易流程如下图所示:

这里写图片描述

交易生成——构建交易,设置交易的输入输出,并签名确认。交易传播——A向全网广播交易,节点接收到交易验证后广播给其他节点,并将接收到的交易打包成一个区块,等待工作量证明。(对于 B 来说,比特币会立即显示在比特币钱包中,但直到区块确认成功后才可用。目前,一个比特币从支付到最终确认一般经过 6 个区块后才被确认。工作量证明 - 每个节点通过等效于解决数学问题的工作量证明机制获得创建新区块的权力,并以数字货币争取奖励,交易上链。(在此过程中会产生新的比特币) 跨网络的节点验证——当一个节点找到解决方案时,它会将区块广播到整个网络,并由全网络的其他节点进行验证。如果验证通过,则广播到其他节点,然后转到步骤 5。 记录到区块链 - 上一步验证通过后,将新块添加到最长的区块链中。然后继续竞争下一个区块,从而形成一个合法的会计区块链。(每个区块的创建时间约为10分钟。随着全网算力的不断变化,每个区块的生成时间会随着算力的增加而缩短,随着算力的减弱而延长。

比特币难度调整公式(新难度计算公式):NewDifficulty=OldDifficulty×(ActualTimeofLast2016Blocks/20160minutes)New\Difficulty=Old\Difficulty\times(Actual\Time\of\Last\2016\Blocks/20160\minutes)NewDifficulty=OldDifficulty× (ActualTimeofLast2016Blocks/20160minutes)。

至此,您已经了解了一笔交易从创建到写入到区块链的整个过程,下面我们来讨论一下细节。我们先来看一下事务的数据结构。

比特币交易数据结构

比特币交易记录查询_火币网还能交易比特币吗_比特币莱特币量子链等交易

比特币交易是一种具有输入和输出的数据结构。说白了就是要搞清楚交易的钱从哪里来,钱去哪里了。我们来看看源码中交易的字段,主要字段:

/** The basic transaction that is broadcasted on the network and contained in
 * blocks.  A transaction can contain multiple inputs and outputs.  */
class CTransaction
{
public:
    // Default transaction version.
    static const int32_t CURRENT_VERSION=2;
    // Changing the default transaction version requires a two step process: first
    // adapting relay policy by bumping MAX_STANDARD_VERSION, and then later date
    // bumping the default CURRENT_VERSION at which point both CURRENT_VERSION and
    // MAX_STANDARD_VERSION will be equal.
    static const int32_t MAX_STANDARD_VERSION=2;
    // The local variables are made const to prevent unintended modification
    // without updating the cached hash value. However, CTransaction is not
    // actually immutable; deserialization and assignment are implemented,
    // and bypass the constness. This is safe, as they update the entire
    // structure, including the hash.
    const std::vector vin;
    const std::vector vout;
    const int32_t nVersion;
    const uint32_t nLockTime;
private:
    /** Memory only. */
    const uint256 hash;
    const uint256 m_witness_hash;
    uint256 ComputeHash() const;
    uint256 ComputeWitnessHash() const;
public:
// ...... 下面代码这里省略掉了......
    
};

这里是对nLockTime字段的解释,以后学习闪电网络时会用到。

// Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
static const unsigned int LOCKTIME_THRESHOLD = 500000000;

锁定时间定义了可以添加到区块链的最早交易时间。在大多数事务中,它被设置为 0,这意味着立即执行。如果锁定时间大于 0 小于 5 亿,则视为区块高度,在此区块高度之前,该交易不能被纳入区块链。如果锁定时间大于 5 亿,则被视为 UNIX 时间戳(自 1970 年 1 月 1 日起的秒数),在此时间点之前该交易不能被纳入区块链。

协议版本nVersion很好理解,就是为了明确本次交易所引用的规则和协议。

最重要的是交易输入和输出,在分析交易输入和输出之前,我们使用 BitcoinCore 的命令行界面(getrawtransaction 和 decodeawtransaction)来检索“原始”交易,对其进行解码,并查看其中包含的内容。这是交易解码后的样子,结果如下:

您也可以通过区块链浏览器查看该交易(区块高度:277316,交易id:0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2)

比特币交易记录查询_比特币莱特币量子链等交易_火币网还能交易比特币吗

{
  "version": 1,
  "locktime": 0,
  "vin": [
    {
      "txid":"7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",      // 交易ID
      "vout": 0,        // 输出索引(vout),用于标识来自该交易的哪个UTXO被引用(第一个为零)
      "scriptSig": "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",  // 解锁脚本,满足放置在UTXO上的条件,解锁它用于支出
      "sequence": 4294967295    // 序列号
    }
 ],
  "vout": [
    {
      "value": 0.01500000,
      "scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"
    },
    {
      "value": 0.08450000,
      "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
    }
  ]
}

此时,您应该对事务有一个感性的认识。该交易有 1 个输入和 2 个输出。接下来比特币交易记录查询,让我们看一下交易的输入和输出。

交易输入

/** An input of a transaction.  It contains the location of the previous
 * transaction's output that it claims and a signature that matches the
 * output's public key. */
class CTxIn
{
public:
    COutPoint prevout;      // 指向输入中引用的UTXO
    CScript scriptSig;      // 解锁脚本,首先检索引用的UTXO,检查其锁定脚本,然后使用它来构建所需的解锁脚本以满足此要求。
    uint32_t nSequence;     // 序列号
    CScriptWitness scriptWitness; //!< Only serialized through CTransaction    ,见证脚本
//.......省略下面部分代码.............
};
/** An outpoint - a combination of a transaction hash and an index n into its vout */
class COutPoint
{
public:
    uint256 hash;   // 交易ID
    uint32_t n;     // 输出索引,表明是交易中的第几个输出
// ......省略下面部分代码......
};

如您所见,交易输入是之前交易的输出。您需要构建一个解锁脚本来证明您对输出的所有权,然后您可以花费输出。

交易输出

/** An output of a transaction.  It contains the public key that the next input
 * must be able to sign with to claim it.
 */
class CTxOut
{
public:
    CAmount nValue;             // 输出金额
    CScript scriptPubKey;       // 锁定脚本(脚本公钥) ,对于一个比特币交易来说,交易本身是不用关心输出的地址,交易只需要关心锁定脚本,当使用的时候能使用正确的解锁脚本即可动用比特币。
// ......省略下面部分代码......
};

输出比较简单,就是指定转账金额,输出给谁,建一个锁脚本,只有转账接收方才能解锁成功。拥有输出量。

比特币交易记录查询_比特币莱特币量子链等交易_火币网还能交易比特币吗

手续费

如您所见,交易数据结构没有交易费用字段。相反,交易费用是指输入和输出之间的差异。从所有输入中减去所有输出后的超额金额由矿工收取作为交易费用:

交易费即输入总和减输出总和的余量:交易费 = 求和(所有输入) - 求和(所有输出)

交易费用最直接的影响与正在处理的交易的优先级有关。交易手续费高的交易会先被矿工打包处理,并在短时间内在链上进行验证,交易手续费低的交易会最后处理。. 同时,交易费用的设置使得在比特币网络上发送交易的成本很高,避免了大量可能的无用交易。

查询交易

每笔比特币交易都可以通过区块链浏览器查询。比特币区块链浏览器有很多,这里用来查询。

比特币交易脚本和脚本语言

脚本是区块链上实现合约自动验证和自动执行的重要技术。脚本就像一组规则,用于管理接收者如何使用锁定在此输出上的资产。交易和合法性验证也依赖于脚本。让我们看一下比特币交易中的锁定脚本和解锁脚本。

比特币交易记录查询_火币网还能交易比特币吗_比特币莱特币量子链等交易

锁定脚本和解锁脚本

锁定脚本是添加到输出交易的条件,通过脚本语言实现,位于交易的输出端。只有满足锁定脚本要求的条件,解锁脚本才能在脚本上花费对应的资产,该脚本位于交易的输入端。脚本通过类似于编程领域的“虚拟机”进行解释,分布式运行在区块链网络中的每个节点上。

每个比特币验证器都将通过执行锁定和解锁脚本来验证交易。每个输入都包含一个解锁脚本并引用一个预先存在的 UTXO。验证软件将复制解锁脚本,检索输入引用的 UTXO,并从该 UTXO 复制锁定脚本。然后依次执行解锁和锁定脚本。如果解锁脚本满足锁定脚本条件,则输入有效。作为交易整体验证的一部分,所有输入都经过独立验证。

下图是最常见的比特币交易类型(P2PKH:支付到公钥哈希)的解锁和锁定脚本示例,显示了在脚本验证之前由解锁和锁定脚本串联产生的组合脚本:

image

比特币的脚本语言被称为基于堆栈的语言,因为它使用一种称为堆栈的数据结构。脚本语言通过从左到右处理每个项目来执行脚本。数字(数据常量)被压入堆栈。操作码(操作员)从堆栈中压入或弹出一个或多个参数,对它们进行操作,并可能将结果压入堆栈。

分别执行解锁和锁定脚本

在比特币客户端的原始版本中,解锁和锁定脚本存在于链中并按顺序执行。出于安全考虑,比特币开发者修改了这个功能,因为存在“允许异常解锁脚本将数据推送到堆栈并污染锁定脚本”的漏洞。在当前方案中比特币交易记录查询,两个脚本在堆栈通过时分别执行。

比特币交易记录查询_比特币莱特币量子链等交易_火币网还能交易比特币吗

首先,使用堆栈执行引擎执行解锁脚本。如果解锁脚本执行没有错误(例如:没有“悬空”操作码),则复制主堆栈(而不是备用堆栈),并执行锁定脚本。如果使用从解锁脚本复制的堆栈数据执行锁定脚本的结果为“TRUE”,则解锁脚本已成功满足锁定脚本设置的条件,因此输入是使用UTXO的有效授权。如果合并脚本后的结果不是“TRUE”,则输入无效,因为它不符合UTXO中设置的使用资金的条件。

以下是最常见的比特币交易类型(P2PKH:支付到公钥哈希)的解锁和锁定脚本示例(见上图),以说明执行过程。

image

image

Coinbase 交易

以上都是正常情况下的交易,除了一个例外,就是有一个特殊的交易叫做“Coinbase Transaction”,它是每个区块的第一笔交易,这个交易存在的原因是作为挖矿的奖励,创造全新的可消费比特币支付给“赢家”矿工。

扩展思维

为什么比特币交易采用这种输入输出结构设计,与以太坊等区块链的结构不同。我的理解是回到比特币设计的初衷。比特币是一种去中心化的点对点电子支付系统。该系统去中心化实施的最大问题是如何解决双花问题。当然,如何解决双花问题并不能仅仅通过设计一个交易数据结构来解决,还需要结合 Pow 共识算法和整个比特币区块链实现流程。设计这种数据结构的最大好处之一就是每一笔交易的比特币都是可追溯的,你甚至可以追溯到它的诞生,挖矿奖励。因为每笔交易(花费的比特币)都是可追溯的,作弊者无法无中生有地构建比特币,也无法构建合法的未使用交易输出。每笔交易都通过广播广播到所有比特币节点。

如果你没看懂也没关系,因为仅仅掌握比特币交易数据结构是不够的,它只是比特币区块链系统设计的一部分。另外,欢迎搜索关注微信公众号:一日思考,获取更多领域区块链相关技术分享。