比特币原理详解_第1页
比特币原理详解_第2页
比特币原理详解_第3页
比特币原理详解_第4页
比特币原理详解_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

比特币原理详解 一 什么是比特币 比特币是一种电子货币 是一种基于密码学的货币 在 2008 年 11 月 1 日由中本聪发表比特 币白皮书 文中提出了一种去中心化的电子记账系统 我们平时的电子现金是银行来记账 因为银行的背后是国家信用 去中心化电子记账系统是参与者共同记账 比特币可以防止主 权危机 信用风险 其好处不多做赘述 这一层面介绍的文章很多 本文主要从更深层的技 术原理角度进行介绍 二 问题引入 假设现有 4 个人分别称之为 ABCD 他们之间发起了 3 个交易 A 转给 B10 个比特币 B 转 给 C5 个比特币 C 转给 D2 个比特币 如果是传统的记账方式 这些交易会记录在银行的系 统中 这些信息由银行来记录 我们相信银行不会随意添加 删除或修改一条交易记录 我 们也不会关注到底有哪些交易 我们只关注自己的账户余额 而比特币的记账方式为 ABCD 每个人保存了这样一份账本 账本上记录了上述交易内容 如果每个人账本实时的一致 ABCD 就不再需要银行 比特币是这样做的 每当有人发起一笔交易 他就要将一笔交易广播至全网 由全网 中的某一个人 把一段时间内的交易打包好记录到一个区块上 再按照顺序把这些区块 一 个一个的链接在一起 进而形成了一个链条 这就是所谓的区块链 那么问题来了 1 我凭什么要参与这个系统 我为什么要动用自己的计算机资源来存储这些信息呢 2 以谁的记录为准呢 比如上面的账单顺序 A 用户可能是这个顺序 但是 B 可能顺序不 一样 甚至可能 B 根本就没有接收到 C 给 D 转账的这个消息 3 比特币如果做到支付功能 保证该是谁的钱就是谁的钱 而且只有其所有者才能花 4 如何防伪 防篡改以及双重支付 防伪是验证每条交易的真的是某人发出的 比如 B 可能 杜撰一条消息 说某某给我转了一笔钱 这就是一个假消息 或者 B 说我给某人转了多少钱 但是实际上他并没有这么多钱 又怎么办 防篡改指的是 B 可能想从区块链上把自己曾经转 给某人钱的记录删掉 这样他的余额就会增加 双重支付是指 B 只有 10 比特币 他同时向 C 和 D 转 10 个比特币 造成双重花费 三 为什么要记账 因为记账有奖励 记账有手续费的收益 而且打包区块的人有系统奖励 奖励方案是 每十 分钟生成一个区块 每生成一个区块会奖励一定数量的比特币 最开始是 50 个 BTC 过 4 年会奖励 25 个 BTC 再过 4 年再减少一半 以此类推 这样比特币的产生会越来越少 越来 越趋近于一个最大值 计算公式是 50 6 24 365 4 1 1 2 1 4 1 8 2100 万 其中最初 奖励 50 个比特币 每小时有 6 个区块 每天 24 小时 每年 365 天 前四年是如此 之后每四 年减半 此外 记账奖励还有每笔交易的小额手续费 每个交易发起都会附带一定的手续费 这些手 续费是给记账的矿工的 四 以谁为准 各个节点通过工作量证明机制来争夺记账权 他们计算一个很复杂的数学题 第一个计算出 来的节点就是下一个区块的产生者 这个数学题很难 难到没有一个人能同过脑子算出来 它是基于概率的方法 矿工必须通过遍历 猜测和尝试的办法才能解开这个未知数 那么这 个数学难题到底是什么呢 下面详细介绍 4 1 哈希函数 哈希函数又称为数字摘要或散列函数 它的特点是输入一个字符串 可以生成另外一个字符 串 但是如果输入不同 输出的字符串就一定不同 而且通过输出的字符串 不能反推出输 入 举个简单的例子 对 1 100 内的数模 10 可以认为是一种哈希方法 比如 98 10 8 66 10 6 98 和 66 是输入 模 10 是哈希函数 8 和 6 是输出 在这个模型中 通 过 6 和 8 无法推断输入是 66 和 98 因为还可能是 56 和 88 等 当然因为这个例子比较简单 所以会出现哈希碰撞 即 66 和 56 的结果都是 6 输出的结果相同 一个优秀的哈希函数 可 以做到输出一定不同 哈希碰撞的概率几乎为 0 常见的哈希函数有很多 比如 MD 系列和 SHA 系列等 比特币采用的 SHA256 算法 即输入一个字符串 输出一个 256 位的二进制数 下面是程序运行的结果 通过程序结果可以看出 输入的源信息不同 得到的结果也不同 为了方便 结果用 64 位 16 进制表示 即使是 orange 多了一个句号 也会产生截然不同的结果 同时 通过输出的十六 进制字符串 也无法倒推出输入 对于比特币 只要了解 SHA256 的功能即可 如果感兴趣 可以深入了解 SHA256 的具体算法 需要 SHA256 的 C 源码留言邮箱或私信 4 2 挖矿原理 首先介绍一下比特币每个区块的数据结构 每个区块由区块头和区块体两部分组成 区块体中包含了矿工搜集的若干交易信息 图中假设有 8 个交易被收录在区块中 所有的交 易生成一颗默克尔树 默克尔树是一种数据结构 它将叶子节点两两哈希 生成上一层节点 上层节点再哈希 生成上一层 直到最后生成一个树根 称之为默克尔树根 只有树根保留 在区块头中 这样可以节省区块头的空间 也便于交易的验证 区块头中包含父区块的哈希 版本号 当前时间戳 难度值 随机数和上面提到的默克尔树 根 假设区块链已经链接到了某个块 有 ABCD 四个节点已经搜集了前十分钟内全网中的一些 交易信息 他们选出其中约 4k 条交易 打包好 生成默克尔树根 将区块头中的信息 即发 区块哈希 版本号 时间戳 难度值 随机数 默克尔树根组成一个字符串 str 通过两次哈希 函数得出一个 256 的二进制数 即 SHA256 SHA256 str 10010011 共 256 位 比特币 要求 生成的结果 前 n 位必须是 0 n 就是难度值 如果现在生成的二进制数不符合要求 就必须改变随机数的值 重新计算 只到算出满足条件的结果为止 假设现在 n 是 5 则生成 的二进制数必须是 00000 共 256 位 一旦挖矿成功 矿工就可以广播这个消息到全网 其他的矿工就会基于该区块继续挖矿 下一个区块头中的父区块哈希值就是上一个区块生 成的 00000 这个数 解决这个数学难题要靠运气 理论上 运气最好的矿工可能 1 次哈希就能算出结果 运气差 的可能永远都算不出来 但是总体来看 如果一个矿工的算力越大 单位时间内进行的哈希 次数就越多 就越可能在短时间内挖矿成功 那么 n 是如何确定的呢 比特币设计者希望 总体上平均每十分钟产生一个区块 总体上来 看 挖矿成功的概率为 1 2 n 现假设世界上有 1W 台矿机 每台矿机的算力是 14T 次 s 1 4 10 13 次 s 单位次 s 称之为哈希率 10 分钟是 600s 所以 10 分钟可以做 8 10 19 次哈 希运算 从概率角度看 想要挖矿成功需要做 2 n 次运算 可以列出等式 2 n 8 10 19 可 以解出 n 约为 66 所以对于这种方法 我们没有办法使得自己的运气变的更好 只能提高自 己的算力 尽快的算出结果 另外 需要模拟挖矿过程的 C 代码可以回复邮箱 代码可以通过调整难度值 模拟比特币 的挖矿算法 控制区块产生的速度 五 如何防伪 防篡改 防双重支付等问题 这部分是理解比特币很重要的部分 5 1 电子签名技术 身份认证技术在生活中很常见 可以是人脸识别 签字 指纹等 但是这些方法在数字货币 领域并不安全 因为它们一旦数字化 都可以通过复制的方法伪造 所以比特币采用了电子 签名的方法 注册成为比特币用户时 系统会根据随机数生成一个私钥 私钥会生成一个公钥 公钥又会 生成一个地址 其中私钥必须保密 可以保存到硬盘里或者记到脑子里 因为这个私钥是使 用相应地址上的比特币的唯一标识 一旦丢失 所有的比特币将无法使用 下面介绍具体的 转换过程 不感兴趣可以不看 只要知道随机数 私钥 公钥 钱包地址这个过程 其中私 钥可以对一串字符进行加密 而公钥可以对其进行解密 这就是非对称加密 这类算法总体 上的功能都是一样的 只是具体算法有区别 由于这些算法比较复杂 与 SHA265 算法一样 不多做介绍 感兴趣可以深入了解具体算法 但是对于比特币系统 只要了解其功能即可 典型的算法是 RSA 比特币采用椭圆曲线加密算法 转换过程 选读 不影响理解 1 首先使用随机数发生器生成一个私钥 它是一个 256 位的二进制数 私钥是不能公开 的 相当于银行卡的密码 2 私钥经过 SECP256K1 算法生成公钥 SECP256K1 是一种椭圆曲线加密算法 功能和 RSA 算法类似 通过一个已知的私钥 生成一个公钥 但是通过公钥不能反推出私钥 3 同 SHA256 算法一样 RIPEMD160 也是一种 HASH 算法 由公钥可以得到公钥的哈 希值 而通过哈希值无法推出公钥 4 将一个字节的版本号连接到公钥哈希头部 然后对其进行两次 SHA256 运算 将结果 的前 4 字节作为公钥哈希的校验值 连接在其尾部 5 将上一步的结果使用 BASE58 进行编码 就得到了钱包地址 相当于银行账户 比如 A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa 所以 通过以上的过程我们可以总结出私钥 公钥 钱包之间的关系如下图 可以看到通过 私钥可以推出所有的值 公钥哈希和钱包地址之间可以通过 BASE58 和 BASE58 解码算法 相互转化 了解了公钥 私钥 地址的概念后 防伪验证的过程就很容易理解 当 A 发起一笔交易后 对 消息进行哈希 生成数字摘要 对数字摘要 通过私钥加密 生成一个密码 之后 A 会广播这 个条交易消息 公钥以及密码 收到消息的人首先对交易信息进行哈希生成摘要 1 再通过 公钥对密码进行解密 生成摘要 2 这样 如果两个摘要相同 说明这个消息确实是 A 发出 的 所谓的签名 就是密文 5 2 余额检查 余额的概念应该说根深蒂固 余额是伴随着称之为借贷记账法而产生的 也是目前银行普遍 采用的方法 将一个人的交易记录统计好后算出一个余额 但是在比特币中没有余额这个概 念 因为其采用的是 UXTO 模型的记账方法 比如 A B10 个比特币 B C5 个比特币 对 于第二笔交易来说 B 在发起这笔交易时要注明第一笔交易的信息 这样就可以知道 B 曾经 从 A 那里收到过 10 个比特币 说明满足第二笔交易发起的条件 所以比特币中余额的检查 是通过追溯的方法 上图描述了两笔交易 交易 10001 中 B 向 C 转了 10 个比特币 验证这笔交易的过程是 首 先将 B 的签名通过 B 的公钥解密 然后再和交易的具体内容 B 签名左侧 对比 如果相同 说明消息是 B 发出的 然后再检查 10000 这个交易是否真的存在以及它的内容的真实性 这 两点都满足了 就说明交易 10001 是可以被接受的 否则拒绝接受 实际上 真实的交易比这个复杂的多 因为有可能是多笔交易构成了输入 比如 B C20 个 比特币 是由多笔交易 A B10 D B10 构成的 则前一笔交易 ID 就是两个 ID 甚至可能更 多 这里为了简单描述 只列举一笔交易 5 3 双重支付 A 同时发了两条消息 同时给 B 和 C 转了 10 个比特币 实际上他只有 10 个会怎么样 假 设 D 节点先收到了转给 B10 个 BTC 然后收到了转给 C10 个比特币 通过上面的验证方法 自然会拒绝后面的一个 与此同时 E 节点可能先收到了转给 C10 个 BTC 然后收到了转给 B10 个比特币 他自然会拒绝后者 至于哪一笔交易最终会上链 就要看 D 和 E 哪个先解决 难题 成功挖矿 5 4 防止篡改 假设 A 转给 B10 个比特币 但是他想把这个信息从区块链上删除 这样大家就都不知道这 个事情存在 就可以赖账 首先说一下最长链原则 假设某一个区块后面有两个矿工同时挖到了矿 或者由于网 络延迟等原因产生了分歧 这时 各个节点先随意根据自己认为对的区块挖矿 只到下一个 区块产生 这时会有两条链 但是有一条是长的 比特币规定 以最长的链为准 如果某个节 点仍然的固执的以较短的链为准 他就是在和大多数算力作对 这样做的结果是 他挖的块 不被大家认可 会浪费时间和算力 回到上面的场景 A 想赖账 就只能从记录了 A B10 个比特币这个消息的区块的前一个区 块开始重新挖矿 造出一个支链来 但是实际上的区块已经前进了很多 他只能不停的追赶 而且在追赶的同时 主链也在前进 他必须以比主链快的速度前进 如果他的算力足够大 理论上通过较长的时间确实可以追赶成功 就实现了对交易信息的篡改 然而其实这几乎是 不可能的 因为就算算力再大 平均出块速度也是 10 分钟 从非技术的角度讲 一个人如果 掌握了全网一半以上的算力 他为什么不在主链上继续挖矿呢 一个富可敌国的人应该不 会甘愿去做一个小偷吧 六 总结 区块链并不等同于比特币 比特币也不是区块链 区块链只是比特币应用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论