本文主要是介绍隔离见证学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第0章 引言
Bitcoin.org发布了比特币扩容路线,将隔离见证摆在了重中之重。按路线图来看将会在今年6月之前正式登录我们的节点。趁着元旦放假,狠补下课,读了两天的资料,结果还是一知半解,我这智商也是捉急的很啊。
在这周隔离见证BIP的草拟者刊登了一文《隔离见证是什麽? 为什麽我们必须尽快实行?》,我读完后,大吃一惊,更糊涂了。再一次重新理了一遍比特币的交易数据结构,感觉终于把隔离见证搞到了略懂。
现在我把学习笔记分享出来。
第1章 对《隔离见证是什麽? 为什麽我们必须尽快实行?》的两个疑问
读完此文,我感到一种不详的东西,现在把我的理解写出来供大家鉴别,希望是我错了。
在文中第四段的一句话是:
“SW用户在交易时,会把比特币传送到有别於传统的地址。”
这里的“有别于传统的地址”是什么意思?
从字面上看起来像是SW用户和非SW用户的地址是“有别”的,这个地址是指的公钥的话,那问题就大了。这就是说隔离见证会改变地址的格式,SW用户将无法将比特币发给非SW用户生成的地址。一个简单的理解是,SW用户发往有别于传统的地址就是创造了另外一种币了。比如莱特币的地址就是有别于比特币的地址。
从上下文来看,结合《Master Bitcoin》里的原理解释,我相信这是作者的笔误。这一句里的“地址”应该是“交易输出(output)”。
在《Master Bitcoin》这本书里的第5章,5.3节交易结构里,描述了比特币的交易的原理如下:
一笔比特币交易是一个含有输入值和输出值的数据结构,该数据结构植入了将一笔资金从初始点(输入值)转移至目标地址(输出值)的代码信息。
就是说交易从原理上讲不是发往某个地址,而是发往一个“输出值”,地址格式在隔离见证分叉后并不会改变,而是以交易的目标地址的“输出值代码信息”会改变。
但这笔误实在是太过分了,你搞一个“有别于传统的地址”,鉴于作者的身份是“亦是三份有关隔离见证的比特币改善方案 (BIP) 的草拟者”,这可真是吓死宝宝了。
此文的第7段有这么一句话:
从此以後,只有发出交易的人才可以改变交易ID,没有任何第三方可以做到。如果是多重签名交易,就只有多名签署人同意才能改变交易ID。
可以“改变交易ID”,这从字面的意思是说比特币交易构造完成后,发出交易的人还有机会改变。就是说交易是可逆的,我发出交易后,还可以后悔,我去修改。这和比特币交易的不可逆性是完全背离的。
比特币交易发出后是任何人都无法改变的,交易是不可逆的。延展性攻击原理是攻击者侦听到交易ID,然后复制下来,改掉txID里的签名信息,再广播,同时和原交易广播展开争夺节点验证的过程,改过签名信息的广播是不可能获得节点验证的,但会造成节点向网络反馈说原交易存在伪造,从而导致交易延迟。
这应该又是作者的一个笔误,此处的“只有发出交易的人才可以改变交易ID”应该改成“即使是攻击者侦听到了交易ID,也无法发起修改交易签名,也就无法发动延展性攻击。”
作为技术上一知半解的我,读这篇文章确实是被吓了一跳,请不要把我理解为吹毛求疵。
第2章 比特币交易原理
《Master Bitcoin》的第5章描述了比特币交易原理,全章比较复杂,我先摘录一段方便我们理解隔离见证的关键:
一笔比特币交易是一个含有输入值和输出值的数据结构,该数据结构植入了将一笔资金从初始点(输入值)转移至目标地址(输出值)的代码信息。比特币交易的输入值和输出值与账号或者身份信息无关。你应该将它们理解成一种被特定秘密信息锁定的一定数量的比特币。只有拥有者或知晓这个秘密信息的人可以解锁。
从上文可以看到,比特币交易的核心就是“输入”和“输出”,我得仔细理解这两个概念。
现在我有一个比特币地址 14mhzjkJ71oMAMkKu3dy98dnUpkyQBHL1r,如果里面有1BTC,这1BTC存在哪里呢?如果是我有一张银行卡,账户里显示有100块钱,这100块钱就存在于银行给我构建的一个用户记录的数据里。但我的比特币在哪呢?大致可以理解为下面这样:
比特币是被所有者锁住或记录于区块链中的并被整个网络识别成货币单位的一定量的比特币单位。当我接收比特币时,金额会被记录到区块链里,也就是记录在一个或多个区块里。
而我给他人发送比特币时,就是用我的私钥将锁定在区块链里的比特币单位通过签名解锁,并使用目标比特币地址来锁定这些比特币单位。而目标地址锁定了这些比特币单位后,就只有目标地址对应的私钥才能锁定,即才能花钱。
下面来描述下交易的原理:
交易单记录的是本次交易的收入来源(in)和支出(out)。当你支出(给)一笔钱的时候,首先在交易单中就要描述清楚你要支出(out)的钱的收入来源 (in),然后在支出(out)项中,指明要支出的金额,以及通过脚本的形式写明接收者的公钥,然后用自己的私钥签名(scriptSig)认可该笔交 易,最后将交易单广播到网络。
下图是交易的数据结构,摘自《Master Bitcoin》:
“输入”是写清楚了待支付的钱是谁给你的,可以有多个来源。还要加上你的私钥签名(未隔离见证分叉之前)。
“输出”是写清楚了目标地址。
下面是老刘给我的地址14mhzjkJ71oMAMkKu3dy98dnUpkyQBHL1r打赏的交易数据代码:
“inputs”: [ //输入
{
"addresses": [
"1FgnZaSAjRb4AXZdWJBURNWEMiBVTRnc9w" //老刘地址,指明了打赏币的来源是来自老刘的地址锁定的币 ],
“value”: “4.84540000″,
“value_int”: 484540000,
“txid”: “384c16f1a0f434775f640e55a35e79847b1a8ac5d184bef87cca054581a569d7″,//收入来源交易单的散列值“vout”: 1,
“script_sig”: { //老刘的私钥签名“asm”: “30450221009b5f141a1de247313bf4c1d51dda7e12d05afcbb2fe2352492f9aca104be3f95022020504ed638b837e5db087e488d212f20e4ed0f4a7d4172a51d455d377da7417701 031d96241bd479299b73f4335da47350f64985aa37558a526877e48a255c62bbe3″,
“hex”: “4830450221009b5f141a1de247313bf4c1d51dda7e12d05afcbb2fe2352492f9aca104be3f95022020504ed638b837e5db087e488d212f20e4ed0f4a7d4172a51d455d377da741770121031d96241bd479299b73f4335da47350f64985aa37558a526877e48a255c62bbe3″
},
“sequence”: 4294967295
}
],
“output_count”: 2,
“outputs”: [//输出
{
"addresses": [
"14mhzjkJ71oMAMkKu3dy98dnUpkyQBHL1r"//我的地址,打赏的币被我的地址锁定
],
“value”: “0.00330000″,//老刘打赏给我的金额
“value_int”: 330000,
“n”: 0,
“script_pub_key”: {//我的公钥脚本
“asm”: “OP_DUP OP_HASH160 295ce6a5684ebdbd526765231e25d36c34fc0e50 OP_EQUALVERIFY OP_CHECKSIG”,
“hex”: “76a914295ce6a5684ebdbd526765231e25d36c34fc0e5088ac”
},
“req_sigs”: 1,
“type”: “pubkeyhash”,
“spend_txid”: “b1fdf100105a0f3894d5aade320a2beb420195546ddea440c334b6280cbd6310″
},
{
“addresses”: [
"1FgnZaSAjRb4AXZdWJBURNWEMiBVTRnc9w"//这是找零地址,找回老刘自己的地址里。
],
“value”: “4.84200000″,
“value_int”: 484200000,
“n”: 1,
“script_pub_key”: {
“asm”: “OP_DUP OP_HASH160 a1180435a4616f2094837e3eeac46bb0b81b50e6 OP_EQUALVERIFY OP_CHECKSIG”,
“hex”: “76a914a1180435a4616f2094837e3eeac46bb0b81b50e688ac”
},
“req_sigs”: 1,
“type”: “pubkeyhash”,
“spend_txid”: “c13e66805b283df162b5c9ed95c2c1f35ca9c93d2293cd3641509e7a2321c9db”
}
],
“tx_index”: 99579908,
“block_index”: 833
}
这就是现在(没有隔离见证)的比特币交易过程。
在比特币网络里随时都有人会发起交易,而矿工则是按平均10分钟一次来记录这些交易,矿工会把10分钟内的所有交易进行登记,然后打包,形成一个“区块”,链接上区块链。而这个区块目前限制了数据大小为1M。如果10分钟内,网络发起了太多的交易,导致1M的区块容不下这么多交易,那么矿工就不得不舍弃一些交易,让它们排队去下一个区块。
现在网络的交易量越来越多,1M容量接近不够用,矿工的内存池里有太多的交易排队,一直打包不完。所以要想办法扩大这个容量,让一个区块能够打包更多的交易。
社区的扩容方案很多,隔离见证就是其中一种。
下面描述隔离见证是什么。
第3章 隔离见证
现在区块1M容量不够用了,肿么办?一个简单的办法就是把1M改成更大呗,但这需要硬分叉,很多人都不同意,害怕出问题。还有一个办法就是把塞进这1M区块的单笔交易的数据给缩身了,这样也能装下更多的交易。
隔离见证就是想办法让同样1M的空间塞进更多的交易的办法。
原来的交易数据结构里有签名和交易记录,把“输入”发到“输出”。“输入”里有支付者的签名。
现在来打个比方。我去银行汇款,填了张汇款单,单子上写清楚了从我的中国银行账号汇100块钱给我爸爸的农业银行账号,然后我在单上签上我的名字,以授权这笔转账。银行的工作人员拿到这张单子后,就从我的账号上划走了100块钱,而在我爸爸的账号上则增加了100块钱。但我爸爸是看不到我汇款单上的签名的,银行不会拍一张照片给爸爸说,看这是你儿子的签名,是他授权了给你汇款的,只有银行才会关心我有没有授权。
而比特币是一个去中心化的银行,为了保证每一个人支出的比特币确实有权力支出,现在交易记录里一定要附上自己的签名,以防止伪造。矿工负责验证支付者有没有授权,但收币的用户其实可以不关心的。那么有没有可能只让矿工去记录这些授权签名信息,而不给接收币的用户呢?(这里的比喻不是特别准确,为方便理解先模糊一点,下面会更准确)
这是可以的。把交易记录和签名信息分开。
现在的区块是这样的:
现在的区块链是这样的:
隔离见证后的交易数据结构大致可以理解为变成了下面这样(不准确啊,只是个示意图):
隔离分叉后的区块是这样的:
隔离见证分叉后的区块链就是将这样的:
这样就变相突破了1M区块的限制,让1M区块能够容纳更多的交易。
第4章 遗留三个问题
对于比特币的原理,我知识储备确实有限,隔离分叉已经是调动了我的储备极限,还是有几个问题没有得到圆满的答案。我写出来,希望日后能够分析清楚,或者有好心的牛人给答疑。
问题1:隔离见证是软分叉如何完成?
软分叉意味者新旧两种区块相互兼容,即可以是往前兼容,又可以是往后兼容。那么软分叉是否意味着分叉后的区块链可以是由非隔离见证区块和隔离见证区块相混而成?比如蚁池接受了隔离见证,他可以打包出新区块,但鱼池没有接受隔离见证,他可以打包出老区块。两者都是合法的区块。这样的话区块链就会变成下面这样:
还是必须在某一个区块高度后,所有的矿池都必须统一打包成新区块,才能算是分叉成功。
问题2:隔离分叉能解决延展性攻击吗?
延展性攻击是攻击者侦听到交易ID,修改签名信息构造伪造的交易ID,并广播到节点让节点拒绝交易,导致原交易被误认为是伪造的。
隔离见证后,签名信息从交易的输入数据结构里剥离开来了,形成两个数据,并在交易记录里内置一个指向签名信息的指针,让矿工进行验证。
如果延展性攻击者获取了隔离见证的交易ID,他只需要修改交易记录里的指针就可以完成攻击。他甚至是可以将两笔交易ID的指针互换,一下子搅乱两笔交易。
问题3:如果一个地址锁定了新旧两个区块的比特币,那花币时矿工如何验证真伪?
比如我在2014年使用Bitcoin core生产了一个离线地址,并且往里面打了1BTC的币,假设交易打包进了20万高度。一直没花,到了2016年6月1日,隔离见证分叉成功后,我又往这个地址打了一个币,这时打包我交易的是一个新区块,假设打包区块高度是60万。这种情况下,我这个地址锁定的比特币将会存在着新旧两种区块里。如果在2017年1月份,我要花这个地址的币。因为两个区块里的数据结构是不一样的。这种情况下,矿工如何验证。
我感觉这个问题不大,肯定能够顺利验证。但我想不明白,先记录下这个问题,日后要解答。其实这个问题源自《隔离见证是什麽? 为什麽我们必须尽快实行?》的第9段,作者声称能够改善交易签署。但我理解不了为什么,我觉得会将签署搞的更复杂,而不是更简单。
第5章 结束语
比特币技术原理对我来说是个知识堡垒,希望今年能够攻克。
非常感谢海波同学热情帮我解释隔离见证。
本文主要参考文献如下:
1.《隔离见证是什麽? 为什麽我们必须尽快实行?》
http://www.8btc.com/segregated-witness
2.什么是比特币延展性攻击?
http://8btc.com/forum.php?mod=viewthread&tid=23878&page=1#pid270878
3.比特币交易(Transaction)的输入与输出
http://8btc.com/article-2006-1.html
4.比特币交易(Transaction)的类型与验证
http://8btc.com/article-2007-1.html
5.bip-segwit-checksig.mediawiki
https://github.com/jl2012/bips/blob/segwit-checksig/bip-segwit-checksig.mediawiki
6.master bitcoin
http://www.zhibimo.com/read/wang-miao/mastering-bitcoin/Chapter07.html
7.比特币隔离见证(segwit)很酷,但它不是短期解决方案?
http://www.8btc.com/segregated-witness-is-cool
8.比特币交易、支付、审计、铸币全过程解析
http://8btc.com/article-2005-1.html
9.Mike Hearn:关于比特币硬分叉和软分叉的争议
http://www.8btc.com/on-consensus-and-forks
这篇关于隔离见证学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!