精通比特币(五)交易

目录

比特币交易的生命周期

创建比特币交易

将比特币交易传送至比特币网络

比特币交易在比特币网络中的传播

交易结构

交易的输出和输入

交易输出

支付条件(障碍)

交易输入

交易费

把交易费加到交易中

交易链条和孤立交易


 

 

比特币交易的本质是数据结构,这些数据结构中俺有比特币交易参与者价值转移的相关信息。

比特币区块链是全球复式记账总账簿,每个比特币交易都是在比特币区块链上的一个公开记录。

比特币交易的生命周期

一笔比特币交易的生命周期起始于它被创建的那一刻,也就是诞生(origination)。随后,比特币交易会被一个或多个签名加密,这些签名标志着对该交易指向的比特币资金的使用许可。接下来,比特币交易被广播到比特币网络汇总。在比特币网络中,每一个节点(比特币交易参与者)验证、并将交易在网络中进行广播,直到这笔交易被网络总大多数节点接收。最终,比特币交易被一个挖矿节点验证,并被添加到区块链上一个记录着许多比特币交易的区块中。

创建比特币交易

一笔比特币交易其实是一个有着货币转移目的的工具,而且交易发起人并不一定是签署该笔交易的人。

比特币交易可以被任何人在线上或线下创建,即便创建这笔交易的人不是这个账户的授权签字人。比如,一个负责应付账款的柜员在处理应付票据时可能会需要CEO签名。相似的,这个负责应付账款的柜员可以创建比特币交易,然后让CEO对它进行数字签名,从而使之有效。一张支票是指定一个特定账户作为资金来源的,但是比特币交易指定以往的一笔交易作为其资金来源,而不是一个特定账户。

一但一笔比特币交易被创建,它会被资金所有者们签名。如果它是合法创建并签名的,则该笔交易现在就是有效的,它包含了转移这笔资金所需要的所有信息。最终,有效的比特币交易必须能介入比特币网络,从而使之能被传送,直至抵达下一个登记在公共总账簿(区块链)的挖矿节点。

将比特币交易传送至比特币网络

一笔交易需要传递至比特币网络,才能被传播,也才能加入区块链中。

本质上,一笔比特币交易只是300-400字节的数据,而且它们必须发送到成千上万个比特币节点中的任意一个。

只要发送者能使用多于一个比特币节点来确保这笔交易被传播,那么发送者并不需要信任用来传播该笔交易的单一节点。相应的,这些节点不需要信任发送者,也不用建立发送者的“身份档案”。

由于这笔交易是经过签名且不含任何机密信息、私钥或密钥,因此他可以被任何潜在的便利网络公开地传播。

信用卡交易包含敏感信息,而且依赖加密网络连接完成信息传输,但比特币交易可在任意网络环境下被发送。

只要这笔交易可以到达将它广播到比特币网络的比特币节点,这笔交易是如何被传输至第一个节点的并不重要。

比特币交易因此可以通过未加密网络(Wifi、蓝牙、NFC、ChirP、条形码或者复制黏贴至一个网页表格)被发送到比特币网络。极端情况下,一笔比特币交易可以通过封包无线电、卫星或短波、扩频或跳频以避免被侦测或阻塞通信的方式进行传输。一笔比特币交易甚至可被编为文字信息中的表情符号并被发表到在线论坛,或被发送成一条短信或一条Skype聊天信息。因为比特币将金钱编程一种数据结构,所以在本质上是不可能阻止任何人创建并执行比特币交易的。

比特币交易在比特币网络中的传播

一旦一笔比特币交易被发送到任意一个连接比特币网络的节点,这笔交易将会被该节点验证。

如果交易被验证有效,该节点会将这笔交易传播到这个节点所连接的其他节点,同时,交易发起者会收到一条表示交易成功的返回信息。

如果这笔交易被验证无效,这个节点会拒绝接受这笔交易且同时返回给交易发起者一条表示交易被拒绝的信息。

比特币网络是一个点对点网络,这意味着每一个比特币节点都连接到一些其他的比特币节点(这些其他的节点时在启动点对点协议时被发现的)。整个比特币网络形成了一个松散的连接、且没有固定拓扑或任何结构的“蛛网”---这使得所有节点的地址都是同等的。比特币交易相关信息(包括交易和区块)被传播---从每一个节点到它连接的其他节点。一笔刚通过验证且被传递到比特币网络中任意节点的交易会被发送到三到四个相邻节点,而每一个相邻节点又会将交易发送到三至四个与它们相邻的节点。以此类推,几秒后,一笔有效的交易就会像指数级扩散的波一样在网络中传播,知道所有连接到网络的节点都接收到它。

比特币网络被设计为能高效且灵活地传递交易和区块至所有节点的模式,因而比特币网络能抵御入侵。为了抵御垃圾信息滥发、拒绝服务攻击或其他针对比特币系统的恶意攻击,每一个节点在传播每一笔交易之前均进行独立验证。一个异常交易所能到达的节点不会超过一个。

交易结构

