为什么好多矿工游戏都在讨论HashStor H1,这款矿机真的超越其他的吗?

&figure&&img src=&https://pic3.zhimg.com/v2-90c02a3eca656c8c2b781_b.jpg& data-rawwidth=&4096& data-rawheight=&2730& class=&origin_image zh-lightbox-thumb& width=&4096& data-original=&https://pic3.zhimg.com/v2-90c02a3eca656c8c2b781_r.jpg&&&/figure&&p&文/ 佑铭&/p&&p&编辑/ 小咪&/p&&p&&br&&/p&&p&前天,全球最大的同性交友社区(划掉)、通过 Git 进行版本控制的软件源代码托管服务——GitHub 10 周岁啦(2008 - 2018)。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-4fad26679d9c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&642& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic3.zhimg.com/v2-4fad26679d9c_r.jpg&&&/figure&&p&&br&&/p&&p&GitHub 还上线了庆生页面,给自己怀旧了一波成为业内一哥的拼搏之路。从第一个入驻 GitHub 的大型项目到现在,每一个具有里程碑意义的事件都被记录了下来。&/p&&a href=&https://link.zhihu.com/?target=https%3A//v.qq.com/x/page/h0628pykw6a.html& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic3.zhimg.com/v2-a772ac43dda_180x120.jpg& data-image-width=&320& data-image-height=&180& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Github: 10年编程 感谢有你_腾讯视频&/a&&p&&br&&/p&&p&那么,Github 10 周年,到底是一个怎么样的轨迹,又有多少和中国程序员息息相关的事情发生?&/p&&p&&br&&/p&&p&&b&◆ 2008:上线 Ruby on Rails入驻&/b&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-51cdcc9b7a35fe3defb0f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&320& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/v2-51cdcc9b7a35fe3defb0f_r.jpg&&&/figure&&p&2008 年 4 月 GitHub 的 Beta 测试版本开发完成,2008 年 4 月 10 日GitHub 正式上线 (上线po文见&a href=&https://link.zhihu.com/?target=https%3A//blog.github.com/-we-launched/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&blog.github.com/2008-04&/span&&span class=&invisible&&-10-we-launched/&/span&&span class=&ellipsis&&&/span&&/a&)。同月 3 日,当 GitHub 还在内部测试时,Ruby on Rails 便入驻 GitHub,成为 GitHub 上的第一个大型开源项目。考虑到GitHub 本身就是用 Ruby on Rails 搭的,这对 GitHub 来说简直意义非凡。&/p&&p&&br&&/p&&p&&b&◆ 2009:比特币诞生, node.js 发布&/b&&/p&&p&2009 年 1 月 3 日,全世界第一个去中心化数字货币比特币(Bitcoin)诞,生并于 2010 年入驻 GitHub 。直至今日,比特币项目已经被 fork 超过 18000 次,拥有超过 500 个协作者,并且激励了上千其它区块链项目诞生于 GitHub,其中很多是从比特币的源码 fork 来的。&/p&&p&2009 年 5 月 21 日,Node.js 发布,从根本上改变了 Javascript 的正确使用姿势。有了 Node.js,开发人员可以使用 Angular,Ember,React,jQuery 和 Vue 等库和框架在操作系统上构建复杂的服务器端和桌面应用程序。该项目有效地扩展了 JavaScript 的可能性,并让JavaScript 这一主流编程语言向前迈了一大步。&/p&&p&2014 年,io.js 从 Node.js fork 而来,以加强社区的开放性。一年后,这两个项目在新成立的 Node.js 基金会下建立了一个开放治理模式并重新合并,展示了开源社区在解决跨两个项目的复杂协作问题上的力量。&/p&&p&今天,Node.js 支持着最丰富的库和工具的生态系统之一,Node.js Core拥有近 2000 个贡献者。在社区驱动的 NodeSchool 的支持下,Node.js 相对容易上手。NodeSchool 连接开发者,提供免费教程,并在全球举办面对面活动。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&◆ 2010 Rails Girls成立&/b&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d2ef41b46881a9fcf177cad_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&592& data-rawheight=&321& class=&origin_image zh-lightbox-thumb& width=&592& data-original=&https://pic2.zhimg.com/v2-d2ef41b46881a9fcf177cad_r.jpg&&&/figure&&p&2010 年 11 月 26 日,女性编程社区 Rails Girls 在芬兰首都赫尔辛基举办第一次工作坊。2013 年 Rails Girls 开始举办编程之夏活动(Summer of Code)——资助女性和跨性别者用三个月时间致力于开源项目的全球性奖学金。和谷歌编程之夏 (Google Summer of Code) ,Outreachy 一起, Rails Girls 的编程之夏活动对软件产业影响深远,帮助了很多人。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&◆ 2011 Travis CI 的第一 pull&/b&&/p&&p&&br&&/p&&p&2011 年 1 月 1 日,基于云的持续集成(Continuous Integration,简称 CI)项目 Travis CI 入驻发布,成为首个支持 GitHub 集成的工具,至今仍是同类工具中市场份额最大的一个。它绑定 GitHub 上面的项目,只要有新的代码,就会自动抓取。然后提供一个运行环境,执行测试,完成构建,还能部署到服务器。持续集成的好处在于,每次代码的小幅变更,就能看到运行结果,从而不断累积小的变更,而不是在开发周期结束时,一下子合并一大块代码。查看 GitHub 上的十大 CI 工具:&a href=&https://link.zhihu.com/?target=https%3A//blog.github.com/-github-welcomes-all-ci-tools/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&blog.github.com/2017-11&/span&&span class=&invisible&&-07-github-welcomes-all-ci-tools/&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&◆ 2012 JavaScript 崛起&/b&&/p&&p&2012 年 1 月 1 日,JavaScript 一举超越 Ruby、Java、Python,成为 GitHub 上最受欢迎的语言,保持大哥地位至今。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&◆
万 Repos 达成&/b&&/p&&p&&br&&/p&&p&这一年,GitHub repos 突破1000万,用户数突破 300 万。下图为repos的增长情况。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-436faa27be3dedad50089ca6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1009& data-rawheight=&564& class=&origin_image zh-lightbox-thumb& width=&1009& data-original=&https://pic3.zhimg.com/v2-436faa27be3dedad50089ca6_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&◆ 2014 Docker 1.0发布 \ 微软开源 .NET&/b&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-1d6b0a1bd2271fcc0e6d5a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&886& data-rawheight=&300& class=&origin_image zh-lightbox-thumb& width=&886& data-original=&https://pic2.zhimg.com/v2-1d6b0a1bd2271fcc0e6d5a_r.jpg&&&/figure&&p&2014 年 6 月 9 日,Docker 1.0 发布。Docker 致力于为任何应用程序创建分发版本而简化封装流程,将其部署到各种规模的环境中,并将敏捷软件组织的工作流程和响应流水化。 Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。&/p&&p&&br&&/p&&p&同年 10 月 23 日,微软公司开源.NET。这仅仅是个开始,到现在微软公司已经开源了上百个项目。其中包含:2017 年增长最快的语言之一TypeScript,去年全年拥有最多贡献者的项目 VS Code。微软的组织也成为 GitHub 上最活跃的贡献者之一,上千的工程师贡献和发布各种平台和各种编程语言写的软件。谷歌和微软这样的大公司在开源项目上的投入改变了商业制造软件的态度,也展示了他们的必杀技有时候其实不在于黑科技,而在于社区如何使用他们。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-150eed4c16add_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&600& data-rawheight=&276& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-150eed4c16add_r.jpg&&&/figure&&p&&br&&/p&&p&&b&◆ 2015 Unreal Engine 4 开源 / GitHub Classroom诞生 / 苹果开源Swift&/b&&/p&&p&2015 年 3 月 2 日,Epic Games 团队开源 Unreal Engine 4,让游戏开放者能利用最棒的工具来最大化地实现他们的创意和想法。开源代码也让社区在发布前就能访问新特性。从 bug 修复到 Git 集成,他们的最新版本得到了 128 次社区贡献的帮助。由于开源的游戏引擎、库和其他开发工具,“游戏”成为 2017 年 GitHub 上最受欢迎的主题之一。 Phaser, Godot Engine 以及其它像 &a href=&https://link.zhihu.com/?target=http%3A//Itch.io& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&Itch.io&/span&&span class=&invisible&&&/span&&/a& 这样的项目正在塑造人们构建和分享独立游戏的方式。开源的学习资源和像 2048 这样的游戏启发了数百个克隆版本,让更多的人参与和创造。在活跃的游戏开发之外,还有一些最有影响力的游戏的开源代码包括波斯王子和 Doom 被存在公共 repo 中——显然比被埋在新墨西哥沙漠里更好。&/p&&p&&br&&/p&&p&GitHub 教室 (GiHub Classroom) 可让教师更轻松地在GitHub上分发初学者代码并收集作业。今天,高中、大学和编程训练营的学生在180万个教室repos上学习 ——但这些远不是 GitHub 上唯一的教育资源。从资源列表到大型开放式在线课程(MOOCs)如 &b&优达学城Udacity&/b&,这里有学软件开发的上千种方法。在过去的十年,社区驱动的项目如 Django 女孩(Django Girls) 发布了在线教程,举办了面对面活动,扩展了全世界学生的学习机会。&/p&&p&&br&&/p&&p&同年 12 月
3日,苹果开源 Swift 。这一决定提高了新开发工具的标准,也鼓励了越来越多的公司把他们的工具向公众开放。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d51c699fef395f0c6615fb5accf308e7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&441& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-d51c699fef395f0c6615fb5accf308e7_r.jpg&&&/figure&&p&&br&&/p&&p&&b&◆ 2016 Apollo 11 代码登陆&/b&&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-2da828d1ad3f8c2ebc1671_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&600& data-rawheight=&306& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-2da828d1ad3f8c2ebc1671_r.jpg&&&/figure&&p&&br&&/p&&p&Apollo 11 于 1969 年登陆月球。四十七年后,当年启动它的源代码登陆GitHub。代码非常抓眼球,部分原因是其中包含了大量彩蛋。这也证明了20 世纪 60 年代的程序员就很会玩。&/p&&p&&br&&/p&&p&除了存储旧代码之外,一些机构正在通过开源和封闭源代码软件推动现代航天发展和探索科学研究的其它前沿领域。美国宇航局 NASA 维护着数百个开源项目。在公开 repo 中,你可以找到使用 TensorFlow 可视化火星地形和识别系外行星的软件,还能找到如 SpaceX 这样的机构用于开发软件的开源项目。&/p&&p&&br&&/p&&p&&b&◆ 2017 Python团队入驻 / Tensorflow 1.0开源&/b&&/p&&p&&br&&/p&&p&2017 年 2 月 10 日,Python 团队开源 Python。Python 的维护者在2016 年初就宣布计划迁移到 GitHub,并在第二年如约而至。过去的十年,Python 成为增长最快的主流编程语言之一。自 2015 年以来,它一直是 GitHub 上第三流行的语言,在众多 repos 中见证了近70%的同比增长。Python 的历史可以追溯到 20 世纪 90 年代初,但近年来它变得越来越重要。这可能是由于从 2007 年的 Scikit-learn 开始,其社区建立了庞大的数据科学和机器学习工具生态系统。Pandas 这样的广受欢迎的库也让 Python 能够轻松清洗数据。&/p&&p&&br&&/p&&p&同年 2 月 15 日,谷歌首次开源其开发了数十年的内部机器学习库 TensorFlow 。去年,它成为 GitHub 上最受欢迎的项目之一,并且 TensorFlow/models repo 2017 年访问量比 2016 年多 5.5 倍。现在,TensorFlow 成为数据科学家创建机器学习模型的首选工具。近年来,机器学习的可能性已经突破了人类想象力。机构和个人使用TensorFlow 创建模型,诊断精神疾病,分类皮肤癌,合成音乐和自动驾驶马里奥赛车。今天,数据科学家可以使用一系列开源深度学习工具和模型来解决复杂而有趣的问题。除了 TensorFlow,还有 Caffe2, Sonnet, DeepSpeech, 和 Keras,再加上 pandas 和Jupyter 这类数据分析工具,都支持了跨产业的数据科学工作。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-55ce765a1fee31e7eda5f92_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&608& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-55ce765a1fee31e7eda5f92_r.jpg&&&/figure&&p&同年 5 月 2 日,GitHub 上非营利组织用户达到3万,他们用科技让世界变得更美好。野生动物保护协会(WCS)的海洋保护行动覆盖25个国家,以保育全世界的珊瑚礁。在肯尼亚,WCS 使用软件收集物种数据和监测超过 252 公顷的珊瑚礁——大概 260 个足球场那么大!来分析全球研究人员的数据和帮助当地发展可持续渔业。&/p&&p&&br&&/p&&p&同年 5 月 31 日,超过 1 亿次 Pull 请求成功合并。这意味着无数 Bug 得到修复,无数功能得以发布,软件变得越来越好了。光 2017 一年,GitHub 的用户就敲了2.9万亿行代码!&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&◆ 2018 十周年&/b&&/p&&p&&br&&/p&&p&十年过去了,GitHub 如今在全世界范围拥有 2700 万开发者、8000 万个repos。&/p&&p&&br&&/p&&p&&b&感谢你们创建的 repos,做出的贡献,一起写的软件。让我们一起为你庆生!Happy Birthday GitHub!&/b&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-6fbfaf8b672a5df4769c82_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&605& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-6fbfaf8b672a5df4769c82_r.jpg&&&/figure&&p&&br&&/p&&p&最后安利下我们和github联合打造的前端开发纳米学位,学完会有github的认证证书,(逃&/p&&p&&br&&/p&&a href=&https://link.zhihu.com/?target=http%3A//cn.udacity.com/fend& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic1.zhimg.com/v2-337f27433c0dbffx120.jpg& data-image-width=&2400& data-image-height=&1260& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&前端工程师 | Udacity&/a&&figure&&img src=&https://pic3.zhimg.com/v2-e4b3bec7b1d2b146e57a00_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1066& data-rawheight=&864& class=&origin_image zh-lightbox-thumb& width=&1066& data-original=&https://pic3.zhimg.com/v2-e4b3bec7b1d2b146e57a00_r.jpg&&&/figure&&p&&/p&&p&&/p&
文/ 佑铭编辑/ 小咪 前天,全球最大的同性交友社区(划掉)、通过 Git 进行版本控制的软件源代码托管服务——GitHub 10 周岁啦(2008 - 2018)。 GitHub 还上线了庆生页面,给自己怀旧了一波成为业内一哥的拼搏之路。从第一个入驻 GitHub 的大型项目到现在…
&p&谁说C不适合入门?只不过你我对入门的定义未必相同。&/p&&br&&p&想知道什么语言适合不适合“入门”,你起码得拿出地图看看人家所谓的“门”在哪里、并且有能力对比多条路线,这才有资格说哪条路线更好入门,对吧?&/p&&p&比如说,如果两个人的目标分别是:
1、&b&其实我什么都不想知道。妈蛋随便来个什么把任务凑出来啊啊啊啊啊啊啊&/b&
对他来说,可能搜索引擎才是最好的“编程语言”。&/p&&p&只是……写程序的那些懒蛋太不努力,不肯把任何东西都实现好白送给人家,人家既不想写又不想掏钱实在很难办……&/p&&p&所以,没办法,找个啥都不用知道,能“很容易的找到很多半成品”然后很容易就能把半成品们凑合到一起得到差不多满足需要的编程语言就算了——哎呀没有?那就给个尽量简单的,能少学点就少学点。&/p&&br&&p&PS:其实这种最好是学linux。因为哪种语言都很难和linux比工具强大丰富……什么awk sed等等,玩转了绝对是另一个天地,哪需要学什么编程。
就是很多编程语言,也从linux的这些东西上收益匪浅,尤其是php/perl之类,离开linux简直是瘸了两条半腿有木有……
&a href=&//link.zhihu.com/?target=http%3A//coolshell.cn/articles/8883.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&应该知道的Linux技巧&/a& &a href=&//link.zhihu.com/?target=http%3A//coolshell.cn/articles/9070.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AWK 简明教程&/a& ——尤其推荐这个。看看什么叫awk黑科技……&/p&&p&当然,大家都知道,他们是绝不会离开温暖的windows的——别说硬着头皮尝试linux了;就是学python之类简单的脚本语言,都要挑肥拣瘦“有所学有所不学”的。&/p&&br&&p&2、&b&我想要彻底学会编程,解决一切可以用计算机解决的问题&/b&
嗯,你居然给推荐个一拖一放就能自动生成极为酷炫软件的……类似游戏地图编辑器的玩具?&/p&&p&是,真快。啥都不用看,两天就搞出个“酷炫”的垃圾了;可学了两年拖放,还是只能写“酷炫”的垃圾?
为什么别人学了半年就能写“外部命令”给这个“酷炫”的东西扩展功能,而我却只能张嘴等人喂?人家一张嘴一串术语我连子程序是什么都不知道你确定真不是坑我?
傻瓜式封装啊你听听,你这是想让我当一辈子傻瓜是吧?&/p&&p&所以你看,想走这个方向,反而极为排斥那些“酷炫”、“便利”的东西,因为太容易被引偏方向了——所以&b&正规计算机专业的教材,自始至终不会拿“如何使用某种GUI库”之类当重点讲,甚至可能压根就不讲&/b&。&/p&&p&因为被票友们视若珍宝的、关于如何写GUI程序之类玩意儿,实在太不值一提了,压根不值得在它上面耗费精力。&/p&&p&在下当年为公司考察选择各种图形库。其中GTK是从零开始学的,学了两天觉得差不多了打算练手,花两个小时弄了个“钻石迷城”游戏——有计分,无音乐。
后来把这个简单工程丢给一个打算学编程的哥们玩,结果这位玩了一个月的那个“钻石迷城”,愣是没看过我的实现代码……原因据说是看不懂,一行一行讲给他听都搞不懂。&/p&&p&至于如何实现一套好用的、可以和市面上已有产品竞争的GUI库……在你可以一头扎进命令行黑框框、轻易捣鼓出任何自己想要的东西之前,想都别想——更准确点说,恐怕是你到现在都想不通,为何实现一个GUI库,居然需要先钻进黑框框里面去……&/p&&br&&p&——没错,目标是这个的那些人,年复一年专心在黑框框里玩你们看起来low到爆简单到爆但凑到一块就没法看懂的一行行与或非顺序分枝循环……但你们都是他们的傻瓜用户。&/p&&p&甚至,他们哪怕稍微高看你们一点点、稍微多给你们一丁点做决定的自由,你们就充满恐惧的大叫“don't make me think!”&/p&&br&&p&你看,你要给这样两个人推荐同一条入门路线,乐子恐怕就太大了点吧。&/p&&br&&br&&p&知乎并非程序员社区,很多这方面话题的参与者仅仅是工作涉及编程,并没有多少是程序员。所以主流舆论对C充满了恐惧和……厌恶。对他们来说,C简直是必须立刻马上当即淘汰掉的、恐怖的老不死。以至于大言不惭的“C只能做底层”之类胡言乱语都出来了。&/p&&p&但是……这些才是程序员的地盘:&/p&&p&chinaunix首页,看看什么话题最吸引程序员:
&a href=&//link.zhihu.com/?target=http%3A//www.chinaunix.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unix技术网 = 全球最大的Linux/Unix应用与开发者社区 = IT人的网上家园&/a&&/p&&p&chinaunix论坛程序设计板块,看看哪个论坛帖子最多、最火爆:
&a href=&//link.zhihu.com/?target=http%3A//bbs.chinaunix.net/forum.php%3Fgid%3D60& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&程序设计-ChinaUnix.net&/a&&/p&&p&csdn论坛,点开左边的目录树,看看编程语言/框架都在讨论什么:
&a href=&//link.zhihu.com/?target=http%3A//bbs.csdn.net/home%23& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSDN论坛首页&/a&&/p&&p&stackoverflow,哪些tags最常用到:
&a href=&//link.zhihu.com/?target=https%3A//stackoverflow.com/tags%3Ftab%3Dpopular& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Tags - Stack Overflow&/a&&/p&&p&——————————————————————————————&/p&&p&对目标是第二条线的人来说,C的特点是:不作任何封装,把整个硬件、整个操作系统赤裸裸的摆在你的面前;同时它&b&又是一种高级语言&/b&,使得它的用户不必关注太多底层细节,于是在其上无论是讨论算法、还是谈论操作系统、网络协议栈、编译原理等等,都极为简单直观。&/p&&p&这些特点使得C极具生命力。甚至哪怕到了现在,C仍然是最为流行的编程语言(一直和java、c++联手垄断流行编程语言排行榜前三位——而且C经常在榜首;注意C和C++是分开统计的)。
&a href=&//link.zhihu.com/?target=http%3A//www.cnbeta.com/articles/527159.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TIOBE 2016年8月编程语言排行榜:C语言排名创历史新低&/a&&/p&&p&尤其是偏底层的系统级编程,更是C一家独大,除了C++别无对手。&/p&&p&别以为C只能做底层。真正复杂、高难度、对性能有苛刻要求的、支柱性的大项目,C仍然当仁不让、不可替代——我不知道那些说C不适合做项目的,究竟有没听说过linux,看过几个开源项目。&/p&&p&C只不过是太贵、所以不值得拿来做那些不值得花大精力深挖机器潜能、也不值得雇佣高级程序员精雕细刻的、堆积木性质的项目罢了——比如所谓的企业开发、比如开发部署一个网站……&/p&&p&不过,说到网站……或许你应该了解下apache/ngnix以及mysql等等都是什么写的 ^_^&/p&&p&没错。除了那些不上档次的、最为末端的企业及网站类应用外,其它任何领域,业界最好、最顶级的实现,大部分是C的。&/p&&br&&p&这就使得,无论你学什么,很容易就能拿到一大堆的C版本的开源例程;尤其是,若要学习真正能决定你将来能走多远的操作系统、数据库、编译器等基础原理方面的东西,更是几乎只有C一个选择。&/p&&p&不仅如此。C实现的任何东西,无论是操作系统还是编译器,全都会以赤裸裸的算法+数据结构的面目展示在你的面前。想知道什么,只要从一个API开始跟,很容易就能搞明白——跟一跟某个硬件相关API,甚至可以帮助你准确理解硬件。&/p&&p&彻底学通之后,任何技术、任何架构,都能一目了然。&/p&&br&&p&简洁直白、案例众多、学习资源丰富,这是C最为独特的优势。&/p&&p&所以,虽然想玩好指针之类危险特性并不算特别容易;但,&b&学基础算法本就不需要你玩这些危险特性&/b&;稍微学深一点,&b&和其他知识相比,指针又怎么都谈不到难上。&/b&反而是C一旦入了门,根本不假他求,很容易就能把整个计算机系统弄的通通透透——除了C,再没有第二种语言能有这么高的投入产出比。&/p&&blockquote&指针就是对内存最初步的掌控;连内存都玩不明白还奢谈什么“懂计算机”。
事实上,除了对面向对象的直接支持以及内置的内存回收机制等东西外,C并不比近年的各种高级语言少多少特性;而且,c写的unix的一切皆文件思想正是最为成功和最为著名的面向对象案例;需要关注其分配/回收的资源种类多如牛毛,并不仅仅内存一种,任何一种资源的泄露甚至只是不合理的占用都可能毁了一个项目:只靠一个内存自动回收哪救得了你。
所以,恰恰和外行想象的相反,真正庞大复杂的项目反而更需要天天和“资源管理”打交道的、有丰富开发经验的程序员(这正是c/c++程序员的强项:做不好资源管理的c/c++程序员还是早死早超生好了);那些温室里的、从未尝试过自己掌控资源生存周期的嫩苗绝干不了这事——&b&懒得管内存所以丢给垃圾回收、和不会管内存所以依赖垃圾回收,两者可绝不是一回事&/b&。
那些一说C就酸溜溜的扯汇编的,其实正暴露了他对计算原理的无知。&/blockquote&&br&&p&并不局限于资源的管理:专业的软件设计,学的是算法、是如何把一个极难的任务建模、分解、实现的学问:编译原理、操作系统等等,都不过是用于演示“如何庖丁解牛一个超级项目”的实例而已。&/p&&p&除了C之外,你到哪里找别的、有丰富的相关开源源码及其分析资料的语言?若学到这等程度了,连计算机原理都不会,还学个什么鬼?&/p&&br&&p&连个C指针都觉得难、然而却还挣扎着想入这个门的……简直不可想象。&/p&&p&可见,如果你的目标是专业的软件工程师,C就是最佳入门语言,没有之一。&/p&&br&&p&相比之下,同样的项目,其它语言因为封装的云山雾罩,哪怕是老鸟,想把人家的核心算法/架构从层峦叠嶂的各种委托、代理等等模式中剥离出来,都不是很容易的事,何况初学者。这反而不利于学习偏底层或者偏核心的知识——甚至很容易给初学者造成“不去看系统实现,因为不可能看懂”的“习得性无助”心理。&/p&&p&甚至,有调查显示,java程序员对自己每天都要打交道的JVM的理解,平均来说远不如C程序员——无论是入门级的知识点还是进阶知识点。&/p&&p&——————————————————————————————————————&/p&&p&但是,在知乎上,我也只会推荐python等脚本语言。&/p&&p&为什么?因为需求不同。&/p&&p&第一,&b&提问者本身就显示出某种急功近利、耐心缺乏的倾向。绝大多数还表现的特别明显&/b&。&/p&&p&比如说,极大一部分提问者是这样问的“想要转职/去xxIT企业,学XX可以吗/多长时间可满足要求”——&b&这压根就是玩票的票友嘛。&/b&你给票友推荐C?&/p&&p&显然,给他们推荐必须长时间学习深挖、必须有较为深厚的、各方面基础知识的C,不是装X就是找打。&/p&&br&&p&第二,知乎的提问者,大多不是初学者。他们是&b&未学者&/b&。
所谓初学者,显然应该是有一定的基础(起码得自己看过书、上机敲过例程吧)、但对计算机软硬件理解较浅、需要找一个突破口以学习提高的人。&/p&&p&对这类人,C显然是一把极佳的、便于开启操作系统和硬件大门的钥匙;对他们,不推荐C才有问题呢。&/p&&br&&p&但知乎的提问者,几乎无一例外,都是“若干种语言我选哪种学习”、“我想学编程我想将来写XXX学什么语言好”一类。&/p&&p&这种人压根连半步都没迈出去(因为随便他真把随便哪种最简单的语言学入门了、想要继续提高,都不会是这个问法),那么肯定得给他们推荐那些上手快、见效快的,不然这种磨磨唧唧的家伙恐怕连看完“序言”的耐心都不会有。&/p&&p&只有等他们上手之后,仍然有兴趣、有动力,自觉学有余力,这才能算初学者——到这时候,如果你打算深造,看会不会给你推荐C。&/p&&br&&p&第三,如前所述,知乎提问者,哪怕不急功近利,他们的&b&目标大多数时候也不是专业软件开发。&/b&&/p&&p&亦因此,你敢提C,他们就酸溜溜的对以汇编。&/p&&p&对他们来说,挖底层、挖算法,压根就不是目标;他们只关心怎么把自己的任务拼凑出来。&/p&&p&显然,只能给他们推荐那些简易、入门快、见效快、有大量辅助库可以马上拼凑出成品的语言——对这类人,你敢提指针,他们就止不住酸溜溜的心里难受。&/p&&br&&p&但,事实上,哪怕只是国内的chinaunix这样水平一般的程序员社区,指针相关的很多问题都没几个人乐意回答你:因为它太过浅显而且早就被那些初学的懒蛋们问成了“日经”,谁乐意日复一日的为他们浪费口舌。&/p&&br&&p&可见,对票友而言的入门,和对专业程序员而言的入门,压根就不是一回事。两者的差距,甚至可能和学开车和造汽车一样大——对后者来说,前者不过是一直拿积木拼来拼去罢了,什么时候入过门?&/p&
谁说C不适合入门?只不过你我对入门的定义未必相同。 想知道什么语言适合不适合“入门”,你起码得拿出地图看看人家所谓的“门”在哪里、并且有能力对比多条路线,这才有资格说哪条路线更好入门,对吧?比如说,如果两个人的目标分别是:
1、其实我什么都不…
&figure&&img src=&https://pic2.zhimg.com/v2-e7cff19dce34dd70f77c9c5e777f6ffe_b.jpg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&https://pic2.zhimg.com/v2-e7cff19dce34dd70f77c9c5e777f6ffe_r.jpg&&&/figure&&p&本系列教程的目的,是帮助你学习怎样开发区块链技术。&/p&&p&&br&&/p&&p&在本教程中,我们将:&/p&&ul&&li&创建你的第一个基础“区块链” ;实现一个&/li&&li&简单的工作量证明(采矿) 系统;&br&(学习本教程之前,需要对面向对象编程有基本了解)&br&&/li&&/ul&&p&&br&&/p&&p&需要注意的是,本教程并没有生产区块链的完整功能。相反,这是一个概念实现的证明,以帮助您理解区块链,为以后的教程打基础。&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&安装&/b&&/p&&p&&br&&/p&&p&教程中使用 Java,当然你可以使用其他的面向对象编程语言。 开发工具是 Eclipse,同样的你可以使用其他的文本编辑器(虽然你可能会错过很多好用的功能)。&br&&/p&&p&&br&&/p&&p&你需要:&/p&&ul&&li&安装 Java 和 JDK;&/li&&li&Eclipse(或者其他 IDE/文本编辑器)。&br&&/li&&/ul&&p&&br&&/p&&p&你还可以使用谷歌发布的 GSON 类库,实现 Java 对象和 JSON 字符串之间的转换。这是个非常有用的类库,会在下文的点对点代码中继续使用,同样的,有其他方法能替换该类库。&br&&/p&&p&&br&&/p&&p&在 Eclipse 中创建项目(文件&新建&) ,命名为“noobchain”。新建一个同名的类。&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ddf760aea750df7eaf2ccb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&430& data-rawheight=&242& class=&origin_image zh-lightbox-thumb& width=&430& data-original=&https://pic4.zhimg.com/v2-ddf760aea750df7eaf2ccb_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&创建区块链&/b&&/p&&p&&br&&/p&&p&区块链即为一个由区块组成的链表或列表。其中的每个区块都包含自己的数字签名、前一区块的数字签名和一些数据(例如:事物)。&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fc3866bbcb4e3281bede9_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&572& data-rawheight=&149& class=&origin_image zh-lightbox-thumb& width=&572& data-original=&https://pic1.zhimg.com/v2-fc3866bbcb4e3281bede9_r.jpg&&&/figure&&p&图中的 Hash(哈希) 即为数字签名。&br&&/p&&p&&br&&/p&&p&每个区块不仅包含前一区块的哈希,还包含自己的哈希,根据前一区块的哈希计算得到。如果前一区块的数据变化,则其哈希也会变化(因为哈希的计算也与区块数据有关),继而影响其后面所有区块的哈希。&b&计算和比较哈希可以检查区块链是否无效。&/b& &/p&&p&&br&&/p&&p&这意味着什么呢?这意味着如果改变了区块链中的任意数据,将改变签名并破坏区块链。&br&&/p&&p&&br&&/p&&p&&b&所以首先,创建类 Block 来构造区块链:&/b&
&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&import java.util.D
public class Block {
public String previousH
private S //our data will be a simple message.
private long timeS //as number of milliseconds since 1/1/1970.
//Block Constructor.
public Block(String data,String previousHash ) {
this.data =
this.previousHash = previousH
this.timeStamp = new Date().getTime();
&/code&&/pre&&/div&&p&&br&&/p&&p&可以看到 Block 类包含 String 类型的 hash 属性,用来表示数字签名。变量 previousHash表示前一区块的哈希,变量 data 表示区块数据。&br&&/p&&p&&br&&/p&&p&&b&接着需要一种方法来生成数字签名&/b&:&br&有 很 多 种 密 码 学 算 法 可 供 选 择 , 然 而 SHA256 算 法 最 为 适 合 。 导 入java.security.MessageDigest 来访问 SHA256 算法。&br&&/p&&p&&br&&/p&&p&下文中还需要使用 SHA256 算法,所以创建一个 StringUtil 类并定义一个方法以方便使用:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&import java.security.MessageD
public class StringUtil {
//Applies Sha256 to a string and returns the result.
public static String applySha256(String input){
MessageDigest digest = MessageDigest.getInstance(&SHA-256&);
//Applies sha256 to our input,
byte[] hash = digest.digest(input.getBytes(&UTF-8&));
StringBuffer hexString = new StringBuffer(); // This will contain hash as
hexidecimal
for (int i = 0; i & hash. i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if(hex.length() == 1) hexString.append('0');
hexString.append(hex);
return hexString.toString();
catch(Exception e) {
throw new RuntimeException(e);
&/code&&/pre&&/div&&p&&br&&/p&&p&如果你看不懂这个方法,不要担心,你只需要知道输入一个字符串,调用 SHA256 算法进行处理,将生成的签名作为字符串返回。&br&&/p&&p&&br&&/p&&p&现在 Block 类中创建一个新方法,调用 applySha256 方法来计算哈希。必须使用所有不希望被篡改的区块中的哈希值进行计算,所以要用到变量
&/p&&p&previousHash、 data 和 timeStamp(时间戳) 。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public String calculateHash() {
String calculatedhash = StringUtil.applySha256(
previousHash +
Long.toString(timeStamp) +
&/code&&/pre&&/div&&p&&br&&/p&&p&将这些方法加到 Block 构造函数中:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public Block(String data,String previousHash ) {
this.data =
this.previousHash = previousH
this.timeStamp = new Date().getTime();
this.hash = calculateHash(); //Making sure we do this after we set the other
&/code&&/pre&&/div&&p&&br&&/p&&p&是时候做一些测试了。&/p&&p&&br&&/p&&p&在 NoobChain 类中创建一些区块并输出其哈希到屏幕上,确保一切都运转正常。&br&&/p&&p&&br&&/p&&p&第一个区块叫初始区块,因其前面没有区块,所以将 previousHash 的值设为 0。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public class NoobChain {
public static void main(String[] args) {
Block genesisBlock = new Block(&Hi im the first block&, &0&);
System.out.println(&Hash for block 1 : & + genesisBlock.hash);
Block secondBlock = new Block(&Yo im the second
block&,genesisBlock.hash);
System.out.println(&Hash for block 2 : & + secondBlock.hash);
Block thirdBlock = new Block(&Hey im the third block&,secondBlock.hash);
System.out.println(&Hash for block 3 : & + thirdBlock.hash);
&/code&&/pre&&/div&&p&&br&&/p&&p&输出如下图所示:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-7e73b776b9eff0e8ecad5d2_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&788& data-rawheight=&164& class=&origin_image zh-lightbox-thumb& width=&788& data-original=&https://pic3.zhimg.com/v2-7e73b776b9eff0e8ecad5d2_r.jpg&&&/figure&&p&(你的哈希值会和图上不一样,因为我们的时间戳是不一样的)&br&&/p&&p&这样, 每个区块都根据自己的信息和前一区块的签名,拥有了自己的数字签名。&br&&/p&&p&目前还不是区块链,将所有区块保存为动态数组(ArrayList),并导入 gson 将其转化成 JSon 字符串来查看。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&import java.util.ArrayL
import com.google.gson.GsonB
public class NoobChain {
public static ArrayList&Block& blockchain = new ArrayList&Block&();
public static void main(String[] args) {
//add our blocks to the blockchain ArrayList:
blockchain.add(new Block(&Hi im the first block&, &0&));
blockchain.add(new Block(&Yo im the second
block&,blockchain.get(blockchain.size()-1).hash));
blockchain.add(new Block(&Hey im the third
block&,blockchain.get(blockchain.size()-1).hash));
String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
System.out.println(blockchainJson);
&/code&&/pre&&/div&&p&&br&&/p&&p&现在的输出看起来像我们期望的区块链了。&/p&&p&&br&&/p&&p&现在需要一种方法来验证区块链的完整性在 NoobChain 类中创建一个 isChainValid()方法,遍历链中所有区块并比较其哈希。该方法需要检查当前区块的哈希值是否等于计算得到的哈希值,以及前一区块的哈希是否等于当前区块 previousHash 变量的值。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public static Boolean isChainValid() {
Block currentB
Block previousB
//loop through blockchain to check hashes:
for(int i=1; i & blockchain.size(); i++) {
currentBlock = blockchain.get(i);
previousBlock = blockchain.get(i-1);
//compare registered hash and calculated hash:
if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){
System.out.println(&Current Hashes not equal&);
//compare previous hash and registered previous hash
if(!previousBlock.hash.equals(currentBlock.previousHash) ) {
System.out.println(&Previous Hashes not equal&);
&/code&&/pre&&/div&&p&&br&&/p&&p&链中区块发生任意的改变都会使该方法返回 false。&/p&&p&&br&&/p&&p&当人们将自己的区块链分享到比特币网络节点后,网络会接收其最长有效链。是什么阻止攻击者篡改旧区块上的数据,然后创建更长的新区块链并放在网络上呢? 工作量证明机制。哈希现金工作量证明机制意味着创建新的区块需要相当长的时间和计算能力。因此攻击者需要掌握巨大的计算能力,比其他所有同行加起来的计算能力还要多。&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&开始采矿!!!&/b&&/p&&p&&br&&/p&&p&我们要让矿机完成工作量证明机制,即在区块中尝试不同的变量值,直到其哈希值以一定数量的 0 开始。&/p&&p&&br&&/p&&p&添加一个整数类型的 nonce 向量用于 calculateHash()方法中调用,并添加一个 mineBlock()方法:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&import java.util.D
public class Block {
public String previousH
private S //our data will be a simple message.
private long timeS //as number of milliseconds since 1/1/1970.
//Block Constructor.
public Block(String data,String previousHash ) {
this.data =
this.previousHash = previousH
this.timeStamp = new Date().getTime();
this.hash = calculateHash(); //Making sure we do this after we set the other values.
//Calculate new hash based on blocks contents
public String calculateHash() {
String calculatedhash = StringUtil.applySha256(
previousHash +
Long.toString(timeStamp) +
Integer.toString(nonce) +
public void mineBlock(int difficulty) {
String target = new String(new char[difficulty]).replace('\0', '0'); //Create a string with
difficulty * &0&
while(!hash.substring( 0, difficulty).equals(target)) {
hash = calculateHash();
System.out.println(&Block Mined!!! : & + hash);
&/code&&/pre&&/div&&p&&br&&/p&&p&实际上,每个矿机都从一个随机点开始迭代。有的矿机甚至可以尝试随机的数字。同样值得注意的是,在更困难的情况下可能需要的不仅仅是整数。 MAX_VALUE 的情况下,矿机可以尝试更改时间戳。&/p&&p&&br&&/p&&p&mineBlock()方法以整数变量 difficulty 作为输入,该变量(难度) 表示需要处理的 0 的数量。大多数计算机可以快速的处理 1 或 2 个 0 的情况,我建议在测试时处理 4 到 6 个 0。 莱特币的难度大约为 442592。&br&将 difficulty 作为一个静态变量添加到 NoobChain 类中:&br&public static int difficulty = 5;&br&&/p&&p&我们需要更新 NoobChain 类来触发每个新区块的 mineBlock()方法。 同样需要 isChainValid()方法检查每个区块是否通过采矿得到了哈希值。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public class NoobChain {
public static ArrayList&Block& blockchain = new ArrayList&Block&();
public static int difficulty = 5;
public static void main(String[] args) {
//add our blocks to the blockchain ArrayList:
blockchain.add(new Block(&Hi im the first block&, &0&));
System.out.println(&Trying to Mine block 1... &);
blockchain.get(0).mineBlock(difficulty);
blockchain.add(new Block(&Yo im the second
block&,blockchain.get(blockchain.size()-1).hash));
System.out.println(&Trying to Mine block 2... &);
blockchain.get(1).mineBlock(difficulty);
blockchain.add(new Block(&Hey im the third
block&,blockchain.get(blockchain.size()-1).hash));
System.out.println(&Trying to Mine block 3... &);
blockchain.get(2).mineBlock(difficulty);
System.out.println(&\nBlockchain is Valid: & + isChainValid());
String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
System.out.println(&\nThe block chain: &);
System.out.println(blockchainJson);
public static Boolean isChainValid() {
Block currentB
Block previousB
String hashTarget = new String(new char[difficulty]).replace('\0', '0');
//loop through blockchain to check hashes:
for(int i=1; i & blockchain.size(); i++) {
currentBlock = blockchain.get(i);
previousBlock = blockchain.get(i-1);
//compare registered hash and calculated hash:
if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){
System.out.println(&Current Hashes not equal&);
//compare previous hash and registered previous hash
if(!previousBlock.hash.equals(currentBlock.previousHash) ) {
System.out.println(&Previous Hashes not equal&);
//check if hash is solved
if(!currentBlock.hash.substring( 0, difficulty).equals(hashTarget)) {
System.out.println(&This block hasn't been mined&);
&/code&&/pre&&/div&&p&&br&&/p&&p&运行后的结果如图:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-207f35aa2df816d83f3c425_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&928& data-rawheight=&403& class=&origin_image zh-lightbox-thumb& width=&928& data-original=&https://pic1.zhimg.com/v2-207f35aa2df816d83f3c425_r.jpg&&&/figure&&p&对每个区块采矿需要消耗一些时间(大约 3 秒) !测试中应该选取不同的难度值来观察对采矿时间的影响。&/p&&p&&br&&/p&&p&如果有人篡改了区块链中的数据:&/p&&ul&&li&他们的区块链将会无效。&/li&&li&他们将无法创建一个更长的区块链。&/li&&li&你网络中诚实的区块链将在最长的链上有一个时间优势。&br&&/li&&/ul&&p&&br&&/p&&p&一个被篡改的区块链将不可能赶上一个更长且有效的区块链。&/p&&p&&br&&/p&&p&除非他们的计算速度比你网络中所有节点的计算速度的总和还要快。 大概需要一台未来的量子计算机之类的。&/p&&p&&br&&/p&&p&恭喜你,你已经完成了你的基础区块链!&/p&&p&&br&&/p&&p&你的区块链:&/p&&ul&&li&由存储数据的区块构成。&/li&&li&有一个数字签名将区块链接起来。&/li&&li&需要工作量证明来验证新的区块。&/li&&li&可以验证数据是否有效且未被篡改。&/li&&/ul&&p&&br&&/p&&p&下载项目文件:&a href=&https://link.zhihu.com/?target=https%3A//github.com/CryptoKass/NoobChain-Tutorial-Part-1& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/CryptoKass/N&/span&&span class=&invisible&&oobChain-Tutorial-Part-1&/span&&span class=&ellipsis&&&/span&&/a& &/p&&p&&br&&/p&&p&&br&&/p&&p&未完待续……&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&附录&/b&&/p&&p&&br&&/p&&p&区块链领域常见术语 &/p&&p&&br&&/p&&p&1) 区块链的工作量证明(POW): 一个将挖掘能力与计算能力联系起来的系统。块必须被散列,这本身就是一个简单的计算过程,但是在散列过程中增加了一个额外的变量,使其变得更加困难。当一个块被成功散列时,散列必须花费一些时间和计算量。因此,散列块被认为是工作量的证明。&/p&&p&&br&&/p&&p&2) 节点(Node): 连接到区块链网络的任何计算机&/p&&p&&br&&/p&&p&3) 挖掘(Mining): 验证交易并将其添加到区块链的过程&/p&&p&&br&&/p&&p&4) 莱特币(Litecoin): 基于 Scrypt 工作量证明网络的点对点加密货币。有时被称为比特币黄金中的白银。&/p&&p&&br&&/p&&p&5) 难度(Difficulty):在 POW 挖掘中,验证区块链网络中的区块是非常困难的。在比特币网络中,采矿难度调整为每隔 2016 个块进行验证,以保持块验证时间在十分钟。&/p&&p&&br&&/p&&p&6) 私钥(Private key): 一串数据,表明您可以访问特定钱包中的比特币。私钥可以被认为是一个密码, 私钥绝不能透露给任何人,因为密钥允许你通过加密签名从你的比特币钱包里支付比特币&/p&&p&&br&&/p&&p&7) 钱包(Wallet): 一个包含私钥集合的文件 &/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&更多干货关注看雪学院公众号:ikanxue哦!&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//bbs.pediy.com/thread-225539.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&本文由看雪论坛翻译小组Green奇 编译,来源medium@kass 转载请注明来自看雪社区&/a&&/p&
本系列教程的目的,是帮助你学习怎样开发区块链技术。 在本教程中,我们将:创建你的第一个基础“区块链” ;实现一个简单的工作量证明(采矿) 系统; (学习本教程之前,需要对面向对象编程有基本了解) 需要注意的是,本教程并没有生产区块链的完整功能…
&p&刚刚用 Python 秋招完的小应届来回答一下。&/p&&p&&br&&/p&&p&秋招的时候 Python 的岗位确实不多,尤其是像 BAT 这样的一线公司,基本上 Python 岗位都是运维开发和测试开发。二三线互联网还是有不少 Python 岗位的,例如饿了么、爱奇艺、头条等,而且因为投的人不多,所以竞争力比较小。&/p&&p&&br&&/p&&p&但是只会 Python 肯定是不行的,面试的过程中基本上没有问过 Python 语言的相关东西,如果是面的后端开发,可能会问一下用的后端框架的源码,然后就是各种 CS 的基础知识:算法与数据结构、操作系统、计算机网络、数据库,这些问得比较多,然后就是简历中的项目了。&/p&&p&&br&&/p&&p&除了 Python 外,最好还要懂一门静态语言(Java/C++),一门函数式语言(Haskell/Lisp/Scala),大厂的面试其实对语言的要求不是很高,比如面过某 C++ 岗位,全程算法都是用 Python 写的,还和面试官讨论了一下 range() 为什么设计成左闭右开的形式。&/p&&p&&br&&/p&&p&想要用 Python 找到一份好工作(后端方向),可以给一点小小的建议:&/p&&ol&&li&科班出身的话,各种基本知识应该是没问题的,不是科班的话可能这一块需要补一补(* 为备选);&/li&&ol&&li&算法&数据结构:《算法》、*《算法导论》(搭配 MIT 6.006 食用更加)&/li&&li&操作系统&计算机组成原理:《深入理解计算机系统》&/li&&li&计算机网络:《自顶向下方法》、*《TCP/IP 协议(卷一)》、《UNIX 网络编程(卷一)》(强烈推荐,基本上和网络相关的比较难的一些问题这本书都有讲,可以挑一部分看)&/li&&li&编译原理:这个我没具体看书,直接写了几个解释器然后了解了个大概,书的话好像有《30天自制编译器》比较浅显易懂&/li&&li&数据库:《MySQL 必知必会》、《高性能 MySQL》(从此各种数据库优化面试题手到擒来)&/li&&li&Linux:《鸟哥的私房菜》、*《Linux 命令行与 Shell 脚本编程大全》&/li&&li&和面试官扯淡:《程序员修炼之道——从小工到专家》&/li&&/ol&&li&Python 语法虽然很简单,但是要看的东西其实很多&/li&&ol&&li&基本的语法看官方的 Tutorials 就可以了,Python 2 和 Python 3 都要会,之间的一些主要的区别要知道&/li&&li&学会了语法可以看《Python Cookbook》、《Fluent Python》,这两本书相当于进阶的书,学完功力 double,当然可能看一遍是不能完全吸收的,以后可以用到的时候再回去刷一下&/li&&li&看完上面两本书并刷过一些代码之后应该对 Python 的一些常用标准库比较熟悉了,然后可以开始系统看一下标准库(慢慢刷吧,这是个大工程)&/li&&li&熟悉某一个后端框架,我选的是 Flask,因为比较简单,代码也不多,花一点时间把源代码看懂,知道一个 Flask app 从头到尾的运行过程,有时间可以自己写一个 web framework,实现基本的路由和 context 功能,当然还有 bottle 更简单,原理大同小异,读一下 &a href=&//link.zhihu.com/?target=https%3A//www.python.org/dev/peps/pep-3333/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PEP 3333 -- Python Web Server Gateway Interface v1.0.1&/a&&/li&&/ol&&li&一般科班出身的在学 Python 前肯定会 Java/C++,这一部分也有很多的推荐,就不说了&/li&&li&其实面试过程中会问很多项目和设计类的问题,这种东西只能慢慢学习了,平时可以刷一刷 PyCon、各种博客、演讲之类的来提高姿势,YouTube 上有很多这种资源&/li&&/ol&&p&&br&&/p&&p&可以看到,要真的把上面所有的东西都学完不是一两个月能搞定的,这还不包括准备项目的时间。如果真的能学得不错了(70%)的样子,应该拿个一线二线大厂的 offer 还是没问题的。&/p&
刚刚用 Python 秋招完的小应届来回答一下。 秋招的时候 Python 的岗位确实不多,尤其是像 BAT 这样的一线公司,基本上 Python 岗位都是运维开发和测试开发。二三线互联网还是有不少 Python 岗位的,例如饿了么、爱奇艺、头条等,而且因为投的人不多,所以竞…
按,这一篇是我们朋友的作品,颇值得参考,因此经她同意也发表在这里。里面一个非常有指导意义的结论是:&br&&br&虽然小朋友通常不记得三岁以前发生的事,但3个月开始小朋友的经历和见闻都会形成内隐记忆并对一生的行为产生不自觉的影响。&br&&br&作为父母,因此要随时注意自己言行,以及和小朋友互动的方式和态度。&br&&br&自勉和与大家共勉。&br&&br&以下是正文:&br&&br&不知道你是否有过这样的疑问:比如一个4个月大的小朋友,他就能够认得妈妈经常哼唱的曲子,能够把妈妈和其他人区分开。随着他的年龄继续增长,他会开始记住更多的事情。但是从另一个角度,就我们个人的经验,或者普遍的共识都指出,我们在2、3岁之前是不记事儿的。换句话说,极少有人能够回忆起2岁前发生的事情。那么,婴幼儿最初的记忆到底是怎么回事?&br&&br&“记忆”的作用,渗透在生活的方方面面,它的重要性是毋庸辩驳的。所以,当我们理解记忆是如何发展的,我们也会更加理解我们的孩子,以及我们该如何去做。&br&&br&在开始讨论之前,首先要给大家介绍记忆的不同类型。主要的记忆类型,根据不同维度,可以区分如下:&br&&br&根据信息保存的时长,可以分为:感觉记忆sensory memory(1秒左右)、短时记忆short-term memory(几秒,最多几分钟)和长时记忆long-term memory(以日、月、年计算)。&br&&br&在长时记忆中,根据记忆存储和提取过程中的意识参与程度,即意识知觉(conscious awareness),又可分为:外显记忆(explicit memory)和内隐记忆(implicit memory)。外显记忆也被称为陈述性记忆(declarative memory),指可用语言表达、可被意识提取的记忆(比如一个人,一段往事等等);内隐记忆也被称为非陈述性记忆(non-declarative memory),是一种不能觉察的记忆,也被称为“如何做”的记忆(比如如何骑自行车,如何做一道菜等)。&br&&br&在外显记忆中,根据储存的信息类型,又可分为:情景记忆(episodic memory)和语义记忆(semantic memory)。情景记忆是对连续的、形象的事件发生过程的记忆;语义记忆是对知识的、概念的、定义的记忆,它是抽象思维的基础。&br&&br&在这里举一些例子帮助我们更好地理解这些概念。比如,学习书本上的知识,学习圆周率、相对论,这都属于语义记忆。而对于上周朋友的聚会、10岁的欧洲之行、印象最深的一场演奏会等等,这些均属于情景记忆。学会了弹吉他、游泳、骑单车,而再次开启这些技能时,并不需要有意识地回忆如何进行操作,这些属于内隐记忆。不同的记忆类型,在大脑中作用于不同的脑区,功能本身是彼此独立的。所以,你可能听说过,一个失忆症的患者(如果是海马体受损),他会遗忘自己过去的经历或者无法存储新的记忆,但是他还是掌握着原来的技能,比如骑车、弹琴,也就是说其它的记忆类型并没有受到影响。&br&&br&记忆的系统是复杂的。所以,现在我们就会明白,所谓的“小孩子不记事儿”是属于情景记忆的位置,是对于小时候的“事件”没办法记起。那么,当我们知道情景记忆是包含在外显记忆的范畴里,它需要自我意识的参与,“小孩子不记事儿“似乎就不难理解了。新生儿是没有自我意识的,自我意识需要伴随大脑的生理成熟、“自我”的出现而逐渐形成和发展起来。所以,我们可以通俗地解释它:最初的记忆不是不存在,而是由于缺乏自我意识的参与,导致小孩子管理记忆的功能不完善,无法把碎片化的记忆组织起来,无法在意识中提取。&br&&br&在学术界,这个现象被称为婴儿期失忆(infant amnesia),它最初是被弗洛伊德提出的,这个发现引起了很多学者的兴趣。后续的研究也从不同角度给予了解释,比如“硬件上”——婴儿最初的大脑没有发育完成,会对记忆造成影响;“软件上”——越小的孩子,理解力和表达能力都不足够,也会影响记忆的形成。&br&&br&然而,这里必须要强调,没有婴儿期的记忆,并不意味着婴儿期发生了什么不重要。因为确实存在一些缺乏育儿、心理学知识的家长,他们想当然地认为因为孩子在长大之后记不住3岁以前的事情,所以有时候会不太注意自己的言行,会疏于对宝宝的照顾,成人之间的争执、现实残酷的一面也在孩子面前全然呈现。这是非常错误的。&br&&br&最近的一项研究发现了内隐记忆发展的分水岭(V?hringer et al., 2017)。从孩子3个月起,内隐记忆就不再随着年龄的增长而发展。被年龄影响的因素只是婴幼儿向他人表明其内隐记忆的指示行为。内隐记忆会让我们在潜意识中记住很多事情,虽然我们无法有意识地提取它们,但是它能够不被觉察地影响着我们的认知、情绪和行为。而这个发现告诉我们,它的出现如此之早,从3个月开始我们就具备了和成人一样的内隐记忆的能力。&br&&br&非常多的研究证实了早期经验的重要性。如果一个人在生命的最初几年,被耐心地照顾,他的每一次需要都被外界(通常是妈妈)敏感、及时地给予满足。他会在潜意识中建立起对外部世界的信任,内化为心中的“安全感“。同样,那些没有被满足的孩子,他们对世界的假设也是冷漠,甚至充满敌意的。这些最初的信念和感受会潜藏在潜意识的最深处,但却可能影响着人的一生。(可以查阅“依恋理论”attachment theory了解更多)&br&&br&这一次分享到这里,希望你有收获。
按,这一篇是我们朋友的作品,颇值得参考,因此经她同意也发表在这里。里面一个非常有指导意义的结论是: 虽然小朋友通常不记得三岁以前发生的事,但3个月开始小朋友的经历和见闻都会形成内隐记忆并对一生的行为产生不自觉的影响。 作为父母,因此要随时注…
&figure&&img src=&https://pic2.zhimg.com/v2-fb5c61843edb453d466d6ab_b.jpg& data-rawwidth=&1114& data-rawheight=&420& class=&origin_image zh-lightbox-thumb& width=&1114& data-original=&https://pic2.zhimg.com/v2-fb5c61843edb453d466d6ab_r.jpg&&&/figure&&h2&比特币:点对点电子现金系统&/h2&&p&版本号0.02&/p&&blockquote&(备注:草稿,会持续改良可阅读性,内容已完整。在尊重原文专业性的基础之上,尽量增加阅读的流畅性。知乎的网页编辑器排版功能太烂,排版起来就是个噩梦,公式和配图部分只能先截图,希望大家理解。)&/blockquote&&p&原著
&a href=&mailto:&&&/a&&/p&&p&出处
&a href=&https://link.zhihu.com/?target=https%3A//bitcoin.org/bitcoin.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&bitcoin.org/bitcoin.pdf&/span&&span class=&invisible&&&/span&&/a&&/p&&p&翻译 胡震生
&a href=&mailto:&&&/a&&/p&&p&作者私人微信
&a href=&tel:&&&/a& 标明来自知乎&/p&&p&&br&&/p&&p&&b&概述.
&/b&一个真正的的点对点的电子现金应该允许从发起方直接在线支付给对方,而不需要通过第三方的金融服务机构。现有的数字签名技术虽然提供了部分解决方案,但如果还需要经过一个可以信任的第三方机构来防止电子现金的“双重支付”,那就丧失了电子现金给人类带来的最大好处。我们针对电子现金会出现的“双重支付”问题,用点对点的网络技术提供了一个解决方案。该网络通过给交易记录打上时间戳,并通过哈希对其加密,然后将其并入一个不断增长的哈希记录所组成的链条文件中,以此形成一个新的交易记录,这个哈希记录链条文件(以下简称链条文件)是由一个需要证明工作量的系统网路所提供存储和计算服务的。没有基于工作量证明的系统网络来重新完成所有的工作量证明,一个已经形成的记录是不能被修改的。基于工作量证明的系统理念,最长的链条文件不仅仅是提供这些工作量序列事件记录的证据,而且它也是由最大的CPU处理能力池产生的。只要由计算机节点控制的大部分CPU处理能力不联合攻击网络本身,它们的处理能力将超过攻击者,并生成最大的链条文件。&/p&&p&
这个网络它自身需要最简单的结构,以方便信息包尽最大努力广播给网络上的计算机节点,同时计算机节点只需要接受它们离开时工作量网络的产生的数据链,它也可以随时加入和离开网络。&/p&&p&&br&&/p&&h2&1 介绍&/h2&&p&
互联网商业的电子支付已经发展到了几乎都需要专有的金融机构来提供第三方信任来处理的阶段。虽然大部分交易,系统都能工作的足够好,但它还是需要面对基于信任的基础模型带来的天生的缺点。 自从金融机构不可避免的开始调解纠纷,完全而不可撤销的交易就不能真正的实现。调解成本增加了交易成本,限制了实际可行交易的最小规模,同时彻底切断了为日常小额交易提供服务的可能性,广义上的成本让系统失去了为不可撤销类型的服务提供不可撤销支付的能力。因为用户有撤销支付的可能性,所以需要某个时间段内连续性的信任,这导致商家必须防备他们的客户,骚扰他们以为了得到更多的他们不再需要的信息。不可避免的,一定比例下的欺诈性交易是可以接受的。虽然使用物理货币可以避免这些成本和支付的不确定性,但是没有商家在不通过可信任的三方的沟通渠道前提下去支付。&/p&&p&
这就是为什么需要一个基于加密证明的电子支付系统取代原来的基于信任的基础模型,允许任意两个希望交易的双方不通过基于信任的第三方来直接支付。经过计算的无效交易将自动被撤销,以保护卖家远离欺诈,常规附带条件的契约,将被机械化的执行,将保护买家变得很简单。这篇论文中,我们提供了一个基于点对点的分布式时间戳服务器去生成基于时间序列的交易订单的计算证明方案,从而解决双重支付问题。只要诚实的节点全体所控制的CPU计算能力的总和,大于联合攻击节点计算能力组的总和,该系统就是安全的。&/p&&p&&br&&/p&&h2&2 交易&/h2&&p&
我们首先定义一个电子货币就是一个包含了一串数字签名的链。每一个币交易者通过用哈希技术对上一个交易信息和下一个拥有者的公共密钥两者进行加密,然后进行数字签名,最后将这些信息添加到这枚电子货币的末尾。下一个收款人通过私有密钥与链里的公有密钥进行签名验证,以确认自己是链也就是这枚电子货币的拥有者。&/p&&p&&br&&/p&&figure&&img data-rawheight=&654& src=&https://pic1.zhimg.com/v2-c166dc08c595ad4c97dbe5a_b.jpg& data-rawwidth=&1026& class=&origin_image zh-lightbox-thumb& width=&1026& data-original=&https://pic1.zhimg.com/v2-c166dc08c595ad4c97dbe5a_r.jpg&&&/figure&&p&&br&&/p&&p&
当然这个流程的问题在于,收款人还是不能验证币的某位拥有者是否对这个货币进行了双重花费,通常的解决办法是引入一个值得信任的中心权威,或者造币厂来检查每一笔交易的是否被双重花费。每一笔交易结束后,货币必须由造币厂回收以发行一个新的货币,只有从造币厂直接发行的货币才会被信任为没有被双重花费。这个解决方案的灾难之处是,整个金钱系统依靠某家公司来运营造币厂,就像银行一样,每一笔交易不得不通过它们。&/p&&p&
我们需要用一个方法来让收款人知道货币的上一个拥有者没有在更早的任何一个交易里签名授权以导致双重花费。我们的目的是,去计算以前的交易,我们不需要关心之后的交易是否对其进行双重花费。唯一的方法是知道之前所有的交易,才会确认交易不存在。基于造币厂的模型,造币厂知道所有的交易,同时决定哪一个交易请求第一时间到达。在没有可信任的三方下完成这个目的,交易必须公开发布,我们需要一个系统的每个参与者,都同意一个它们已经接受到的单一的订单历史。收款人需要通过主要节点认同它们已经第一时间收到了这笔交易来证明每一笔交易。&/p&&h2&3 时间戳服务器&/h2&&p&我们的解决方案从一个时间戳服务器开始,一个时间戳服务器对一组已经被时间戳标示过的数据块进行哈希加密,然后广泛公开发布这个哈希,就像新闻或者以前的论坛发帖一样。明显的,为了进入哈希里,时间戳证明了数据在这个时间是必须必定存在的,每个时间戳包含了上一个交易的时间戳在它的哈希里,以后每次交易的时间戳都对上一个进行了加强,以此形成了一个链。&/p&&p&&br&&/p&&figure&&img data-rawheight=&328& src=&https://pic3.zhimg.com/v2-37badcabadb60ff7e126_b.jpg& data-rawwidth=&1066& class=&origin_image zh-lightbox-thumb& width=&1066& data-original=&https://pic3.zhimg.com/v2-37badcabadb60ff7e126_r.jpg&&&/figure&&p&&br&&/p&&h2&4 工作量证明&/h2&&p&我们将需要使用工作量证明系统,在点对点的基础之上构建一个分布式的时间戳服务器,和adam back提出的的&a href=&https://link.zhihu.com/?target=http%3A//www.hashcash.org/papers/hashcash.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&哈希现金&/a&很像,而不是以前的新闻组及论坛的机制。当数据被哈希加密后,工作量证明用安全散列算法sha-256对一个数据的哈希值进行检查。哈希从一定数量的0字节开始,检查的平均工作量随着0的字节的数量增长而呈指数增长,而校验只需要执行一次哈希操作。&/p&&p&为了我们的时间戳网络可行,我们增加一个不会被重复的随机数进到数据块内并执行一定的工作量来找到它,这个数据块的的哈希已经包含已经所需数量的0字节。CPU处理能力一经被证明它满足了所需的工作量,不重做所有的工作,这个数据块将不能被修改。随后的数据块被链接在其最后,修改数据块的信息需要把其后所有的数据块的工作量重做。&/p&&p&&br&&/p&&figure&&img data-rawheight=&188& src=&https://pic2.zhimg.com/v2-2b1d9ed24f4_b.jpg& data-rawwidth=&828& class=&origin_image zh-lightbox-thumb& width=&828& data-original=&https://pic2.zhimg.com/v2-2b1d9ed24f4_r.jpg&&&/figure&&p&这个工作量系统也解决了集体决策谁代表大多数的问题。如果大多数是基于一个IP地址一票的机制,它将被能分配大量IP地址的人所破坏,工作量证明是基于一CPU一票的。大多数决策被最长的链代表,也代表了最大工作量效果的投入。如果大多数CPU被诚实节点控制,诚实链将最快速的增长,超过任何竞争的链。 修改一个过去的块,一个攻击者将不得不把块和之后所有的块里所有的工作量重做,然后追上超过诚实节点的工作。我们随后将展示一个慢速攻击者追上随后的数据块的可能性随数据块的增加呈指数增加。&/p&&p&为了抵偿硬件增加的速度和节点运行时的变化的收益,工作量证明将被一个移动平均值来确定,即每小时平均生成的数据块数。如果它们生成的太快,难度也在增加。&/p&&h2&5 网络&/h2&&p&运行这个网络的步骤如下:&/p&&p&1 新的交易被广播给所有节点&/p&&p&2每一个节点收集新的交易写进一个数据块&/p&&p&3每个节点发现这个数据块的工作量的难度&/p&&p&4 当一个节点证明了它的工作量,它将广播这个数据块给所有的节点。&/p&&p&5节点接受这个数据块,只有数据块中所有的交易都是有生效和没有被支付过的,节点才会接受这个数据块。&/p&&p&6 节点通过创建下一个数据块在数据链上,同时把发送节点数据块的哈希作为创建数据块的上一个哈希,表示它们接受了这个数据块。&/p&&p&节点始终认为最长的数据链是正确的,会一直在上面延展。如果两个节点一起广播不同版本的数据块,一些节点先接收到一个或者另一个。在这个例子里,它们会先在第一个接收的数据块上开始工作,但是储存另一个作为下一个分支,防止它变的更长。当工作量证明网络发现其中一个分支变的更长,在短链上工作的节点会切换到更长的链上,其所属关系也会被打断,&/p&&p&新的交易广播不需要到达所有节点,它们只需要尽可能到达多的节点,它们将被整合进数据块中。数据块广播也容忍丢弃信息。如果一个节点没有收到一个数据块,它将持续请求它,直到它接受到下一个数据块,并相信它是丢失的那个。&/p&&h2&6 激励&/h2&&p&根据规则,在数据块里的第一个交易是一个特定的交易,它创建了一个新的货币,由这个数据块的创建者拥有。这给支持网络的节点添加了一个激励,同时提供一个在整个循环里分布式发行货币的方法,没有中心权威去影响它们。稳定的、数量不断增加的新货币和挖金人花费资源添加黄金进如黄金循环系统一样。在这个例子里,处理器时间和电力是所需要花费的资源。&/p&&p&激励也可以通过交易费用获得。如果交易的一个输出值小于输入址,差值就是交易费,它作为激励被被添加进包含这个交易的数据块。整个循环的货币数量已经被预先设定,同时交易费作为交易的激励可以完全避免通货膨胀。&/p&&p&激励也可以有助于节点保持诚实。如果一个贪婪的攻击者有能力集合很多处理器能力超过诚实的节点,他要么选择从自己的交易里欺诈他人,要么使用它生成新的货币。他应该发现遵守规则获利更多,这样的规则有利于他联合其他人赚取新货币,超过了他削弱这个系统和损害自身的财富健康的有效性。&/p&&h2&7 回收磁盘空间&/h2&&p&一个货币里最后的交易已经被足够多的数据块覆盖,那么这个支付交易之前的数据可以不再被使用以节省磁盘空间。为了在不打断数据块的哈希前提下促进它。交易被哈希进默克尔树(Merkle Tree),这样只这个数据块哈希的根需要被包含进来,老的数据块可以被压缩进树的接下的分支而拔除。内部的哈希不需要被存储。&/p&&p&&br&&/p&&figure&&img data-rawheight=&512& src=&https://pic4.zhimg.com/v2-bf8a01be590f26f1d4a26af_b.jpg& data-rawwidth=&960& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&https://pic4.zhimg.com/v2-bf8a01be590f26f1d4a26af_r.jpg&&&/figure&&p&&br&&/p&&p&一个不含交易信息的数据块头部大概80字节。如果我们支持每十分钟生成一个数据块。80字节*6*24*365=4.2M/每年。2008年,每个通用的计算机都有2G内存。根据摩尔定律预测,每年增长1.2GB,数据头都被存储进内存也不是问题。&/p&&h2&8. 简化的支付验证&/h2&&p&不需要运行一个完整的网路节点也可以认证支付,一个用户仅仅需要保存工作量网络的最长数据链的数据块头部的复本,他可通过在网络节点上排队等待直到他相信他自己已经得到了最长的链,并且包含交易的数据块已经被默克尔分支连接上。他不能检查他自己的交易,但是通过连接到链的某个位置,他能看到网络节点已经接受了这个数据,并且其后增加的数据块也证明网络节点已经接受了它。&/p&&p&&br&&/p&&figure&&img data-rawheight=&502& src=&https://pic3.zhimg.com/v2-55c953b5fe1f00f96d5daeef9ab02f8b_b.jpg& data-rawwidth=&1140& class=&origin_image zh-lightbox-thumb& width=&1140& data-original=&https://pic3.zhimg.com/v2-55c953b5fe1f00f96d5daeef9ab02f8b_r.jpg&&&/figure&&p&&br&&/p&&p&例如,这个支付验证依靠尽可能诚实的节点控制网络,但是如果网络被一个拥有大量算力的攻击者控制,它是会容易受到攻击的。当网络节点可以确认它们自身的交易,这个简单的方法可以被一个攻击者的编造的交易来欺骗,只要攻击者拥有超过网络的算力。当网络节点侦测到一个无效的数据块,一个策略会保护反对者,他们将会从网络节点接收到警告,促使软件的用户去下载整个数据块,以确认被警告交易的一致性。支付频繁的商家还可以去运行它们自己的节点,以获得更独立的安全和更快的确认。&/p&&h2&9 合并和拆分数据&/h2&&p&尽管它可以控制单个货币的交易,但针对交易的每一分钱分开处理是很笨的方法。交易包含的多个输入和输出,应该允许数值的拆分和合并。通常要么就是从上一个更大的交易里单一输入,要么就是把多个输入合并成更小的数字,同时最多只有两个输出,一个负责支付,一个负责找零,如果有,则返回给发送者。&/p&&p&&br&&/p&&figure&&img data-rawheight=&252& src=&https://pic2.zhimg.com/v2-530a9dbcd9271efbda788ebf_b.jpg& data-rawwidth=&362& class=&content_image& width=&362&&&/figure&&p&.&/p&&p&&br&&/p&&p&这里需要注意的是输出端。一个交易从几个交易而来,同时这些交易从更多交易而来,这不是问题。这里永远不需要去展开一个交易的历史完整复本。&/p&&h2&10 隐私&/h2&&p&&br&&/p&&p&传统银行的模式是给合作伙伴有限的访问权限,同时通过一个被信任的第三方来调用,以来查看一定级别的隐私。除了这个方法,维护隐私还需要通过打断信息流的一些地方,通过匿名的公共密钥,以公开需要的所有的交易。公众可以看到某人发送给其他人的数字,但是没有交易人的信息,这个很像股票交易所的信息发布级别,公众记录了单比的交易的时间和规模,但是不知道谁交易的。&/p&&p&&br&&/p&&figure&&img data-rawheight=&328& src=&https://pic3.zhimg.com/v2-6b3eead9b6ebe6155db5c_b.jpg& data-rawwidth=&966& class=&origin_image zh-lightbox-thumb& width=&966& data-original=&https://pic3.zhimg.com/v2-6b3eead9b6ebe6155db5c_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&作为一个额外的防火墙,同一个拥有者的每一比新交易可以连接一对新的配对密钥。一些连接还是不可避免的包含多个交易的输入,这必须暴露同一个拥有者过去的其他输入,这个风险是如果拥有者的密钥被暴露了,连接将暴露属于同一拥有者的其他交易。&/p&&h2&11 计算 &/h2&&p&我们假设一个场景,一个攻击者试图去生成一个更快的链以替代诚实的链。甚至如果它完成的比较彻底,它抛开这个系统去随意改变,例如凭空创造一个值或者拿走从不属于他的钱,节点不会接受一个无效的支付交易,诚实节点将永远不会接受包含他们的链。一个攻击者能做的仅仅是可以努力去改变他自己的交易,以从他最近的支付里把钱拿回来。&/p&&p&诚实链和攻击链的之间比赛的特征是一个二项分布的随机漫步。成功的事件是诚实的节点被一个数据块扩展,它的领先增加一个点,失败的事件是攻击者的链扩展一个数据块,差距减少一个点。&/p&&p&攻击者从一个给定的赤字追上成功的可能性和赌徒破产问题相似。假设一个赌徒从一个赤字开始拥有无限的信用,同时无限尝试的次数去赌以达到盈亏平衡。我们可以计算他达到盈亏平衡的可能性,那也就是一个攻击者追上诚实的链。如下所示。&/p&&p&&i&p&/i& = 诚实节点发现下一个数据块的可能性&/p&&p&&i&q&/i& = 攻击者发现下一个数据块的可能性&/p&&p&&i&qz&/i& = 攻击者尝试从z数据块以后追上的可能性&/p&&p&&br&&/p&&figure&&img data-rawheight=&110& src=&https://pic1.zhimg.com/v2-c08e995d15ff_b.jpg& data-rawwidth=&288& class=&content_image& width=&288&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&我们假设p&q,可能性随着攻击者追上数据块的增加呈指数下降,随着概率和他做对,如果他不能在早期幸运的赶上,越往后,他的机会会变的很渺茫。&/p&&p&我们现在思考需要等待多久才能确认这个发送者不能改变交易。我们假设这个发送者是个攻击者,他想使接收者相信他已经把钱付给了他,然后过一会,他把钱再付给他自己。当发生时,接受者将接收到警告,但是发送者希望它迟些发生。&/p&&p&接收者在签名前生成一个新的配对密钥然后把很快把公钥给了发送者。这防止发送者在这个时间点前准备一个数据块链并开始持续的工作,直到他幸运的跑到前面,然后在这时执行这个交易。交易一经发出,不诚实的发送者就已经开始在一个并行包含了他交易的替代版本的链上秘密工作。&/p&&p&接收者等待直到这个交易已经被添加进一个数据块同时Z数据块已经被链接在它的后面。他不知道攻击者已经制造的数据块进展的准确数字,但是假设诚实的数据块按每个数据块的期望的平均值生成,攻击者可能的进展的期望值将呈柏松分布。&/p&&p&&br&&/p&&figure&&img data-rawheight=&192& src=&https://pic2.zhimg.com/v2-4aacf3dcaca4e9_b.jpg& data-rawwidth=&290& class=&content_image& width=&290&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&为了得到攻击者在这时追上的概率,我们用柏松分布密度乘以他可能在这个点上追上可能的概率的进展数:&/p&&p&&br&&/p&&figure&&img data-rawheight=&290& src=&https://pic4.zhimg.com/v2-ddcb071e665d40bedddb8_b.jpg& data-rawwidth=&902& class=&origin_image zh-lightbox-thumb& width=&902& data-original=&https://pic4.zhimg.com/v2-ddcb071e665d40bedddb8_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&重新整理避免分布无限循环的尾部求和&/p&&p&&br&&/p&&figure&&img data-rawheight=&244& src=&https://pic3.zhimg.com/v2-3a1e4e9e85aaab4e06756a5cea18e060_b.jpg& data-rawwidth=&756& class=&origin_image zh-lightbox-thumb& width=&756& data-original=&https://pic3.zhimg.com/v2-3a1e4e9e85aaab4e06756a5cea18e060_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&转换到C代码...&/p&&p&&br&&/p&&p&&br&&/p&&figure&&img data-rawheight=&502& src=&https://pic4.zhimg.com/v2-074cbec018c2_b.jpg& data-rawwidth=&774& class=&origin_image zh-lightbox-thumb& width=&774& data-original=&https://pic4.zhimg.com/v2-074cbec018c2_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&运行一些结果,我们可以看到随着z值的增加,概率呈指数下降。&/p&&p&&br&&/p&&figure&&img data-rawheight=&686& src=&https://pic3.zhimg.com/v2-2cf2bdda3adabb6bc3d9d54e7ea7d67b_b.jpg& data-rawwidth=&446& class=&origin_image zh-lightbox-thumb& width=&446& data-original=&https://pic3.zhimg.com/v2-2cf2bdda3adabb6bc3d9d54e7ea7d67b_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&求解 P 小于 0.1%...&/p&&p&&br&&/p&&figure&&img data-rawheight=&286& src=&https://pic4.zhimg.com/v2-0908fdc4aba1ecc488894_b.jpg& data-rawwidth=&270& class=&content_image& width=&270&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&12.结论&/h2&&p&我们已经提出了一个不需要基于第三方信任的电子交易系统。我们从常用的包含数字签名的货币框架开始,虽然它提供了强大的控制力,但是在防止双重支付方面做的不完整。为了解决这个问题,我们提出了一个依靠工作量证明的点对点网络,用其记录一个公共的交易历史,如果诚实的节点控制了主要的处理能力,那么经过计算,攻击者希望修改记录的努力将变的不切实际。这个网络简单且具备鲁棒性。所有网络上的节点仅需要一点点的协调。它们不需要被认证,信息不需要路由到任何特别的地方,仅仅需要尽最佳效果传播。只需要接受它们离开时工作量网络的产生的数据链,计算节点可以随时加入和离开网络。它们用处理器能力投票,通过在数据块上扩展新的数据,以表示对数据块有效性的赞同,拒绝在数据块上扩展以拒绝无效数据块。任何需要的规则和奖励已经被整合进这个一致的机制且强制执行。&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&备注:觉得好的多点赞,把它顶上去
&/code&&/pre&&/div&&h2&参考链接&/h2&&p&[1] W. Dai, &b-money,&&br&&a href=&https://link.zhihu.com/?target=http%3A//www.weidai.com/bmoney.txt& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&weidai.com/bmoney.txt&/span&&span class=&invisible&&&/span&&/a&, 1998.&/p&&p&[2] H. Massias, X.S. Avila, and J.-J.&br&Quisquater, &Design of a secure timestamping service with minimal trust&br&requirements,& In &i&20th Symposium on Information Theory in the Benelux&/i&,&br&May 1999.&/p&&p&[3] S. Haber, W.S. Stornetta, &How to&br&time-stamp a digital document,& In &i&Journal of Cryptology&/i&, vol 3, no&br&2, pages 99-111, 1991.&/p&&p&[4] D. Bayer, S. Haber, W.S. Stornetta,&br&&Improving the efficiency and reliability of digital time-stamping,& &i&In&br&Sequences II: Methods in Communication, Security and Computer Science&/i&,&br&pages 329-334, 1993.&/p&&p&[5] S. Haber, W.S. Stornetta, &Secure names&br&for bit-strings,& In &i&Proceedings of the 4th ACM Conference on Computer&br&and Communications Security&/i&, pages 28-35, April 1997.&/p&&p&[6] A. Back, &Hashcash - a denial of&br&service counter-measure,& &br&&br&&a href=&https://link.zhihu.com/?target=http%3A//www.hashcash.org/papers/hashcash.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&hashcash.org/papers/has&/span&&span class=&invisible&&hcash.pdf&/span&&span class=&ellipsis&&&/span&&/a&, 2002.&/p&&p&[7]
R.C.&br&Merkle, &Protocols for public key cryptosystems,& In Proc. &i&1980&br&Symposium on Security and Privacy&/i&, IEEE Computer Society, pages 122-133,&br&April 1980.&/p&&p&[8] W. Feller, &An introduction to&br&probability theory and its applications,& 1957.&/p&
比特币:点对点电子现金系统版本号0.02(备注:草稿,会持续改良可阅读性,内容已完整。在尊重原文专业性的基础之上,尽量增加阅读的流畅性。知乎的网页编辑器排版功能太烂,排版起来就是个噩梦,公式和配图部分只能先截图,希望大家理解。)原著 中本聪
&p&作为bitcoin区块链的《圣经》,我终于在除夕当天翻译完成了。&/p&&p&然后今天对其做出了个人的注解。&/p&&p&毕竟英语太渣,翻译部分我都采取了直译,力求不丢失原文信息,所以看起来很别扭。。但是至少还是读得懂的。还有整篇文章都是赶出来,自己还没检查一遍,很多地方读不通顺甚至有错误,请大家见谅。&/p&&p&自己的注解部分全部以引文的方式体现,主要包含了技术构成分析以及区块链系统的个人思考。&/p&&p&英文链接&/p&&a href=&https://link.zhihu.com/?target=https%3A//bitcoin.org/bitcoin.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Bitcoin: A Peer-to-Peer Electronic Cash System&/a&&br&&p&比特币白皮书作为区块链的始祖,区块链神教的《圣经》,分析全文的过程我中充满了对中本聪的钦佩。&/p&&p&以下即为我个人的翻译:&/p&&p&&b&&u&请注意:区块链是比特币实现的技术,比特币是区块链的第一个应用。&/u&&/b&&/p&&h1&Bitcoin: 一个点对点电子现金系统(翻译+注解)&/h1&&p&&strong&摘要&/strong&:一个纯粹的p2p版}

我要回帖

更多关于 矿工队 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信