menu 牢记自己是菜
智能合约安全分析学习----Day1 区块链1.0 比特币的基本工作原理
1418 浏览 | 2020-07-17 | 阅读时间: 约 5 分钟 | 分类: 智能合约 | 标签:
请注意,本文编写于 1377 天前,最后修改于 1377 天前,其中某些信息可能已经过时。

0x1 前言

智能合约就是我们口中长讲到的比特币的一个集合,它是一种分布式虚拟的货币。自从看见XCTF的比赛中,看见一道关于区块链的题目,就对这方面的产生了浓厚的兴趣,于是准备在暑假进行一波学习,这里感谢子洋师傅推荐图书《智能合约安全分析和审计指南》。本书但感觉有一些像专业课的课本,于是我准备使用复习整理的方法进行阅读和理解(并且为自己起到一个督促复习的作用)。主要参考资料为《智能合约安全分析和审计指南》。


0x2 比特币的运行机制

0x2a账簿的概念

首先智能合约是一个面向过程的合约,它不同于传统的银行记录账户余额的记账方式,而是采用记录每一笔交易,包括付款人,收款人,交易金额。并且所有的账簿都对外公开,只要有人需要就可以获得当前的完整账簿。所以只要账户初始状态确定,每笔交易可靠按照时间排序,就可以推算出个人的持有金额。

0x2b引入身份签名机制

对于一个公开的账簿我们一定是需要保护收款人的个人信息,所以通过公钥加密系统对每个人的信息进行了一次加密。每个人都拥有自己的唯一代号,并且不可以被仿制。并且每个人会拥有一个唯一的数字签名,在每次进行交易时都会将这个数字签名随着交易账单发出。在接收方会同时的收到发送方的一个数字签名和一张交易账单,然后接收方会对数字签名进行解密,若与账单收款人一致即可确定账单的真实性。

0x2c 虚拟矿工组织

这就是我们口中常说的挖矿,他们的职责是监控整个网络内所有交易记录是否合法。他们在挖矿期间有一定可能性获得报酬,且挖矿的付出的努力越多,报酬就越高。由于为了是整个智能合约处于一个安全状态,所以在比特币的合约中采用了去中心化和随机的设计。即每个矿工可以随时加入,随时退出。并且存在一个随机机制,需要每个矿工进行一遍一遍的大规模测试,才可以得到正确地合约。(这个机制在矿工工作中再详细说说)

0x2c 交易与支付

这是合约中的重要流程,正常情况下主要分为三个阶段:

  1. 支付方填写账单内容,并且盖上自己独有的数字签名。并且将这份账单投递给收款方与所有的矿工。
  2. 收款方在接到协议后会对整个账单进行确认,确认账单是否合法
  3. 由矿工进行交易的核算,最终第一个提出合法的账簿的矿工会得到比特币的奖励。
    这里有几个需要注意的地方:

首先:矿工从合约中得到比特币是比特币唯一的发行手段
其次:比特币最终会维持到21000000枚以防比特币贬值。在最初的210000页(总账单),每完成一份账单会得到50枚比特币的奖励,之后奖励会减半,减为25枚,依次类推。当达到6930000页时,新的账单就不会得到奖励了。此时不意味着矿工会失去奖励而是意味着比特币已经广泛的流通起来,之后的矿工所获得的奖励将会是每个账单的手续费。

0x3 矿工的工作与工作流程

  1. 每个矿工在工作开始前会复制一份初始的账簿和若干张白纸。在白纸上会有账簿的结构,包括“交易单”,“本账单编号”,“上单账单号”,与一个“幸运数字”。
  2. 每一个矿工会拥有一个编码生成器(散列函数实现),矿工需要将在网络上收到的账单中的内容填入白纸,之后编码生成器就会将生成的散列放入“本账单编号”中,这个生成的编号只与内容有关,与时间,填写者都无关。相同内容的生成的编码总是一致的,编码生成器会自动核对相关的数字签名等内容,若不一致则会拒绝打印编码。

工作的具体流程和相关细节:

  1. 收集交易单
  2. 填写账簿:矿工将自己的初始账簿(或者是现有账簿)的编号抄入“上一张账单编号”,写入账单内容,随便填入一个“幸运数字”,这就算是完成了一张账簿的制作。但是这个账单不一定有效,只有当“本账单编号”前10位数字全为零时才算是一张有效账单。由于账单不能修改,所以只能修改"幸运数字"来控制编号。这种设定只是为了增大工作量,保障合约安全。(这个之后再说)
  3. 确认账单:当一个矿工幸运的生成了一张订单时,它需要立刻向所有其余的矿工确认自己的工作。每个矿工就像得到中断一样立即处理此订单的确认。他们需要确认的有三个:账簿纸是否有效,前一张是否有效,交易单是否有效。当确认订单有效后,确认矿工会立刻舍弃当前工作,将确认后的账单加入自己的主账簿,然后进行下一次工作。
  4. 确认反馈:当这个矿工收到其余人的确认时,发现“上一张账单编号”为自己之前送出的账单号,则自己的工作被确认了。

0x4 一些细节分析

  1. 同时收到两份和法账单:整个主账簿是以树状结构进行组织的,每次都会选择最长的链进行后续计算。
  2. 有人试图做伪帐:原理先生成交易A使A交易被挂上主账簿,在得到A提供的物资后,对整个主账簿的保留线(另一条分支)进行延长,直至超过有着A交易记录的分支。从而达到撤销A交易的目的。解决方案:收款人不可以在公告被发出时立即进行交易完成的操作,而是需要等待6个矿工小组对这个订单完成确认(每次确认意味着有新的交易被算出来了,分支上又多了一个订单)后才可确认交易未取消。此时如果攻击者想要使另一条分支超过此分支,需要大量的人力物力与财力完成6个块的追赶(难度大)。如果攻击者有如此多的资源,还不如好好挖矿,这样可能会赚的更多。

发表评论

email
web

全部评论 (共 1 条评论)

    2020-07-17 16:08
    买不起这本书,告辞