一笔比特币交易是一个含有输入值和输出值得数据结构,该数据结构植入了将一笔资金从初始点(输入值)转移至目标地址(输出值)的代码信息。比特币交易的输入值和输出值与账号或者身份信息无关。应该将它们理解成一种被特定秘密信息锁定的一定数量的比特币。只有拥有或知晓这个秘密信息的人可以解锁。一笔比特币交易包含一些字段:

交易的时间锁定:锁定时间定义了能被加到区块链里的最早的交易时间。在大多数交易里,它被设置成0,用来表示立即执行。如果锁定时间不是0并且小于5亿。就被视为区块高度,意指这个指定的区块高度之前的交易没有被包含在这个区块链里。如果锁定时间大于5亿,则它被当做是一个Unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时间之前的交易没有被包含在这个区块链里。锁定时间的使用相当于将一张纸质支票的生效时间予以后延。

交易的输出和输入

比特币交易的基本单位是未经过使用的一个交易输出,简称UXTO。

UXTO不是不能再分割、被所有者锁住或记录与区块链中的并被整个网络识别成货币单位的一定量的比特币货币。

比特币网络监测着以百万为单位的所有可能的(未花费的)UTXO。当一个用户接收比特币时,金额被当做UTXO记录到区块链里。

这样,一个用户的比特币会被当做UTXO分散到数百个交易和数百个区块中。实际上,并不存在储存比特币地址或账户余额的地点,只有被所有者锁住的、分散的UTXO。

“一个用户的比特币余额”,这个概念是一个通过比特币钱包应用创建的派生之物。比特币钱包通过扫描区块链并聚合所有属于该用户的UTXO来计算该用户的余额。

在比特币的世界里既没有账户、也没有余额,只有分散到区块链里的UTXO。

一个UTXO可以是一“聪”的任意倍。就像美元可以被分割成表示两位小数的“分”一样,比特币可以被分割成表示八位数小数的“聪”。尽管UTXO可以是任意值,但只要它被创造出来了,就像不能被切成两半的硬币一样不可再分了。如果一个UTXO比一笔交易所需量大,它仍然会被当做整体而消耗掉,但同时会在交易中生成零头。例如,有20个比特币的UTXO并且向支付1比特币,那么你的交易必须消耗掉整个20比特币的UTXO并且产生两个输出:一个是支付了比特币给接收人,另一个是支付19比特币的找零到你的钱包。这样,大部分比特币交易都会产生找零。

被交易消耗的UTXO被称为交易输入,由交易创建的UTXO被称为交易输出。通过这种方式,一定量的比特币价值在不同所有者之间转移,并在交易链中消耗和创建UTXO。一笔比特币交易通过使用所有者的签名来解锁UTXO,并通过使用新的所有者的比特币地址来锁定并创建UTXO。

对于输出和输入链来说,有一个例外,它是一种特殊的交易类型,称为Coinbase交易。这时每个区块中的首个交易。这种交易存在的原因是作为对挖矿的奖励而产生全新的可用于支付的比特币给“赢家”矿工。这就是为什么比特币可以在挖矿过程中被创造出来。

先有输入还是先有输出呢?先产生输出,因为可以创造新比特币的coinbase交易没有输入,但它可以无中生有地产生输出。

交易输出

每一笔比特币交易创造输出,输出都被比特币账簿记录下来。除了特例之外(数据输出(OP_RETURN操作符)),几乎所有的输出都能创造一定数量的可用于支付的比特币,也就是UXTO。

这些UTXO被整个网络识别,并且所有这可在未来的交易中使用它们。给某人发送比特币实际上就是创造新的UTXO,注册到那个人的地址,并且能被用于新的支付。

UXTO被每一个全节点比特币客户端在一个储存于内存中的数据库所追踪,该数据库也被称为“UTXO集”或者“UTXO池”。新的交易从UTXO集中消耗(支付)一个或多个输出。

交易输出包含两部分:

  • 一定量的比特币,被命名为“聪”,是最小的比特币单位;
  • 一个锁定脚本,也被当做是“障碍”,提出支付输出所必须被满足的条件以“锁住”这笔总额。

支付条件(障碍)

交易输出把用聪表示的一定数量的比特币,和特定的定义了支付输出所必须被满足的条件的障碍,或者叫锁定脚本,关联到一起。大多数情况下,锁定脚本会把输出锁在一个特定的比特币地址,从而把一定数量的比特币的所有权转移到新的所有者上。

当Alice在Bob的咖啡店为一杯咖啡付款时,Alice的交易创造了0.015比特币的输出,在咖啡店的比特币地址上成为一种障碍,或者说是被锁在了咖啡店的比特币地址上。那0.015比特币输出被记录到区块链中,并且成为UTXO的一部分,也就是作为可用余额出现在Bob的钱包里。当Bob选择使用这笔款项进行支付时,他的交易会释放障碍,通过提供一个包含Bob私钥的解锁脚本来解锁输出。

交易输入

交易输入是指向UTXO的指针。它们指向特定的UTXO,并被交易哈希在区块链中记录UTXO的序列号作为参考。弱项支付UTXO,一个交易的输入也需要包含一个解锁脚本,用来满足UTXO的支付条件。解锁脚本通常是一个签名,用来证明对于在锁定脚本中的比特币地址拥有所有权。

