OKCoin

隔离见证学习笔记

tan90d 发布在 比特币 25 6284

Online-education

 

第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》:

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块钱。但我爸爸是看不到我汇款单上的签名的,银行不会拍一张照片给爸爸说,看这是你儿子的签名,是他授权了给你汇款的,只有银行才会关心我有没有授权。

而比特币是一个去中心化的银行,为了保证每一个人支出的比特币确实有权力支出,现在交易记录里一定要附上自己的签名,以防止伪造。矿工负责验证支付者有没有授权,但收币的用户其实可以不关心的。那么有没有可能只让矿工去记录这些授权签名信息,而不给接收币的用户呢?(这里的比喻不是特别准确,为方便理解先模糊一点,下面会更准确)

这是可以的。把交易记录和签名信息分开。

现在的区块是这样的:

11

现在的区块链是这样的:

22

 

隔离见证后的交易数据结构大致可以理解为变成了下面这样(不准确啊,只是个示意图):

66

隔离分叉后的区块是这样的:

33

隔离见证分叉后的区块链就是将这样的:

44

这样就变相突破了1M区块的限制,让1M区块能够容纳更多的交易。

 

第4章 遗留三个问题

 

对于比特币的原理,我知识储备确实有限,隔离分叉已经是调动了我的储备极限,还是有几个问题没有得到圆满的答案。我写出来,希望日后能够分析清楚,或者有好心的牛人给答疑。

问题1:隔离见证是软分叉如何完成?

软分叉意味者新旧两种区块相互兼容,即可以是往前兼容,又可以是往后兼容。那么软分叉是否意味着分叉后的区块链可以是由非隔离见证区块和隔离见证区块相混而成?比如蚁池接受了隔离见证,他可以打包出新区块,但鱼池没有接受隔离见证,他可以打包出老区块。两者都是合法的区块。这样的话区块链就会变成下面这样:

55

还是必须在某一个区块高度后,所有的矿池都必须统一打包成新区块,才能算是分叉成功。

问题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

 

如果您觉得文章对您有用,欢迎打赏我一点比特币,以鼓励我继续写下去。

作者:tan90d(微博@闪电HSL 微信tan90d)

我的BTC地址:14mhzjkJ71oMAMkKu3dy98dnUpkyQBHL1r

币看APP打赏按钮 bitcoin:1BRHsmApGRV1Wb1Xph2Zq8rBCBJgLJPtMt

