交易过程

    交易过程,简单的说就是将一笔交易告知全⽹——⽐特币的持有者已授权把⽐特币转帐给其他⼈。其实就是⽐特币的持有者通过锁定脚本把比特币锁定到新持有者的地址。当这笔交易被全网认证之后,将其放到区块里,进而更新到区块链上。⽽新持有者能够通过解锁脚本去使用被锁定的比特币,将其转移给其他⼈,后⾯的持有者在花费⽐特币也是⽤类似的⽅式。
区块1中,记录了,小王给小张转了100BTC,在区块2中,小张转了10BTC给小李,在区块3中,小李转了10BTC给小赵;区块上都是记载已经发生的交易;例如小张转给小李10BTC,其实这10BTC是小王转给小张的;这说明了一个什么问题,我们记账的时候不需要记录谁名下有多少钱,只需要记录你名下有多少没有花费的交易输出就可以了(又称为UTXO);而这些交易输出又是记录在区块链上的,别人根本无法改动,所以使用时就可以现去区块链上查找;当然钱包里也有余额,那是因为钱包会专门建立一个数据库去记录未花费的交易输出(UTXO)。

交易过程
1、创建交易
    ⼀笔交易其实是⼀个有着货币转移⽬的的⼯具,这个⼯具只有在交易被执⾏时才会在⾦融体系中体现,⽽且交易发起⼈并不⼀定是签署该笔交易的⼈。
2、广播至网络
    ⼀笔交易需要传递⾄⽐特币⽹络,才能被传播,也才能加⼊区块链中。
3、验证交易
        接收到这笔交易的节点将会对其进行验证。如果交易被验证有效,该节点将会将这笔交易传播到这个节点所连接的其他节点;同时,交易发起者会收到⼀条表⽰交易有效并被接受的返回信息。如果这笔交易被验证为⽆效,这个节点会拒绝接受这笔交易且同时返回给交易发起者⼀条表⽰交易被拒绝的信息。
4、放进交易池
    ⽐特币⽹络中⼏乎每个节点都会维护⼀份未确认交易的临时列表,被称为内存池或交易池。节点们利⽤这个池来追踪记录那
些被⽹络所知晓、但还未被区块链所包含的交易。
    有些节点的实现还维护⼀个单独的孤⽴交易池。如果⼀个交易的输⼊与某未知的交易有关,如与缺失的⽗交易相关,该孤⽴
交易就会被暂时储存在孤⽴交易池中直到⽗交易的信息到达。
    当⼀个交易被添加到交易池中,会同时检查孤⽴交易池,看是否有某个孤⽴交易引⽤了此交易的输出(⼦交易)。任何匹配
的孤⽴交易会被进⾏验证。如果验证有效,它们会从孤⽴交易池中删除,并添加到交易池中,使以其⽗交易开始的链变得完
整。对新加⼊交易池的交易来说,它不再是孤⽴交易。前述过程重复递归寻找进⼀步的后代,直⾄所有的后代都被找到。通
过这⼀过程,⼀个⽗交易的到达把整条链中的孤⽴交易和它们的⽗级交易重新结合在⼀起,从⽽触发了整条独⽴交易链进⾏
级联重构。
5、打包进区块
    如果上一轮pow结束,网络中的节点会把自己交易池中的交易打包进行区块中,然后进行新一轮的pow,先完成的节点会将新的区块发送到网络中。
6、验证区块
    网络中的节点接收到新的区块后,进行验证,验证通过后,会将其放到区块链上。放到区块链上交易,等到六个区块确认后,基本就是安全的了,不可篡改的。
至此一个交易就算完成了。


常见的交易形式

    最常⻅的交易形式是从⼀个地址到另⼀个地址的简单⽀付,这种交易也常常包含给⽀付者的“找零”。⼀般交易有⼀个输⼊和两个输出。

    另⼀种常⻅的交易形式是集合多个输⼊到⼀个输出的模式。这相当于现实⽣活中将很多硬币和纸币零钱兑换为⼀
个⼤额⾯钞。像这样的交易有时由钱包应⽤产⽣来清理许多在⽀付过程收到的⼩数额的找零。
    最后,另⼀种在⽐特币账簿中常⻅的交易形式是将⼀个输⼊分配给多个输出,即多个接收者的交易。这类交易有
时被商业实体⽤作分配资⾦,例如给多个雇员发⼯资的情形。
    交易创建
    ⽐特币交易的基本单位是未经使⽤的⼀个交易输出,简称UTXO。UTXO是不能再分割、被所有者锁住或记录于区块链中的并
被整个⽹络识别成货币单位的⼀定量的⽐特币货币。被交易消耗的UTXO被称为交易输⼊,由交易创建的UTXO被称为交易输出。通过这种⽅式,⼀定量的⽐特币价值在不同所有者之间转移,并在交易链中消耗和创建UTXO。⼀笔⽐特币交易通过使⽤所有者的签名来解锁UTXO,并通过使⽤新的所有者的⽐特币地址来锁定并创建UTXO。
    创建交易输入
    简单地说,交易输⼊是指向UTXO的指针。它们指向特定的UTXO,并被交易哈希和在区块链中记录UTXO的序列号作为参
