最近把比特币的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) | DUP HASH160 EQUALVERIFY CHECKSIG
(2)P2PK (pay to public key) | CHECKSIG (少了验证公钥地址是否一致的这一步)
(3)MS(multiple signature)最多15个 OP_0 … | M … N OP_CHECKMUTISIG
多重签名,脚本解释:M为解锁脚本至少需要的签名数量(激活交易的最小公钥匙),N为该锁定脚本总共的公钥数量
之前的比特币版本有bug,比如实现2-3多重签名, 签名只有两个,公钥有3个,两个签名前要补0,来避免这个bug
(4)P2SH (pay to script hash) … | OP_HASH160 锁定脚本的hash OP_EQUAL
P2SH是MS多重签名的简化版本,2012年作为新型交易类型被引入。特点是:将制作脚本的责任给了接收方,好处是可以缓解节点存储的压力。因为节点存储的UTXO是锁定脚本部分,而不是解锁脚本部分。
注意:锁定脚本的hash,是通过把锁定脚本( 这部分)采用SHA256哈希算法,再用RIPEMD160算法得到一个20字节的数据。
验证过程分两步:
1.先把 这部分计算出一个hash值,看是否和锁定脚本里的hash值是否一样。
2.如果一样,则执行解锁脚本里的内容,进行多重签名的验证。
(5)OP_RETURN(无法再花费的交易,不存在utxo内存里) RETURN
一般用来存储少量的数据到比特币网络,存储的大小限制从40字节变到80字节,又变回40字节。
利用无法花费这个特性,实际上是可以认为减少比特币的总供应量。如果大量开启这种服务,比特币最终一天会使用完毕,哪怕转一次消耗的比特币单位是聪。
特殊功能:
1。时间锁:通过nLocktime实现,一笔utxo只能在一段时间后才能花费。通过时间锁,可以类似实现股票的解锁期。2015年底和2016年推出UTXO级别的时间锁定功能。CHECKLOCKTIMEVERIFY和CHECKSEQUENCEVERIFY
脚本原理:
- 用户堆栈实现的脚本,支持256种指令,有限的运算,非图灵完备的。
- P2PKH(pay to public key hash)脚本
- 解锁+锁定脚本
解锁脚本:
锁定脚本: DUP HASH160 EQUALVERIFY CHECKSIG
验证的步骤:
1.把解锁脚本里的 出栈,然后进行HASH160的运算,得到一个值X。
2.把值X和锁定脚本里的比较是否相等,如果相等,则证明了 是一个正确的公钥。
3.通过解锁脚本里的 和 解密出交易信息content内容的hash1,然后用那笔交易信息的content也算出一个hash2,如果hash1=hash2,则证明了解锁脚本里的 是用正确的私钥加密而来的。
如何解锁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岁时(也是一个带锁定时间交易),无论哪个条件先满足,他的孙子都可以得到遗产。
因为比特币节点可依靠预言对死亡条件进行判断,预言是指具有密钥对的服务器,当用户自定义的表达式被证明是真的,它能按照要求对交易签名。