美文网首页
比特币进阶

比特币进阶

作者: 柳正来 | 来源:发表于2018-08-01 14:26 被阅读28次

    比特币交易格式

    比特币中没有账户的概念, 只有UTXO. 每一笔交易的输入来自上一笔交易的输出.
    UXTO的拥有者, 在交易时, 对UTXO进行签名.
    输入输出的差值作为交易费.

    比特币的交易上传过程

    节点上传交易到交易池. 矿工根据"交易费/字节"最高的原则选取交易.

    不可扩展

    问题

    比特币需要所有节点保持所有区块同步来保证安全性.
    区块同步速度受到区块大小, 响应延迟和网络速度的制约
    目前比特币的输出: 7TX/S (最高), 4TX/S (平均)

    解决方案

    • 对于区块发布者而不是区块做工作证明, 因此安全性只受到发布者共识同步速度的制约, 而不受区块大小的制约. 这样就是领袖选举问题.
      • 采用BFT或者其他惩罚措施来保证发布者发布区块的安全性
    • 采用DAG, 使用算力最重作为共识 (而不是比特币中的链最长), 这样使得安全性不受链状结构分叉的影响.

    可变性与隔离见证

    可变性/延展性(Malleability)问题

    比特币交易编号由交易的Hash生成.
    比特币的交易格式不十分严格. 比如, 有些地方不区分大小写. 有很多方法可以对一笔交易进行微笑的改动得到同样一笔合法交易, 甚至不需要知道私钥.

    你可以通过一个交易ID来确定该交易是否在链上, 但通过链上的交易无法确定交易ID. 一个交易可以有多个ID.
    比特币的设计缺陷, 不影响比特币本身的安全性.
    如果交易所不考虑这个问题, 则可能产生安全漏洞. 如MT.GOX事件:

    1. 攻击者想要换取比特币, 交易所自动生成一笔交易T发到交易池
    2. 交易者从交易池获取交易, 对交易进行细微改变生成ID完全不同的同一笔交易T'
    3. T'有一定概率被矿工传上链, 而T会被认为是双重支付而被忽略.
    4. 攻击者告知交易所没有收到相应的比特币
    5. 交易所没有考虑到可变性问题, 用交易T的ID去链上检索, 发现并没有在链上, 因此认定交易失败, 于是重新生成一笔交易发给攻击者.

    隔离见证

    正常交易: 付给地址A, 当再次转账时, 用A的私钥签名授权.
    P2SH交易(pay-to-script-hash): 付给一个脚本的哈希值, 当再次转账时, 提供脚本, 内容如"提供了A的签名的人可以支付这笔钱", 然后提供A的签名授权.
    P2SH交易的一个应用场景: 脚本中要求使用多个私钥进行签名.

    隔离见证交易 (P2WSH, pay-to-witness-script-hash)

    1. 先通过P2WSH交易激活, 接受者要求发送者发到一个脚本的Hash, 脚本如"提供了H(A签名)的人可以支付这笔钱"
    2. 接受者再次转账时, 提供"提供了H(A签名)的人可以支付这笔钱"的脚本, 同时提供H(A签名).
    3. 采用隔离见证的每个区块之后有一个附录记录所有采用了隔离见证交易的见证信息.
    4. A在附件中提供签名, 授权交易. 所有采用了隔离见证的节点会验证签名.

    更多内容见: https://bitcoincore.org/en/segwit_wallet_dev/

    有个问题, 没有升级过的节点不会验证带有隔离见证信息的交易, 直接通过. 这样有个问题, 如果只有很少数人使用SegWit的话, 交易的安全性就无法保障, 导致分叉风险.

    隔离见证解决了可变性的问题: 因为原本可变的只有见证部分.

    疑问: 见证信息是如何保存的?

    自私挖矿问题

    比特币没有超过50%诚实节点的假设, 只有理性节点的假设, 即节点是单纯逐利的, 换句话说, 他们会用一切办法去获得更多的利益.

    比特币世界里, 获利是唯一的原则.

    所以, 如果遵守规则不能获利, 节点就没有义务遵守规则.

    背景知识

    分叉: 当一个合法的区块被挖出但是还没有传播到整个网络的时候, 如果此时产生另一个合法区块, 这两个合法区块会导致比特币网络产生短暂的分叉, 形成两个竞争的网络. 当一个区块胜出时, 另一个区块就成为孤块(Orphan Block)

    区块竞争胜出的几率取决于网络代表的算力大小, 而能否争取到更多的算力取决于区块传播的速度.

    自私挖矿

    过程:

    • 自私矿池挖到块A之后不直接发布全网, 只在自己的矿池中广播该块, 形成私有链, 并且继续挖下一块B
    • 当检测到网络上有人发出下一块A'时, 再广播自己挖到的块, 使网络进入竞争状态.
      • 如果自私矿池挖出B时, 直接发布, 让全网转到自己的链上, 自己获得块A和块B的收益, 同时浪费掉了网络在A'以及分叉上使用的算力.
      • 如果诚实节点在块A后挖出了新块, 那么自私矿池享受块A的利益.
      • 如果诚实节点在块A'后挖出新块, 那么自私矿池不获利.

    核心: 让诚实节点浪费算力, 相当于让自私矿池的算力提高了, 更容易出块获利.

    自私挖矿论文

    image.png
    • 如果竞争胜出概率为0, 当算力超过33%时, 自私挖矿有利. (见论文数值分析)
    • 如果竞争胜出概率为1/2, 当算力超过25%时, 自私挖矿有利. (见论文数值分析)
    • 如果竞争胜出概率为1, 任何情况自私挖矿都有利. (因为我提前开始挖下一块)

    自私矿池可以通过很多方式提高胜率, 如DDOS大矿池让他们更不容易挖出块.

    危害: 如果自私矿池出现, 由于收益更高, 会吸引更多矿工加入. 最终整个网络其他节点被迫自私挖矿, 导致网络安全性下降.
    理论上: 比特币只有在恶意节点不超过25%算力时才安全.
    实际中: 目前没有发现自私挖矿行为.

    传播奖励问题

    交易发起者要将交易广播给所有矿工:

    • 交易者不知道所有矿工的位置
    • 依赖GOSSIP协议, 希望其他节点也能够帮助散播交易
    • 交易散播到的矿工越多, 交易越容易被打包上链.

    问题:

    • 传播交易没有奖励, 而且相反:
      • 对于矿工, 越多矿工知道这笔交易, 这笔交易被自己打包的几率越小. 比方说有一个交易矿工费极高, 矿工有动机拒绝散播该交易, 尝试自己打包获利.
      • 所以, 交易费越高, 矿工越不想散播交易, 交易上链越慢 -- 与交易费的期望相悖
      • 随着区块奖励减少, 矛盾会越来越尖锐.'

    ASIC矿机

    算力变迁历史: CPU -> GPU -> FPGA -> ASIC (特殊应用集成电路)

    ASIC特点: 专用(对应单一算法), 高效 (对于挖矿计算), 生产周期长, 沉没成本高, 但单位成本小于其他挖矿方式.

    垄断:
    • ASIC矿机算力成本远小于其他矿机, 大家只能用ASIC矿机.
    • 沉没成本高, 新入市场的竞争者在价格上无法与已经规模化的公司竞争. 后者可以轻易通过降价击溃对手

    解决方案: 采用ASIC抵抗的POW.

    安全与中心化

    如果节点获得50%算力, 他们如何获得收益?
    双重支付.
    成本:

    • 沉没成本=矿机成本 (双重支付导致币价暴跌, 矿机费了)
    • 机会成本 (不攻击专心挖矿的成本 减去 干别的的成本)
      联合挖矿:
    • 某币采用和比特币联合挖矿, 即 -- 比特币矿工可以同时挖某币的矿.
    • 某币拥有很高的初始算力, 似乎很安全.
    • 然而:
      • 沉没成本 = 攻击损失的奖励, 因为攻击者不需要购置额外矿机.
      • 机会成本低, 因为币价低且长期前景不明.
    • 于是, 比特币的大矿池可以轻易摧毁某币, 付出的基本只有几个区块的奖励而已.

    理想的POW:
    沉默成本高: 矿机专用(不能挖别的币)且成本高.
    机会成本高: 挖矿收益高
    然而:
    • 矿机专用成本高=进入门槛高
    • 挖矿收益高=竞争激烈=需要降低成本
    最终结果, 中心化. (有钱人可以大规模购买昂贵的矿机, 别人难以竞争, 导致垄断)

    算力 vs 开发者

    20世纪后半段 政治的翻版. 资本主义 vs 共产主义

    比特大陆, 获益最多, 投入最多, 话语权最大. 不贡献算力的节点在比特币世界没有话语权.
    算力是比特币世界的掌权者和最大既得利益者.
    如果算力不能代表大多数人的利益, 应该怎么办?

    总结

    比特币是成功的社会实验, 是区块链的发起者

    比特币想要成为去中心化的货币的目标没有达成 -- 比特币的控制权几经易手, 目前仍然落在某中心手中.

    那么, 问题究竟出在哪里?

    相关文章

      网友评论

          本文标题:比特币进阶

          本文链接:https://www.haomeiwen.com/subject/tcxrvftx.html