最近把比特币的UTXO和比特币脚本的原理和理解重新整理了一遍,以下是对这块的理解和总结:
UTXO模型的深层解释:
脚本类型:
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
解锁脚本:<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:
既然比特币的UTXO模型可以实现并行事物,以太坊用的是账户模型,账户模型是会存在锁的操作的。那为什么比特币还是比以太坊慢?
答:比特币币以太坊慢并不是因为用了UTXO模型。而是为了减少分叉,才故意设置成10分钟左右才出块的。因为10分钟才出一次块,自然能处理的交易就有限了。而以太坊把出块的时间设置成15秒左右,理论上能包含的交易就更多,tps就提高了,但这会带来另外一个问题,那就是分叉概率增加的问题。因此以太坊才有叔块的概念,对于分叉的块和链也是认为有价值的,使用最重的链作为正确的链,而不是像比特币一样使用最长的链作为正确的链。
以下为引用部分,引用链接:https://www.jianshu.com/p/c2ce87c87b4a
实际上比特币的交易被设计为可以纳入多个输入和输出。
交易结构
交易的锁定时间定义了能被加到区块链里的最早的交易时间。在大多数交易里,它被设置成0,用来表示立即执行。
如果锁定时间不是0并且小于5亿,就被视为区块高度,意指在这个指定的区块高度之前,该交易不会被包含在区块链里。
如果锁定时间大于5亿,则它被当作是一个Unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时间之前,该交易不会被包含在区块链里。
交易的数据结构没有交易费的字段,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示,即:
交易费 = 求和(所有输入) - 求和(所有输出)
交易输入结构
结合整个交易的结构里看输入结构就是这样子:
交易输出结构
结合整个交易的结构里看输出结构就是这样子: