• 交易


    交易

      与⽀票相似,⼀笔⽐特币交易其实是⼀个有着货币转移⽬的的⼯具,这个⼯具只有在交易被执⾏时才会在⾦融体系中体现,⽽且交易发起⼈并不⼀定是签署该笔交易的⼈⽐如,⼀个负责应付账款的柜员在处理应付票据时可能会需要CEO签名。相似地,这个负责应付账款的柜员可以创建⽐特币交易,然后让CEO对它进⾏数字签名,从⽽使之有效。⼀张⽀票是指定⼀个特定账⼾作为资⾦来源的,但是⽐特币交易指定以往的⼀笔交易作为其资⾦来源,⽽不是⼀个特定账⼾。

      ⼀旦⼀笔⽐特币交易被发送到任意⼀个连接⾄⽐特币⽹络的节点,这笔交易将会被该节点验证。如果交易被验证有效,该节点将会将这笔交易传播到这个节点所连接的其他节点;同时,交易发起者会收到⼀条表⽰交易有效并被接受的返回信息。如果这笔交易被验证为⽆效,这个节点会拒绝接受这笔交易且同时返回给交易发起者⼀条表⽰交易被拒绝的信息。

        

      交易的锁定时间:锁定时间定义了能被加到区块链⾥的最早的交易时间。在⼤多数交易⾥,它被设置成0,⽤来表⽰⽴即执⾏。

              如果锁定时间不是0并且⼩于5亿,就被视为区块⾼度,意指在这个指定的区块⾼度之前,该交易没有被包含在区块链⾥。

              如果锁定时间⼤于5亿,则它被当作是⼀个Unix纪元时间戳(从1970年1⽉1⽇以来的秒数),并且在这个指定时点之前,该交易没有被包含在区块链⾥。锁定时间的使⽤相当于将⼀张纸质⽀票的⽣效时间予以后延。

      ⽐特币交易的基本单位是未经使⽤的⼀个交易输出,简称UTXO。UTXO是不能再分割、被所有者锁住或记录于区块链中的并被整个⽹络识别成货币单位的⼀定量的⽐特币货币

      

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

      对于输出和输⼊链来说,有⼀个例外,它是⼀种特殊的交易类型,称为Coinbase交易。这是每个区块中的⾸个交易。这种交易存在的原因是作为对挖矿的奖励⽽产⽣全新的可⽤于⽀付的⽐特币给“赢家”矿⼯。

      交易输出包含两个部分:

      1、⼀定量的⽐特币,被命名为“聪”,是最⼩的⽐特币单位;

      2、⼀个锁定脚本,也被当作是“障碍”,提出⽀付输出所必须被满⾜的条件以“锁住”这笔总额。

      

       交易输出把⽤聪表⽰的⼀定数量的⽐特币,和特定的定义了⽀付输出所必须被满⾜的条件的障碍,或者叫锁定脚本,关联到了⼀起。在⼤多数情况下,锁定脚本会把输出锁在⼀个特定的⽐特币地址上,从⽽把⼀定数量的⽐特币的所有权转移到新的所有者上。

      

       

    交易费

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

      交易费基于交易的尺⼨,⽤千字节来计算,⽽不是⽐特币的价值。⽬前最⼩交易费被固定在每千字节0.0001⽐特币,或者说是每千字节万分之⼀⽐特币。⼤多数交易少于⼀千字节,但是那些包含多个输⼊和输出的交易尺⼨可能更⼤。

       交易费通过所有输⼊的总和,以及所有输出的总和之间的差来表⽰。从所有输⼊中扣掉所有输出之后的多余的量会被矿⼯收集⾛。

        

      因为如果你要构造你⾃⼰的交易,你必须确认你没有疏忽地包含了⼀笔少于输⼊的、量⾮常⼤的费⽤。这意味着你必须计算所有的输⼊,如果必要的话进⾏找零,不然的话,结果就是你给了矿⼯⼀笔可观的劳动费!

    孤立交易

      当⼀条交易链被整个⽹络传送时,他们并不能总是按照相同的顺序到达⽬的地。有时,⼦交易在⽗交易之前到达。在这种情况下,节点会⾸先收到⼀个⼦交易,⽽不能找到他参考的⽗交易。节点不会⽴即抛弃这个⼦交易,⽽是放到⼀个临时池中,并等着接收它的⽗交易,与此同时⼴播这个⼦交易给其他节点。没有⽗交易的交易池被称作孤⽴交易池

      ⼀旦接收到了⽗交易,所有与这个⽗交易创建的UTXO有关的孤块会从池中释放出来,递归地重新验证,然后整条交易链就会被交易池包括进去,并等待着被区块所挖⾛。交易链可以是任意⻓度并且可以被任意数量的批次同时传⾛。在孤⽴池中保留孤块的机制保证了其他合法的交易不会只是因为⽗交易被耽误了⽽被抛弃,并且⽆论接收顺序,最终整个链会以正确的顺序重新构造出来。

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

    脚本

      P2PKH(Pay-to-Public-Key-Hash):这是一种脚本。

      ⽐特币交易验证并不基于⼀个不变的模式,⽽是通过运⾏脚本语⾔来实现。这种语⾔可以表达出多到数不尽的条件变种。这也是⽐特币作为⼀种“可编程的货币”所拥有的权⼒。

      由于解锁脚本常常包含⼀个数字签名,因此它曾被称作 ScriptSig 。在⼤多数⽐特币应⽤的源代码中, ScriptSig 便是我们所说的解锁脚本。但并⾮所有解锁脚本都⼀定会包含签名。

    标准交易

      虽然创设⼀个⾮标准交易(脚本类型⾮标准化)是有可能的,但前提是必须能找到⼀个不遵循标准⽽且能将该⾮标准交易纳⼊区块的矿⼯

      五⼤标准脚本分别为P2PKHP2PKMS(限15个密钥)、P2SHOP_Return

    1、P2PKH(Pay-to-Public-Key-Hash)

      ⽐特币⽹络上的⼤多数交易都是P2PKH交易,此类交易都含有⼀个锁定脚本,该脚本由公钥哈希实现阻⽌输出功能,公钥哈希即为⼴为⼈知的⽐特币地址

      锁定脚本是:

        

      解锁脚本是:

          

      合在一起就是:

        

    2、P2PK(Pay-to-Public-Key)

       锁定脚本:

        

      解锁脚本:

        

      合在一起:

        

    3、多重签名。

      锁定脚本:

        

      2-3多重签名锁定脚本:

        

      2-3多重签名解锁脚本:

        

        之所以要加上前缀OP_0,是因为最早的CHECKMULTISIG在处理含有多个项⽬的过程中有个⼩漏洞,CHECKMULTISIG会⾃动忽略这个前缀,它只是占位符⽽已。

      完整形式:

        

    4、数据输出 (OP_RETURN操作符)

      OP_Return 允许开发者在交易输出上增加40字节的⾮交易数据。然后,与伪交易型的UTXO不同, OP_Return 创造了⼀种明确的可复查的⾮交易型输出,此类数据⽆需存储于UTXO集。

      OP_Return 输出被记录在区块链上,它们会消耗磁盘空间,也会导致区块链规模的增加,但它们不存储在UTXO集中,因此也不会使得UTXO内存膨胀,更不会以消耗代价⾼昂的内存为代价使全节点都不堪重负。

      OP_RETURN脚本样式:

        

      “data”部分被限制为40字节,且多以哈希⽅式呈现,如32字节的SHA256算法输出。许多应⽤都在其前⾯加上前缀以辅助认定。例如,电⼦公正服务的证明材料采⽤8个字节的前缀“DOCPROOF”,在⼗六进制算法中,相应的ASCII码为 44f4350524f4f46 。

      ⼀笔标准交易(通过了 isStandard() 函数检验的)只能有⼀个 OP_RETURN 输出。

    5、P2SH(Pay-to-Script-Hash)

      

      

      上图中第一行的 Script、第三行的 script 在实际中不存在,在上图中只是为了说明作用。

      看一个实例。

      1)在多重签名模式下,下面是一锁定脚本:

        

        如果占位符由实际的公钥(以04开头的520字节)替代,你将会看到的脚本会⾮常地⻓:

        

      2)在P2SH模式下,Redeem脚本将被经 RIPEMD(SHA256())处理后,将成为20字节的数据 。

        

        那么锁定脚本就变为:

        

        解锁脚本为:

         

        

      P2SH的另⼀重要特征是它能将脚本哈希编译为⼀个地址。P2SH地址是基于Base58编码的⼀个含有20个字节哈希的脚本,就像⽐特币地址是基于Base58编码的⼀个含有20个字节的公钥。

        由于P2SH地址采⽤5作为前缀,这导致基于Base58编码的地址以“3”开头。例如,Mohammed的脚本,基于Base58编码下的P2SH地址变为“39RF6JqABiHdYHkfChV6USGMe6Nsr66Gzw”。

      

      

  • 相关阅读:
    【转】VirtualBox虚拟机网络设置(四种方式)
    笔、面试时OS常见题目【转】【Updating】
    【转】Vim教程
    【部分原创】刚安装好的linux中aptget配置代理的方法
    【原创长文】openstack 版本D安装配置及本次安装中遇到的问题
    单链表反转函数
    摆正心态
    C# XmlSerializer实现序列化浅析
    C#中虚函数和抽象函数的区别
    在Win7(64位)系统下运行World Wind源码程序出现“未处理BadImageFormatException”错误解决方法(另:附加信息)
  • 原文地址:https://www.cnblogs.com/tekkaman/p/9957683.html
Copyright © 2020-2023  润新知