比特币白皮书阅读笔记+随想

学习心得 区块链 比特币
比特币白皮书下载地址


比特币

几个概念

拜占庭问题

也称拜占庭将军问题(Byzantine failures),是由莱斯利·兰伯特提出的点对点通信中的基本问题。含义是在存在消息丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。因此对一致性的研究一般假设信道是可靠的,或不存在本问题。其实讲的就是关于消息传递的时候的是否有效问题,如果这期间消息传递的过程中出现了叛徒,就会导致消息传递不一致问题。

女巫攻击

  • 相当于控制一个节点来伪造多个节点进行登录或者交易活动,我的理解就相当于在交易过程中的双花。
  • 一个攻击者可以在一台服务器或者僵尸网络上创建数以千计的节点,从而单方面确保拥有多数份额。

UTXO

未花费的交易输出(unspent transaction outputs)

默克尔树

  • 具有二叉树的所有性质,也可以是多叉的,它最大的特点就是具有共同父亲的子节点的字符串合并起来进行哈希运算,以此类推,最后形成一个根节点。
  • 有很广泛的作用,例如p2p传输

历史

  • 当中本聪在2009年1月启动比特币区块链时,他同时向世界引入了两种未经测试的革命性的新概念。第一种就是比特币(bitcoin),一种去中心化的点对点的网上货币,在没有任何资产担保、内在价值或者中心发行者的情况下维持着价值。到目前为止,比特币已经吸引了大量的公众注意力, 就政治方面而言它是一种没有*银行的货币并且有着剧烈的价格波动。然而,中本聪的伟大试验还有与比特币同等重要的一部分:基于工作量证明的区块链概念使得人们可以就交易顺序达成共识。作为应用的比特币可以被描述为一个先申请(first-to-file)系统:如果某人有50BTC并且同时向A和B发送这50BTC,只有被首先被确认的交易才会生效。没有固有方法可以决定两笔交易哪一笔先到,这个问题阻碍了去中心化数字货币的发展许多年。中本聪的区块链是第一个可靠的去中心化解决办法。现在,开发者们的注意力开始迅速地转向比特币技术的第二部分,区块链怎样应用于货币以外的领域。

  • 常被提及的应用包括使用链上数字资产来代表定制货币和金融工具(彩色币),某种基础物理设备的所有权(智能资产),如域名一样的没有可替代性的资产(域名币)以及如去中心化交易所,金融衍生品,点到点**和链上身份和信誉系统等更高级的应用。另一个常被问询的重要领域是“智能合约”- 根据事先任意制订的规则来自动转移数字资产的系统。例如,一个人可能有一个存储合约,形式为“A可以每天最多提现X个币,B每天最多Y个,A和B一起可以随意提取,A可以停掉B的提现权”。这种合约的符合逻辑的扩展就是去中心化自治组织(DAOs)-长期的包含一个组织的资产并把组织的规则编码的智能合约。以太坊的目标就是提供一个带有内置的成熟的图灵完备语言的区块链,用这种语言可以创建合约来编码任意状态转换功能,用户只要简单地用几行代码来实现逻辑,就能够创建以上提及的所有系统以及许多我们还想象不到的的其它系统。

比特币交易

