比特币UTXO模型和脚本

最近把比特币的UTXO和比特币脚本的原理和理解重新整理了一遍,以下是对这块的理解和总结:

UTXO模型的深层解释:

  • 1所有交易必须由输入到输出的过程 (注意:coinbase可以没有输入)
  • 2.所有交易的输入必须等于输出,如果A用户有10个未被花费的UTXO,只转给B用户2个,那剩下8个要转回自己。而钱包会把这个过程自动转化成输出脚本,从而简化用户的操作,对客户端来讲,就像直接把2个比特币转给B用户。实际上相当于A给了B10元,B找零给A用户8元一样。
  • 3.一个用户可能拥有数量庞大的未花费的UTXO地址,这些UTXO加起来,就是用户拥有的比特币数量的总和。
  • 4.例子解释:
    • A用户利用解锁脚本(输入脚本/签名)解锁到用户C设定的锁定脚本(这笔UTXO是由C转给A的),才能够发起转给某个用户B公钥的锁定脚本。(P2PKH(pay to public key hash)模式:支付到一个公钥地址模式) c—》A—》B
    • 于是B用户利用自己的私钥签名解锁脚本转给一个多重签名的锁定脚本: 2 E F G 3。EFG三个用户里,需要有2个用户的私钥解锁了这个锁定脚本,这笔UTXO才能解锁,继续转给其他人。 (P2SH(pay to script hash)模式:支付到脚本模式,使用多重签名就需要用这种模式)

脚本类型:

1.分类一:输入脚本(解锁脚本/赎回脚本)—》输出脚本(锁定脚本/签名脚本)

锁定脚本被叫做scriptPubKey, 解锁脚本被叫做ScriptSig

2.分类二:按不同的脚本交易(“|”左边为解锁脚本,“|”右边为锁定脚本)

(1)P2PKH(pay to public key hash)   <sig> <PubK> | DUP HASH160  <PubKHash> EQUALVERIFY CHECKSIG

(2)P2PK (pay to public key)          <sig> |  <PubK>  CHECKSIG  (少了验证公钥地址是否一致的这一步)

(3)MS(multiple signature)最多15个    OP_0 <sig1> <sig2>… |  M <PubK1> <PubK2> … N   OP_CHECKMUTISIG 

    多重签名,脚本解释:M为解锁脚本至少需要的签名数量(激活交易的最小公钥匙),N为该锁定脚本总共的公钥数量

     之前的比特币版本有bug,比如实现2-3多重签名, 签名只有两个,公钥有3个,两个签名前要补0,来避免这个bug

(4)P2SH (pay to script hash)  <sig1> <sig2> … <M PubK1 PubK2 … N OP_CHECKMUTISIG> | OP_HASH160  锁定脚本的hash   OP_EQUAL

      P2SH是MS多重签名的简化版本,2012年作为新型交易类型被引入。特点是:将制作脚本的责任给了接收方,好处是可以缓解节点存储的压力。因为节点存储的UTXO是锁定脚本部分,而不是解锁脚本部分。

 注意:锁定脚本的hash,是通过把锁定脚本(<M PubK1 PubK2 … N OP_CHECKMUTISIG> 这部分)采用SHA256哈希算法,再用RIPEMD160算法得到一个20字节的数据。

    验证过程分两步:

     1.先把<M PubK1 PubK2 … N OP_CHECKMUTISIG> 这部分计算出一个hash值,看是否和锁定脚本里的hash值是否一样。

       2.如果一样,则执行解锁脚本里的内容,进行多重签名的验证。

(5)OP_RETURN(无法再花费的交易,不存在utxo内存里)  RETURN <DATA>

       一般用来存储少量的数据到比特币网络,存储的大小限制从40字节变到80字节,又变回40字节。

      利用无法花费这个特性,实际上是可以认为减少比特币的总供应量。如果大量开启这种服务,比特币最终一天会使用完毕,哪怕转一次消耗的比特币单位是聪。

特殊功能:

   1。时间锁:通过nLocktime实现,一笔utxo只能在一段时间后才能花费。通过时间锁,可以类似实现股票的解锁期。2015年底和2016年推出UTXO级别的时间锁定功能。CHECKLOCKTIMEVERIFY和CHECKSEQUENCEVERIFY



脚本原理:
  • 用户堆栈实现的脚本,支持256种指令,有限的运算,非图灵完备的。
  • P2PKH(pay to public key hash)脚本
  • 解锁+锁定脚本

        解锁脚本:<sig> <PubK> 

        锁定脚本: DUP HASH160  <PubKHash> EQUALVERIFY CHECKSIG


        验证的步骤:

        1.把解锁脚本里的<PubK> 出栈,然后进行HASH160的运算,得到一个值X。

        2.把值X和锁定脚本里的<PubKHash>比较是否相等,如果相等,则证明了<PubK> 是一个正确的公钥。

        3.通过解锁脚本里的<PubK> 和<sig> 解密出交易信息content内容的hash1,然后用那笔交易信息的content也算出一个hash2,如果hash1=hash2,则证明了解锁脚本里的<sig> 是用正确的私钥加密而来的。

        