当用户付款时,他的钱包通过选择可用的UTXO来构造一笔交易。比如说,要支付0.015比特币,钱包应用会选择一个0.01 UTXO和一个0.005UTXO,使用它们加在一起来得到想要的付款额。

一旦UTXO被选中,钱包会为每个UTXO生成包含签名的解锁脚本,由此让它们变得可以通过满足锁定脚本的条件来被支付。钱包把这些UTXO作为参考,并且联通解锁脚本一起作为输入加到交易中。交易输入的结构:

序列号是用来覆盖在交易锁定时间之前失效的交易,这是一项目前没有在比特币汇总用到的功能。大多数交易把这个值设置成最大的整数(0xFFFFFFF)并且被比特币网络忽略。如果一次交易有非零的锁定时间,那么它至少需要有一个序列号比0xFFFFFFF低的输入来激活锁定时间。

交易费

大多数交易包含交易费,是为了在网络安全方面给比特币矿工一种补偿。

大多数钱包自动计算并计入交易费。但是,如果你变成构造交易,或者使用命令行接口,你必须手动计算并计入这些费用。

交易费可当作是为了包含(挖矿)一笔交易到下一个区块中的一种鼓励,也可当作是对于欺诈交易和任何种类的系统滥用,在每一笔交易上通过征收一笔小成本的税而造成的一种妨碍。交易费被挖出这个区块的矿工得到,并且记录在这个交易的区块链中。

交易费基于交易的尺寸,用千字节来计算,而不是比特币的价值。总的来说,交易费基于市场所设置,生效于比特币网络中。矿工依据许多不同的标准,按重要性对交易进行排序,这包括费用,并且甚至可能在某种特定情况下免费处理交易。交易费影响处理优先级,这意味着有足够费用的交易会更可能地被包含在下一个挖出的区块中;与此同时,交易费不足或者没有交易费的交易可能会被推迟,基于尽力而为的原则在几个区块之后被处理,甚至可能根本不被处理。交易费不是强制的,而且没有交易费的交易也许最终会被处理,但是,包含交易费将提高处理优先级。

随着时间的过去,交易费的计算方式和交易费在交易优先级上的影响一直在发展。起初,交易费是网络中的一个固定常数。渐渐地,交易费的结构被放宽了,以便被市场基于网络容量和交易量而强制影响。目前最小交易费被固定在每千字节0.0001比特币,或者说是每千字节万分之一比特币,最近一次改变是从千分之一比特币减少到这个数值的。大多数交易少于一千字节,但是那些包含多个输入和输出的交易尺寸可能更大。在未来的比特币协议修订版中,钱包应用预计会使用统计学分析,基于最近的几笔交易的平均费用,来计算最恰当的费用并附在交易上。

把交易费加到交易中

交易的数据结构没有交易费的字段。相反地,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示。从所有输入中扣掉所有输出之后的多余的量会被矿工收集走。

交易费被作为输入减输出的余量:

交易费 = 求和(所有输入) - 求和(所有输出)

如果你忘记了在手动构造的交易中增加找零的输出,系统会把找零当作交易费来处理。

交易链条和孤立交易

交易形成一条链,这条链的形式是一笔交易消耗了先前的交易(父交易)的输出,并为随后的交易(子交易)创造了输出。有的时候组成整个链条的所有交易依赖于他们自己——比如父交易、子交易和孙交易——而他们又被同时创造出来,来满足复杂交易的工作流程。这需要在一个交易的父交易被签名之前,有一个合法的子交易被签名。

举个例子,这是CoinJoin交易使用的一项技术,这项技术可以让多方同时加入交易,从而保护他们的隐私。

当一条交易链被整个网络传送时,他们并不能总是按照相同的顺序到达目的地。有时,子交易在父交易之前到达。在这种情况下,节点会首先收到一个子交易,而不能找到他参考的父交易。节点不会立即抛弃这个子交易,而是放到一个临时池中,并等着接收它的父交易,与此同时广播这个子交易给其他节点。没有父交易的交易池被称作孤立交易池。一旦接收到了父交易,所有与这个父交易创建的UTXO有关的孤块会从池中释放出来,递归地重新验证,然后整条交易链就会被交易池包括进去,并等待着被区块所挖走。交易链可以是任意长度并且可以被任意数量的批次同时传走。在孤立池中保留孤块的机制保证了其他合法的交易不会只是因为父交易被耽误了而被抛弃,并且无论接收顺序,最终整个链会以正确的顺序重新构造出来。

内存中储存的孤立交易数量是有限制的,这是为了防止针对比特币节点的拒绝服务攻击(DoS)。这个限制被定义在比特币涉及到的客户端的源代码中的MAX_ORPHAN_TRANSACTIONS。如果池中的孤立交易数量达到了MAX_ORPHAN_TRANSACTIONS,一个或多个的、被随机选出的孤立交易会被池抛弃,直到池的大小回到限制以内。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


版权声明:本文为sinat_37138973原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。