一个区块,每个区块包含一个时间戳、一个随机数、一个对上一个区块的引用(即哈希)和上一区块生成以来发生的所有交易列表。这样随着时间流逝就创建出了一个持续增长的区块链,它不断地更新,从而能够代表比特币账本的最新状态。

  • 检查区块是否有效

    1. 检查区块引用的上一个区块是否存在且有效。
    2. 检查区块的时间戳是否晚于以前的区块的时间戳,而且早于未来2小时。
    3. 检查区块的工作量证明是否有效。
    4. 将上一个区块的最终状态赋于S[0]。
    5. 假设TX是区块的交易列表,包含n笔交易。对于属于0……n-1的所有i,进行状态转换S[i+1] = APPLY(S[i],TX[i])。如果任何一笔交易i在状态转换中出错,退出程序,返回错误。
    6. 返回正确,状态S[n]是这一区块的最终状态。
  • 挖矿
    比特币白皮书阅读笔记+随想
    本质上,区块中的每笔交易必须提供一个正确的状态转换,要注意的是,“状态”并不是编码到区块的。它纯粹只是被校验节点记住的抽象概念,对于任意区块都可以从创世状态开始,按顺序加上每一个区块的每一笔交易,(妥妥地)计算出当前的状态。另外,需要注意矿工将交易收录进区块的顺序。如果一个区块中有A、B两笔交易,B花费的是A创建的UTXO,如果A在B以前,这个区块是有效的,否则,这个区块是无效的。
    区块验证算法的有趣部分是“工作量证明”概念:对每个区块进行SHA256哈希处理,将得到的哈希视为长度为256比特的数值,该数值必须小于不断动态调整的目标数值,本书写作时目标数值大约是2^190。
    工作量证明的目的是使区块的创建变得困难,从而阻止女巫攻击者恶意重新生成区块链。因为SHA256是完全不可预测的伪随机函数,创建有效区块的唯一方法就是简单地不断试错,不断地增加随机数的数值,查看新的哈希数值是否小于目标数值。如果当前的目标数值是 2^192 ,就意味着平均需要尝试 2^64 次才能生成有效的区块。一般而言,比特币网络每隔2016个区块重新设定目标数值,保证平均每十分钟生成一个区块。为了对矿工的计算工作进行奖励,每一个成功生成区块的矿工有权在区块中包含一笔凭空发给他们自己25BTC的交易。另外,如果交易的输入大于输出,差额部分就作为“交易费用”付给矿工。顺便提一下,对矿工的奖励是比特币发行的唯一机制,创世状态中并没有比特币。

  • 比特币的安全性
    先举一个小例子,比如有一个恶意攻击者,选择攻击没有被密码学保护的部分(被密码学保护的部分安全形势非常高的,目前几乎不可被**),而这个部分就是,交易顺序(所谓双花出现的地方)。
    攻击者的策略非常简单:

    1. 向卖家发送100BTC购买商品(尤其是无需邮寄的电子商品)。
    2. 等待直至商品发出。
    3. 创建另一笔交易,将相同的100BTC发送给自己的账户。
    4. 使比特币网络相信发送给自己账户的交易是最先发出的。
  • 分析
    一旦步骤(1)发生,几分钟后矿工将把这笔交易打包到区块,假设是第270000个区块。大约一个小时以后,在此区块后面将会有五个区块,每个区块间接地指向这笔交易,从而确认这笔交易。这时卖家收到货款,并向买家发货。因为我们假设这是数字商品,攻击者可以即时收到货。现在,攻击者创建另一笔交易,将相同的100BTC发送到自己的账户。如果攻击者只是向全网广播这一消息,这一笔交易不会被处理。矿工会运行状态转换函数APPLY(S,TX),发现这笔交易将花费已经不在状态中的UTXO。所以,攻击者会对区块链进行分叉,将第269999个区块作为父区块重新生成第270000个区块,在此区块中用新的交易取代旧的交易。因为区块数据是不同的,这要求重新进行工作量证明。另外,因为攻击者生成的新的第270000个区块有不同的哈希,所以原来的第270001到第270005的区块不指向它,因此原有的区块链和攻击者的新区块是完全分离的。在发生区块链分叉时,区块链长的分支被认为是诚实的区块链,合法的的矿工将会沿着原有的第270005区块后挖矿,只有攻击者一人在新的第270000区块后挖矿。攻击者为了使得他的区块链最长,他需要拥有比除了他以外的全网更多的算力来追赶(即51%攻击)。

  • 结论
    由于至少需要51%的用户出现攻击行为,并且要求对着一个区块进行重新覆写运算,所以在理论上,比特币作为用户庞大的的应用系统,不会被强制**。
    至少对想要攻击的人来说,这种行为得不偿失(游说51%的人来支持攻击行为着实是极端困难)。

