bitcoin 与工作量证明

本贴最后更新于 2245 天前,其中的信息可能已经时移世易

来自简书

btc address: 1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHf

挖矿的时候需要经常听到一个词 工作量证明 , 即 Proof Of Work,简称 POW.

POW 是个什么鬼, 我们先抛开这个概念, 玩个游戏.

假如有很多人喜欢问我很八卦的问题, 但我 只想答有限的几个,
那让谁答呢? 我出个游戏规则:

1 先把问题列出来, 重复的问题我不回答啊
你有异装癖么

2 做 hash 运算, 就做 sha256 吧

require 'Digest' Digest::SHA256.hexdigest("你有异装癖么")

得到 4f65c9ca420e5f191d9f2730c4f99c7fe8f2301a431bade918de9d38f7401a4e

3 计算 hash 值, 这个难度太低了, 身边的一堆程序猿都会算.
我希望 你的问题 加上一个自然数,合并成一个新的字符串,再做 hash 运算, 得到新的 hash 值, 使得新的 hahs 值前 4 个都是 0, 并且这个自然数是最小的, 那好,我就回答你的问题.

一言不合就撸码

require 'Digest' 10000.times do |n| issue = "你有异装癖么" val = issue + n.to_s ret = Digest::SHA256.hexdigest(val) if ret[0..3] == "0000" #判断hash值的前4位是0么 puts val puts n puts ret break end end #你有异装癖么3699 #3699 #00007ed47ec0280ca933ed5dc9396892fee27c9dbec9c07f95f0247169df1bee

得到 3699,
Digest::SHA256.hexdigest("你有异装癖么3699") 的结果符合前 4 位是 0.
你把问题 你有异装癖么3699 给我, 我通过验证, 就回答这个问题.


你有疑惑了, 为啥要从 [1,10000] 这个区间顺序计算呢?
不能随便从一个数字算么?

因为 hash 运算的结果是无序的, 而且不能进行逆运算, 顺序计算比较方便, 没有遗漏. 通过这个方式得到的自然数, 也是符合游戏规则的最小自然数, 因为是顺序计算的啊

嗯的, 在回到这个游戏, 大家都遵守这个规则, 我也在回答这个问题,
又过了一段儿时间, 需要回答的八卦问题还是太多了, 我吃不消了,囧.

我定个新规则, 其他的不变, hash 值前 5 位是 0 的, 我才回答.
然后继续运行, 到了我又吃不消的时候, 继续改, 前 6 位, 前 7 位, 前 8 位,
前 n 位是 0.

如果你继续算下去, 你会发现, 算的时间会越来越长,我们可以说难度增加了. 有这样直观的感觉, 前几位是 0 的个数越多, 这个难度越大, 计算时间越长.

难度到底有多大, 也就是时间到底有多长呢?
我拿自己的 2014 年款的 mac pro 中款粗略算了下,语言是 ruby,
时间就是金钱, 这个时间还是比较可观的.

Digest::SHA256.hexdigest("shooter36") #04b4ee0f1b56950f1f9880d076b7449c66705d5712a939a36a49d9973dd50ab3 2ms Digest::SHA256.hexdigest("shooter578") #002bae033279e48835e9a3c8b71a6835bf171a202b700a10ba4bd63710bfcb49 15ms Digest::SHA256.hexdigest("shooter4434") #00072b50cc7963a310962af33efcd5109cdfb6ac633ce6bb275ce243f3ec247b 406ms Digest::SHA256.hexdigest("shooter35786") #00002d8c31f6eb29d848cdf520b499cd9f729b1d4d037275d82935b7766eaa3e 4309ms Digest::SHA256.hexdigest("shooter717095") #00000178662b978d8d7cf930a1caceae70f097354b4fe6423eef2a45ccfb9ce7 82468ms Digest::SHA256.hexdigest("shooter2038373") #0000001ef511d494ecdddcd2abfded0a34df87a9c76410452e01e0a2958bf0a5 272266ms

说了这么多, 这个游戏规则其实就是 POW.
用到 bitcoin 上,无非是要替换些东西, 八卦问题 => bitcoin 需要的数据,
替换 bitcoin 需要的难度. 理解这个思想很重要, 别的细节慢慢聊.

bitcoin 系统的难度有多大呢?

块高度 477,360 的 hash 000000000000000000e8af89716e0ea8a2aa7c7b789935e98f0a32a4a319247f 有 18 个 0.
Nonce 是十六进制的 0x71eee8ca,即算了 1911482570 次, 可以试试用一般的笔记本计算 19 亿次 hash 需要多长时间.


POW 有什么特点呢?

1 运算不可逆, 就代表谁也不可能偷懒
2 每个值的 hash 都不一样, 意味着不同的问题都要算, 换个新问题, 就要重新算.
3 你算起来很费劲, 花费时间长
4 我验证起来很简单, 把结果 hash 一下, 符合规则的我就回答, 不符合的抛弃
5 这个规则实现还是比较简单的

结果就是 遵守游戏规则的人很艰难的算出一个结果,会很珍惜,因为你付出了很多的计算资源跟时间, 你希望我能认可你的努力.

这个概念在 bitcoin 系统中很重要

参考:


https://en.bitcoin.it/wiki/Proof_of_work

  • 比特币

    比特币(BitCoin)的概念最初由中本聪在 2009 年提出,根据中本聪的思路设计发布的开源软件以及建构其上的 P2P 网络。比特币是一种 P2P 形式的数字货币。点对点的传输意味着一个去中心化的支付系统。

    27 引用 • 169 回帖 • 79 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 4 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
shooter
区块链技术爱好者 btc address: `1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHf` 北京

推荐标签 标签

  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 3 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    133 引用 • 1124 回帖 • 117 关注
  • OneDrive
    2 引用
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    28 引用 • 197 回帖 • 32 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖 • 1 关注
  • V2Ray
    1 引用 • 15 回帖
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 545 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 23 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 79 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 2 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 636 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    168 引用 • 595 回帖
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 666 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 554 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 158 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 104 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 724 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    556 引用 • 675 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    143 引用 • 442 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 176 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 295 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