考。若想⽀付UTXO,⼀个交易的输⼊也需要包含⼀个解锁脚本,⽤来满⾜UTXO的⽀付条件。解锁脚本通常是⼀个签名,⽤
来证明对于在锁定脚本中的⽐特币地址拥有所有权

    创建交易输出
    每⼀笔⽐特币交易创造输出,输出都会被⽐特币账簿记录下来。⼏乎所有的输出都能创造⼀定数量的可⽤于⽀付的⽐特币,也就是UTXO。这些UTXO被整个⽹络识别,并且所有者可在未来的交易中使⽤它们。给某⼈发送⽐特币实际上是创造新的UTXO,注册到那个⼈的地址,并且能被他⽤于新的⽀付。
    UTXO被每⼀个全节点⽐特币客⼾端在⼀个储存于内存中的数据库所追踪,该数据库也被称为“UTXO集”或者“UTXO池”。新的交易从UTXO集中消耗(⽀付)⼀个或多个输出。

交易费
    ⼤多数交易包含交易费,这是为了在⽹络安全⽅⾯给⽐特币矿⼯⼀种补偿。交易费可当作是为了包含(挖矿)⼀笔交易到下⼀个区块中的⼀种⿎励,也可当作是对于欺诈交易和任何种类的系统滥⽤,在每⼀笔交易上通过征收⼀笔⼩成本的税⽽造成的⼀种妨碍。交易费被挖出这个区块的矿⼯得到,并且记录在这个交易的区块链中。
    交易的数据结构没有交易费的字段。相反地,交易费通过所有输⼊的总和,以及所有输出的总和之间的差来表⽰。从所有输⼊中扣掉所有输出之后的多余的量会被矿⼯收集⾛。
    交易费被作为输⼊减输出的余量:交易费 = 求和(所有输⼊) - 求和(所有输

交易独立验证
    在交易传递到临近的节点前,每⼀个收到交易的⽐特币节点将会⾸先验证该交易,这将确保只有有效的交易才会在⽹
络中传播,⽽⽆效的交易将会在第⼀个节点处被废弃。
    每⼀个节点在校验每⼀笔交易时,都需要对照⼀个⻓⻓的标准列表:
▷交易的语法和数据结构必须正确。
▷输⼊与输出列表都不能为。
▷交易的字节⼤⼩是⼩于 MAX_BLOCK_SIZE 的。
▷每⼀个输出值,以及总量,必须在规定值的范围内(⼩于2,100万个币,⼤于0)。
▷没有哈希等于0,N等于-1的输⼊(coinbase交易不应当被中继)。
▷nLockTime是⼩于或等于 INT_MAX 的。
▷交易的字节⼤⼩是⼤于或等于100。
▷交易中的签名数量应⼩于签名操作数量上限。
▷解锁脚本( scriptSig )只能够将数字压⼊栈中,并且锁定脚本( scriptPubkey )必须要符合 isStandard 的格式 (该格式将会拒绝⾮标准交易)。
▷池中或位于主分⽀区块中的⼀个匹配交易必须是存在的。
▷对于每⼀个输⼊,如果引⽤的输出存在于池中任何的交易,该交易将被拒绝。
▷对于每⼀个输⼊,在主分⽀和交易池中寻找引⽤的输出交易。如果输出交易缺少任何⼀个输⼊,该交易将成为⼀个孤⽴的交易。如果与其匹配的交易还没有出现在池中,那么将被加⼊到孤⽴交易池中
▷对于每⼀个输⼊,如果引⽤的输出交易是⼀个coinbase输出,该输⼊必须⾄少获得 COINBASE_MATURITY (100)个确认。
▷对于每⼀个输⼊,引⽤的输出是必须存在的,并且没有被花费。
▷对于每⼀个输⼊,引⽤的输出是必须存在的,并且没有被花费。
▷使⽤引⽤的输出交易获得输⼊值,并检查每⼀个输⼊值和总值是否在规定值的范围内 (⼩于2100万个币,⼤于0)。
▷如果输⼊值的总和⼩于输出值的总和,交易将被中⽌。
▷如果交易费⽤太低以⾄于⽆法进⼊⼀个空的区块,交易将被拒绝。
▷每⼀个输⼊的解锁脚本必须依据相应输出的锁定脚本来验证。

在收到交易后,,每⼀个节点都会在全⽹⼴播前对这些交易进⾏校验,并以接收时的相应顺序,为有效的新交易建⽴⼀个池(交易池)。

猜你喜欢

转载自blog.csdn.net/xq723310/article/details/80218213
今日推荐