如何解锁UTXO,矿工节点如何验证是成功解锁的UTXO:
解锁和验证原理(CHECKSIG 的过程)。
  • Bob的私钥+content内容 HASH= sig签名    (加密的过程) 
  • Bob的公钥+ sig签名 = content内容 HASH   (解密的过程) 然后对比那笔交易信息计算出的hash是否一致,如一致,证明是用符合的私钥加密的出sig。
  • bob的公钥 +content内容   无法推导出    sig签名
  • 理论上谁都可以生成一对公私钥来得到一个sig签名,并且验证签名也会通过。但是锁定脚本已经包含了用bob的公钥而得出的PubKHash,如果用户随便再生成一把公私钥对,这个得出的PubKHash是一定不一样的,而一但得出的一样的PubKHash,则证明是正确的公钥。并且如果sig签名是用正确的私钥加密的来的,那么通过公钥+正确的签名则能解密出交易信息记录里对应的content内容的hash。

UTXO模型的好处:
  • 1.减少无效账户:存储的都是有用的数据,而不会像账户模型一样可能存在大量的无效账户的数据。
  • 2.可以实现并行事务操作:UTXO数据库允许并行事务操作,因为用户这个概念实际是不存在的。只有某个utxo所有权的转移,因此可以并行处理,提高分布式事务的处理量和速度。因为这个过程没有和任何的其他交易共享状态。

       既然比特币的UTXO模型可以实现并行事物,以太坊用的是账户模型,账户模型是会存在锁的操作的。那为什么比特币还是比以太坊慢?

  答:比特币币以太坊慢并不是因为用了UTXO模型。而是为了减少分叉,才故意设置成10分钟左右才出块的。因为10分钟才出一次块,自然能处理的交易就有限了。而以太坊把出块的时间设置成15秒左右,理论上能包含的交易就更多,tps就提高了,但这会带来另外一个问题,那就是分叉概率增加的问题。因此以太坊才有叔块的概念,对于分叉的块和链也是认为有价值的,使用最重的链作为正确的链,而不是像比特币一样使用最长的链作为正确的链。


以下为引用部分,引用链接:https://www.jianshu.com/p/c2ce87c87b4a

交易分析

  实际上比特币的交易被设计为可以纳入多个输入和输出

  • 交易结构

交易的锁定时间定义了能被加到区块链里的最早的交易时间。在大多数交易里,它被设置成0,用来表示立即执行。
如果锁定时间不是0并且小于5亿,就被视为区块高度,意指在这个指定的区块高度之前,该交易不会被包含在区块链里。
如果锁定时间大于5亿,则它被当作是一个Unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时间之前,该交易不会被包含在区块链里。

  交易的数据结构没有交易费的字段,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示,即:

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

  • 交易输入结构


      结合整个交易的结构里看输入结构就是这样子:

  • 交易输出结构

  结合整个交易的结构里看输出结构就是这样子:

  • 交易哈希计算
    • 交易结构各字段序列化为字节数组
    • 把字节数组拼接为支付串
    • 对支付串计算两次SHA256得到交易hash

智能合约雏形

  • 比特币的脚本目前常用的主要分为两种:
    • 一种是常见的P2PKH(支付给公钥哈希)
    • 另一种是P2SH(Pay-to-Script-Hash支付脚本哈希)
        P2SH支付中,锁定脚本被密码学哈希所取代,当一笔交易试图支付UTXO时,要解锁支付脚本,它必须含有与哈希相匹配的脚本。
  • 应用场景
    • 多重签名应用
        合伙经营中,如只有一半以上的的股东同意签名就可以进行支付,可为公司治理提供管控便利,同时也能有效防范盗窃、挪用和遗失。 用于担保和争端调解,一个买家想和他不认识或不信任的某人交易,在一般情况交易正常进行时,买家不想任何第三方参与。那交易双方可以发起支付,但如果交易出现问题时,那第三方就可以根据裁定,使用自己的签名和裁定认可的一方共同签名来兑现这笔交易。
    • 保证合同
        保证合同是建造公众商品时的集资办法,公众商品是指一旦建成,任何人都可以免费享受到好处。标准的例子是灯塔,所有人都认同应该建造一个,但是对于个人航海者来说灯塔太贵了,灯塔同时也会方便其他航海者。
        一个解决方案是向所有人集资,只有当筹集的资金超过所需的建造成本时,每个人才真正付钱,如果集资款不足,则谁都不用付钱。
    • 依靠预言
        假如老人想让他孙子继承遗产,继承时间是在他死后或者在孙子年满18岁时(也是一个带锁定时间交易),无论哪个条件先满足,他的孙子都可以得到遗产。
        因为比特币节点可依靠预言对死亡条件进行判断,预言是指具有密钥对的服务器,当用户自定义的表达式被证明是真的,它能按照要求对交易签名。






猜你喜欢

转载自blog.csdn.net/kojhliang/article/details/81017002