比特币系统下的其他区块链应用

  • 域名币(namecoin)
    创建于2010年,被称为去中心化的名称注册数据库。像Tor、Bitcoin和BitMessage这样的去中心化协议,需要一些确认账户的方法,这样其他人才能够与用户进行交互。但是,在所有的现在所有的现存的解决方案中仅有的可用的身份标识是像1LW79wp5ZBqaHW1jL5TciBCrhQYtHagUWy这样的伪随机哈希。理想的情况下,人们希望拥有一个带有象“george”这样的名称的账户。然而,问题是如果有人可以创建“george”账户,那么其他人同样也可以创建“george”账户来假扮。唯一的解决方法是先申请原则(first-to-file),只有第一个注册者可以成功注册,第二个不能再次注册同一个账户。这一问题就可以利用比特币的共识协议。域名币是利用区块链实现名称注册系统的最早的、最成功的系统。
  • 彩色币(Colored coins)
    彩色币的目的是为人们在比特币区块链上创建自己的数字货币,或者,在更重要的一般意义上的货币 – 数字令牌提供服务。依照彩色币协议,人们可以通过为某一特别的比特币UTXO指定颜色,发行新的货币。该协议递归地将其它UTXO定义为与交易输入UTXO相同的颜色。这就允许用户保持只包含某一特定颜色的UTXO,发送这些UTXO就像发送普通的比特币一样,通过回溯全部的区块链判断收到的UTXO颜色。
  • 元币(Metacoins)
    元币的理念是在比特币区块链上创建新的协议,利用比特币的交易保存元币的交易,但是采用了不同的状态转换函数APPLY’。因为元币协议不能阻止比特币区块链上的无效的元币交易,所以增加一个规则如果APPLY’(S,TX)返回错误,这一协议将默认APPLY’(S,TX) = S。这为创建任意的、先进的不能在比特币系统中实现的密码学货币协议提供了一个简单的解决方法,而且开发成本非常低,因为挖矿和网络的问题已经由比特币协议处理好了。

比特币脚本

  • 对脚本的一些理解

    • 比特币的脚本实际就是保障交易顺利进行的一种机制,或者说是一种运算方法,分为锁定脚本与解锁脚本。锁定脚本与UTXO相对应,一个UTXO包含一个锁定脚本。
    • 当交易产生的时候,就需要验证之后才能在网络中传播,所以解锁脚本是与某些交易相关联的。
    • 锁定脚本被叫做scriptPubKey, 解锁脚本被叫做ScriptSig
    • 脚本具体的实现就是命令+参数。
    • 能在一定程度上充当智能合约的角色。但是会有一些缺点。
  • 比特币脚本的严重限制

    • 缺少图灵完备性
      这就是说,尽管比特币脚本语言可以支持多种计算,但是它不能支持所有的计算。最主要的缺失是循环语句。不支持循环语句的目的是避免交易确认时出现无限循环。理论上,对于脚本程序员来说,这是可以克服的障碍,因为任何循环都可以用多次重复if 语句的方式来模拟,但是这样做会导致脚本空间利用上的低效率,例如,实施一个替代的椭圆曲线签名算法可能将需要256次重复的乘法,而每次都需要单独编码。

    • 价值盲(Value-blindness)
      UTXO脚本不能为账户的取款额度提供精细的的控制。例如,预言机合约(oracle contract)的一个强大应用是对冲合约,A和B各自向对冲合约中发送价值1000美元的比特币,30天以后,脚本向A发送价值1000美元的比特币,向B发送剩余的比特币。虽然实现对冲合约需要一个预言机(oracle)决定一比特币值多少美元,但是与现在完全中心化的解决方案相比,这一机制已经在减少信任和基础设施方面有了巨大的进步。然而,因为UTXO是不可分割的,为实现此合约,唯一的方法是非常低效地采用许多有不同面值的UTXO(例如对应于最大为30的每个k,有一个2^k的UTXO)并使预言机挑出正确的UTXO发送给A和B。

    • 缺少状态
      UTXO只能是已花费或者未花费状态,这就没有给需要任何其它内部状态的多阶段合约或者脚本留出生存空间。这使得实现多阶段期权合约、去中心化的交换要约或者两阶段加密承诺协议(对确保计算奖励非常必要)非常困难。这也意味着UTXO只能用于建立简单的、一次性的合约,而不是例如去中心化组织这样的有着更加复杂的状态的合约,使得元协议难以实现。二元状态与价值盲结合在一起意味着另一个重要的应用-取款限额-是不可能实现的。

    • 区块链盲(Blockchain-blindness)
      UTXO看不到区块链的数据,例如随机数和上一个区块的哈希。这一缺陷剥夺了脚本语言所拥有的基于随机性的潜在价值,严重地限制了博彩等其它领域应用。