稿源:巴比特资讯(http://www.8btc.com/tan90d33)

版权声明: by nc" sa 作者保留权利。文章为作者独立观点,不代表巴比特立场。
发文时比特币标准价格 买价:¥2976.04 卖价:¥2970.09

评论:25

您需要登录后才可以回复 登录|注册
    Author Image
    heater 326 天前

    1,定义软分叉:旧有节点同样承认新的区块是合法的(向后兼容),其上的交易也是合法的。隔离见证是通过把签名挪出区块,创建了一种在旧节点看起来“谁都可以花”的消费。但是新节点必须验证签名,因此尝试不用签名就想花掉这些交易的行为将不被新节点接受,旧节点可能接受但是会导致孤块,此时可能会有分叉,因此新节点需要大量算力支持才可以避免分叉。
    2,定义硬分叉:硬分叉之后,旧有节点将不再支持新节点打包的块(向前兼容),但是新节点可以兼容旧节点打包的块。硬分叉往往是需要出块投票完成的,才能保证有足够的算力支持新链,通过链的竞争让新链越来越长。可能的问题是当旧节点算力持续下降,也许出快难度越来越低,那么用一个超级快的算力,也许可以迅速完成 2016 块,让旧节点挖矿速度超过新节点,此时旧节点的链将长于新节点,成为最长链。此时其他节点怎么看待这两条链我还没有找到一个合适的说法。毕竟,比特币社区还从未有过硬分叉的经验,简单的说,这就是取得现有算力的支持,在承认原有比特币的基础之上,切换到新的链上,通过算力竞争来完成分叉。

    也许 8MB 稍微有点儿大,但是 XL 的硬分叉方案看起来也是很安全的。大家都开始支持的时候才实施,没有等到这个时间节点可以一直等下去。取得了共识的分叉不应该被称为替代币。

    +1
    +1
    我要点评
    狗狗币
    狗狗币 330 天前

    【遗留三个问题】我来根据我理解解答下,1,不需要100%认同,可以两版本一直共存下去,这才是软分叉。像压缩格式的地址与正常地址共存。2,拓展交易ID的攻击和隔离见证是两码事,不是不能修复而是没必要,且得不偿失。3,对于历史交易可以以区块链为准即可,不用管是哪种签名,隔离还是不隔离。

    +1
    +1
    我要点评
    Author Image
    北漂大虾 330 天前

    学习

    +1
    +1
    我要点评

    //@孤独的异客:希望其他人也学习一下。

    +1
    +1
    我要点评
    孤独的异客
    孤独的异客 331 天前

    希望其他人也学习一下。

    +1
    +1
    我要点评
    twincan
    twincan 331 天前

    //@昌用: [good]

    +1
    +1
    我要点评
    闪电HSL
    闪电HSL 331 天前

    学习隔离见证的机会来了,BIP 141-144的作者在本贴后面答疑,各位程序员工程师还不快上。一统天下指日可待。//@闪电HSL: 不知道我对隔离见证的理解对不对,忐忑不安[可怜]

    +1
    +1
    我要点评
    Author Image
    jl2012 331 天前

    问题1: 当95%矿工同意前, 不会实行BIP141; 95%矿工同意后, 以后所有的区块都会支持BIP141

    问题2: “并在交易记录里内置一个指向签名信息的指针” 这是错的. 其实并没有你图中画的指针, 也不需要. 见证ID是可变的, 但不会影响交易ID

    问题3: 不支援BIP141的钱包软件仍可完全正常使用, 所生产的交易和从前是一模一样的, 也就是说仍然会受到延展性攻击

    +1
    +1
    我要点评
      Author Image
      tan90d 331 天前

      见证ID可变的该怎么理解?是指掌握私钥就可以实现交易可逆吗?

      +1
      +1
      我要点评
        Author Image
        jl2012 331 天前

        确认了的交易从来都不会可逆. 在确认前, 私钥持有人一直都可以改变txid, 这基本上就是双花, 无论有没有BIP141都是一样. 延展性攻击是指就连非私钥持有人(即所有人) 都可以改变未确认交易的txid, 这才是BIP141要解决的问题.

        BIP141要求每个交易有两个ID, 一个是中本聪定义的txid, 一个是新的witness id. BIP141交易的txid是不可变的(私钥持有人除外), 而witness id在确认前是所有人都可以改变的. 但改变了witness id也不会改变txid, 而交易状态只由txid决定, 所以改变了witness id也没所谓

        +1
        +1
        我要点评
          Author Image
          tan90d 331 天前

          听起来好腻害的。

          +1
          +1
          我要点评
    闪电HSL
    闪电HSL 331 天前

    不知道我对隔离见证的理解对不对,忐忑不安[可怜]

    +1
    +1
    我要点评
    Author Image
    jl2012 331 天前

    所谓”有别于传统的地址”, 用正确的技术语言就是”有别于传统的scriptPubKey”, 但恐怕会吓怕更多读者. 而且说”有别于传统的地址”也没错, 因为BIP142定义了两种新地址, 一种是这样的: B4YZZ3nMBETWVF9ZSfotSwTxVnqhdkTi7r, 另一种是这样的: bayyyy7-yyyyyyy-yyq4wte-eyejc3q-5sybwic-8iksqoo-h6mah9w-o4oprhm-767nfc4-jwk86o

    +1
    +1
    我要点评
      Author Image
      tan90d 331 天前

      嗯,正在阅读BIP142

      +1
      +1
      我要点评
    巴比特资讯
    巴比特资讯 331 天前

    【隔离见证学习笔记】在这周隔离见证BIP的草拟者刊登了一文《隔离见证是什麽? 为什麽我们必须尽快实行?》,我读完后,大吃一惊,更糊涂了。再一次重新理了一遍比特币的交易数据结构,感觉终于把隔离见证搞到了略懂。 现在我把学习笔记分享出来。http://t.cn/R49SesE 作者@闪电HSL

    +1
    +1
    我要点评
    Author Image
    jl2012 331 天前

    你好, 我是《隔离见证是什么? 为什么我们必须尽快实行?》一文的作者, 也是BIP141-143的作者. 你的所有问题其实就已经在BIP141 (https://github.com/bitcoin/bips /blob/master/bip-0141.mediawiki) 解答了, 很简单讲, BIP141用户的收款地址, 在旧用户**看起来**是一个无需签署也能花费的地址, 因此可以绕过了旧有的规则. 但只要有95%矿工同意, 这是绝对安全的, 因为对矿工而言那些并不是可以随意花费的地址. 你需要对比特币脚本语言(https://en.bitcoin.it/ wiki/Script) 有一定理解才能明白. 我之后可以另外把BIP141以中文解释一遍

    +1
    +1
    我要点评
      Author Image
      tan90d 331 天前

      我也去读一下。谢谢。

      +1
      +1
      我要点评
        Author Image
        jl2012 331 天前

        你的汇款例子很好, 基本上就是这原理. 但你有一个误会. 在BIP 141生效后, 只有新钱包产生的交易才会有隔离见证, 旧钱包产生的交易是和以前一模一样的

        +1
        +1
        我要点评
          Author Image
          tan90d 331 天前

          如果是这样,那BIP 141生效后,矿工打包区块时,一个区块可能存在两种交易数据结构吗?还是区块链可能存在两种不一样的区块?

          +1
          +1
          我要点评
            Author Image
            jl2012 331 天前

            一个区块可能存在两种交易数据结构

            +1
            +1
            我要点评
            Author Image
            jl2012 331 天前

            BIP144有一張圖

            +1
            +1
            我要点评
              Author Image
              tan90d 331 天前

              看到了,但我看不懂啊,怎么弄啊【哭】

              +1
              +1
              我要点评
                Author Image
                jl2012 331 天前

                txid按上图计算(也就提按中本聪的定义), witness ID按下图计算.

                BIP141交易传给旧节点时只传上图, 传给新节点时只传下图.

                非BIP141交易一律以上图传送

                +1
                +1
                我要点评
                Author Image
                jl2012 331 天前

                ….(也就是按中本聪的定义)….

                +1
                +1
                我要点评