
《计算机是如何工作的人人都能懂的计算机软硬件工作原理》第 13 章 现代计算机 阅读笔记 16第 13 章 现代计算机本章将对现代计算机的几个精选领域进行概要介绍。考虑到计算机的多样性和广泛性可选择的主题有很多。我所选择的领域并不是当今计算机所发生趣事的详尽清单。相反它们代表了我认为值得考虑的一些主题。本章将介绍 app、虚拟化、云计算、比特币等。我们以一个最终设计作为结束这个设计汇集了本书介绍的许多主题。13.1 app从计算机发展的早期开始人们就把被用户直接使用的软件程序称为应用程序 **(application)。为了方便将这个词缩写为 app。**在过去这两个词是可以互换的。不过随着苹果在 2008 年开设 iPhone 应用商店以来app 一词已经有了不同的含义。虽然没有标准技术定义把软件程序定义为 app但 app 通常具有许多共同特征。app 是为最终用户设计的。app 一般面向的是移动设备比如智能手机或平板电脑。app 通常通过基于互联网的数字商店应用商店—比如苹果应用商店、Google 播放商店或者 Microsoft 商店分发。app 对运行其的系统只有有限的访问权限而且常常必须声明它们需要哪些特定功能才能操作。app 倾向于使用触摸屏作为用户输入的主要方式。在单独使用的时候app 一词通常是指安装在直接使用操作系统 API 的设备上的软件。换句话说app 这个词一般意味着 “本机 app”即为特定操作系统构建的 app。反过来网络 app 是用网络技术HTML、CSS和JavaScript设计的 app不与特定的操作系统绑定。图 13-1 提供了本机 app 和网络 app 的高级视图。图 13-1 本机 app 为特定操作系统构建网络 app 用网络技术构建如图 13-1 所示本机 app 通常从应用商店安装旨在利用特定操作系统的功能。网络 app 通常从网站运行旨在使用网络技术。网络 app 在浏览器或其他呈现网络内容的进程中运行。现在让我们更细致地看看本机 app 和网络 app。13.1.1 本机 app如前所述本机 app 为特定操作系统而构建。苹果应用商店和之后类似的应用商店开创了本地软件开发的新时代为开发人员提供了新的目标平台、新的软件分发方法以及用软件赚钱的新方法。本机 app 的开发目前主要集中在两个平台上iOS 和 Android。当然仍然要为其他操作系统开发软件但一般这样的软件不具备 app 的典型特性移动友好、基于触摸屏的输入、通过应用商店分发等。**Android 和 iOS 的区别在于它们的编程语言和 API 等。**因此编写在 Android 和 iOS 上都运行的 app 需要维护独立的代码库或者使用跨平台框架比如 Xamarin、React Native、Flutter、Unity。这些跨平台解决方案把每个操作系统 API 的底层细节进行了抽象使得开发人员可以编写能在多个平台上运行的代码。许多本机 app 也依赖于网络服务这意味着 app 开发人员不仅必须为 iOS 和 Android 编写并维护代码而且还必须构建或集成网络服务。开发跨平台的、网络连接 app 需要大量的工作和专业知识过去开发人员一般只关注一个平台比如 Windows PC 或 Mac。对于针对多个平台和网络的开发人员来说现在的工作当然更为复杂。平台竞争对于用户而言通常是好事但对于开发人员而言则意味着更多的工作。有意思的是app 开发的当前状态本可能会完全不同。当 2007 年 1 月发布 iPhone 时关于 iPhone 上的第三方 app 开发Steve Jobs苹果当时的 CEO是这样说的iPhone 内部有完整的 Safari 引擎。你可以编写令人惊叹的 Web 2.0 和 Ajax app它们在外观和行为上与 iPhone 的 app 完全一样。这些 app 可以与 iPhone 服务完美地集成。它们可以打电话可以发邮件可以在 Google 地图上查找位置。你猜怎么着你不需要 SDK注意SDKSoftware Development Kit软件开发工具包是开发人员用于为特定平台构建应用程序时使用的软件集合。根据这段话苹果对于第三方 app 开发的初始计划是简单地让开发人员构建能使用 iPhone 功能的类 app 网站。本机 app 的开发将局限于苹果开发比如相机、电子邮件、日历app。当时把网络用作应用程序开发的平台并不常见。苹果的立场是具有前瞻性的。可惜的是2007 年网络的底层技术还不够成熟不能让网络成为真正的 app 平台。到 2007 年 10 月苹果改变了它的说法宣布苹果将允许开发人员为 iPhone 构建本机 app。2008 年苹果开放了应用商店作为向用户分发本地 iPhone app 的唯一受支持的机制。苹果策略的逆转使公司受益因为应用商店成为苹果收入的来源。注册为应用商店开发人员需要付费苹果还从每一笔销售额中收取一定比例的费用。应用商店和本机 iPhone 开发也为独家内容打开了大门app 只能在苹果设备上运行。应用商店还为最终用户带来了好处。带有评级的精选 app 列表很有帮助且商店提供了对用户信任度的度量。进入应用商店的 app 必须符合特定的质量标准。集中式支付服务意味着用户不必把自己的支付信息提供给多个公司。app 自动更新这相对于传统 PC 软件来说是一个优势不过对于网络来说不算优势因为网络 app 也能在没有用户参与的情况下更新。随着苹果应用商店的成功其他公司也创建了类似的数字商店来分发软件。Google 播放商店、Microsoft 商店和 Amazon 应用商店的运营模式都与苹果商店类似而且提供的好处也类似。尽管这个系统对这些公司和最终用户都有很好的效果但它也给开发人员创造了一个复杂的环境多个商店、多个平台以及各种技术。每个数字市场都有自己的需求而 app 开发人员必须满足这些需求而且每个商店都占销售收入的一定份额。13.1.2 网络 app伴随本机 app 的兴起网络逐渐成熟成为有相当能力运行 app 的平台。一种被称为 HTML5 的成熟 HTML 版本被引入其中网络浏览器在处理内容方面变得更加强大更加一致。浏览器开发人员使其 JavaScript 实现符合 ECMAScript 5 标准为 JavaScript 代码提供了更好的基础。在浏览器更新之外网络开发人员社区接受一种被称为响应式网络设计的概念即不论显示屏幕的大小如何都能确保网络内容得到很好呈现的一种方法。使用响应式设计技术网络开发人员可以维护一个跨不同设备仍然运行良好的网站而不是针对不同设备创建不同的网站。此外近年来还发布了多个网络开发框架比如 Angular 和 React。这些框架让开发人员更加轻松地编写和维护网络 app——行为类似于 app 的网站。开发人员已经意识到现代网络技术可以用于构建与本机 app 非常相似的体验许多开发人员搭建了充当 app 的网站。一些开发人员选择完全放弃本机 app而只构建网络 app。这个方法的好处是网络 app 可以在具有现代网络浏览器的任意设备上运行而代码只需要编写一次。不过网络 app 也有一些缺点。网络 app 不能访问全部的设备功能往往比本机 app 要慢要求用户在线而且通常不会出现在应用商店中。为了解决网络 app 的一些不足渐进式网络 app (Progressive Web AppPWA) 提供了一组技术和指南来帮助弥补本机 app 和网络 app 之间的差距。PWA 只是一个具有一些额外功能的网站这些功能有助于使它更像 app。渐进式网络 app 必须通过 HTTPS 提供服务在移动设备上恰当地呈现下载后能离线加载向浏览器提供描述 app 的清单在页面之间快速转换。对最终用户而言运行 PWA 与运行本机 app 应该是一样的响应迅速且自然。如果网站符合 PWA 的标准那么现代网络浏览器会给用户提供为其主屏幕或桌面添加 PWA 图标的选项。这表示用户可以像启动本机 app一样启动网络 app。app 在自己的窗口而不是浏览器窗口中打开而且一般表现得就像本机 app 一样。PWA 可以为那些希望把网络技术用于其 app但又不想针对不同平台构建多个 app 的开发人员提供非常大的好处。不过PWA 仍然存在一些缺点。一个重要问题就是PWA 不会出现在应用商店中。多年以来移动操作系统一直使用户认为app 应该通过应用商店获得。用户不习惯通过浏览网页获得 app。在撰写本书的时候只有 Microsoft 商店允许PWA直接发布到商店。其他平台希望从浏览器安装 PWA或者将其重新打包成呈现网络内容的本机 app然后把这个重新打包的 app 提交到商店。另一个潜在的缺点是 PWA 可能看起来不像本机 app它们在所有平台上的外观通常都基本一样尽管有些人可能认为这是件好事。PWA 仍然不具有本机 app 的性能也不能访问底层平台的所有功能但根据 app 的需求这不一定是个问题。13.2 虚拟化和仿真什么时候计算机不是物理设备当然是在它是虚拟计算机的时候虚拟化 是使用软件 创建计算机 虚拟表示的 过程。相关的 仿真技术 允许 为某种类型的设备 设计的应用程序 运行在完全不同的设备上。本节将探讨虚拟化和仿真。13.2.1 虚拟化虚拟计算机被称为虚拟机 (Virtual MachineVM)它像物理计算机一样运行操作系统。应用程序可以在这个操作系统上运行。从应用程序的角度来看虚拟化硬件就像物理计算机一样。虚拟化支持几个有用的场景。运行一个操作系统的计算机可以在虚拟机中运行另一个操作系统。例如运行 Windows 的计算机可以在虚拟机中运行 Linux 的实例。虚拟机还允许数据中心在一个物理服务器上托管多个虚拟服务器。这为互联网托管公司提供了一种方法只要客户愿意使用虚拟服务器就能轻松迅速地为客户提供专用服务器。VM 易于备份、还原和部署。管理程序 (hypervisor) 是运行虚拟机的软件平台。管理程序有两种类型如图 13-2 所示。图 13-2 类型 1 管理程序和类型 2 管理程序如图 13-2 左侧所示管理程序可以直接与底层硬件交互实际上管理程序放置在技术栈中内核的下面。管理程序与物理硬件通信并把虚拟化硬件呈现给 OS 内核它被称为类型 1 管理程序。与之相比图 13-2 右侧所示的类型2管理程序则作为应用程序运行在操作系统上。微软的 Hyper-V 和 VMware ESX 是类型1管理程序而VMware Player 和 VirtualBox 是类型 2 管理程序。另一种常见的虚拟化方法是使用容器。容器提供隔离的用户模式环境应用程序在这个环境中运行。与虚拟机不同容器与主机操作系统以及在同一台计算机上运行的其他容器共享内核。在容器中运行的进程只能看到物理计算机上部分可用资源。例如每个容器都能被授予自己的独立的文件系统。容器可隔离 VM无须为每个 VM 运行单独的内核。通常由于内核是共享的容器被限制运行于主机相同的操作系统。像 OpenVZ 一样的容器技术被用于虚拟化操作系统的整个用户模式部分而其他的容器技术比如Docker则被用于在独立的容器中运行单个应用程序。注意你可能还记得第 10 章将操作系统进程描述为 “容器”这与虚拟化容器不是一回事。13.2.2 仿真仿真 是用软件 让一种类型的 设备的 行为 类似于 另一种类型的 设备的 行为的 过程。仿真和虚拟化的相似点在于它们都为软件运行提供虚拟环境但虚拟化提供的是底层硬件的一部分而仿真提供的虚拟硬件则与使用的物理硬件不同。例如在 x86 处理器上运行的虚拟机或容器直接使用物理 CPU 运行为 x86 编译的软件。相比之下在 x86 处理器上运行的仿真器执行仿真的程序可以运行为完全不同的处理器编译的软件。除了处理器之外仿真器通常还提供其他虚拟硬件。例如世嘉 Genesis20 世纪 90 年代的电子游戏系统的完整仿真器可以模拟摩托罗拉 68000 处理器、雅马哈 YM2612 声音芯片、输入控制器以及世嘉 Genesis 中的所有其他硬件。运行时这样的仿真器会把最初设计在世嘉 Genesis 上运行的 CPU 指令转换为在 x86 代码中实现的功能。这带来了巨大的开销因为每条CPU 指令都必须进行转换但足够快的现代计算机仍然可以全速仿真速度慢得多的世嘉 Genesis。其结果就是能在完全不同的平台上运行针对某个平台设计的软件如图 13-3 所示。图 13-3 为系统 A 编译的代码可以在系统 A 的仿真器上运行仿真在保留为过时平台所设计的软件方面起着重要作用。随着计算机平台的老化找到能工作的硬件变得越来越难。那些希望把旧软件引入现代平台的软件开发人员往往就使用仿真技术。最初的源代码可能会丢失或者对其进行现代化的任务可能会很繁重。在这种情况下使用仿真器能让原始已编译的代码无须修改就可在新平台上运行。进程虚拟机还有另外一类虚拟机它与仿真器有一些共同特性。进程虚拟机运行应用程序的执行环境是对底层操作系统细节的抽象。它与仿真器类似因为它提供了一个与运行它的硬件和操作系统分离的执行平台。但是与仿真器不同的是进程 VM 不会尝试模拟真实硬件。相反它提供的环境旨在运行平台无关的软件。如同我们在第 9 章讨论的一样Java 和 .NET 利用了运行字节码的进程虚拟机。13.3 云计算云计算是指通过互联网提供计算服务。本节将介绍各种类型的云计算但首先让我们快速回顾一下远程计算的历史。13.3.1 远程计算的历史从有计算以来我们就可以观察到一个钟摆模式从远程集中式计算从终端访问的服务器到本地计算桌面计算机现在再回到从智能本地设备如智能手机访问的远程计算网络。当前许多应用程序同时依赖于远程计算和本地计算。对于网络有些代码在浏览器上运行有些代码在网络服务器上运行。与早期那些像房间那么大的计算机相比今天我们在口袋里揣着的设备要强大得多但是很多我们想在这些设备上做的工作都涉及与其他计算机的通信因此在本地设备与远程服务器之间分担处理责任是有意义的。随着远程计算的重新出现组织需要维护服务器。在过去这意味着购买物理服务器按需对其进行配置将其与网络连接并让它在某个地方的机柜中运行。组织可以物理访问计算机并完全控制其配置。但是维护一台服务器或一组服务器可能是一项复杂且成本高昂的工作这涉及购买和维护硬件、及时更新软件、处理安全问题和容量规划问题、管理网络配置等。一般来说这项工作所需的技能和专业知识与组织目标并不一致。即便是以技术为主的公司也不一定想要做维护服务器的业务。这就是云计算的用武之地。云计算通过互联网云提供远程计算功能。**底层硬件由云服务公司云提供商维护使需要这些功能的组织或用户云用户免于维护服务器。**云计算允许按需购买计算服务。对于云用户而言这就意味着释放对某些事物的控制权并相信第三方可提供可靠服务。云计算有多种形式让我们看看其中的一些。13.3.2 云计算的分类云计算的各种类别通常由在云提供商和云用户之间划分责任的界限来定义。图 13-4 展示了四类云计算IaaS、PaaS、FaaS 和 SaaS及各自的责任划分。稍后我们将逐一介绍它们。图 13-4 各类云计算产品的责任划分图 13-4 中的垂直栈表示应用程序运行所需的组件。不论使用哪种云计算产品都需要全部的组件——不同类型之间的差异在于每个组件是由云用户负责管理还是由云提供商负责管理。每个栈中的各种组件应该看着很熟悉因为我们之前已经介绍过这些内容了。但是“运行时” 还需要解释一下。运行时环境是应用程序执行的环境它包括了所有需要的库、解释器、进程虚拟机等。现在让我们从左到右介绍一下图 13-4 中的四类云计算。基础设施即服务 (Infrastructure as a ServiceIaaS)是一种云计算场景在这个场景中云提供商只管理硬件和虚拟化允许用户管理操作系统、运行时环境、应用程序代码和数据。IaaS 的用户通常会得到连接到互联网的虚拟计算机以按照他们认为合适的方式使用一般是作为某种类型的服务器使用。这个虚拟计算机常常实现 为基于管理程序的虚拟机 或者Linux发行版的 用户模式部分的 容器。IaaS 虚拟服务器的用户可以访问虚拟机的操作系统还可以按照自己的想法对它进行设置。这给了用户最大的灵活性但这也意味着维护系统软件包括操作系统、第三方软件等的责任完全落在了用户的肩上。IaaS 提供了一台虚拟计算机用户负责在该计算机上运行的所有内容。Amazon Elastic Compute Cloud(EC2)、Microsoft Azure Virtual Machines和Google Compute Engine 都是 IaaS 的例子。平台即服务 (Platform as a ServicePaaS)赋予云提供商更多的责任。在 PaaS 场景中云提供商不仅管理硬件和虚拟化还要管理用户希望使用的操作系统和运行时环境。PaaS 用户开发一个应用程序这个应用程序的目的是在他们选择的云平台上运行它会利用这个平台的各种功能。PaaS 产品的云用户不需要关心如何维护底层 OS 或运行时环境可以只关注应用程序代码。尽管云提供商确实抽象了底层系统的详细信息但是用户还是需要管理提供商预配了哪些资源以处理应用程序。预配置资源包括所需的存储容量和被分配的虚拟机类型。PaaS 为运行中的代码提供了一个托管平台用户负责在该平台上运行的应用程序。Amazon Web Services Elastic Beanstalk、Microsoft Azure App Service和Google App Engine 都是 PaaS 的例子。函数即服务 (Function as a ServiceFaaS) 采用了 PaaS 模型但是比它更进一步。FaaS 不需要用户部署完整的应用程序或提前给出平台实例相反用户只需要部署响应某些事件的运行代码函数。例如开发人员可以编写一个函数返回到最近杂货店的距离。这个函数可以响应网络浏览器把它当前的 GPS 坐标发送到 URL。这种事件驱动模型意味着云提供商负责按需调用用户代码。用户不再需要一直运行应用程序代码等待请求。这可以简化用户的工作并降低成本尽管在函数尚未运行时这可能意味着在请求到来时响应时间会更长。FaaS 是一种无服务器计算即一种用户无须处理管理服务器或虚拟机问题的云计算模型。当然这个术语用法不当服务器实际上是要运行代码的只是用户不需要考虑这些问题罢了FaaS 为运行代码提供了一个事件驱动平台用户负责为了响应事件而运行的代码。Amazon Web Services Lambda、Microsoft Azure Functions和Google Cloud Functions 是 FaaS 的例子。软件即服务 (Software as a ServiceSaaS) 是一种完全不同的云服务。SaaS 向用户交付完全在云中管理的应用程序。IaaS、PaaS 和 FaaS 适合于希望在云中运行自己代码的软件工程团队而 SaaS 则向最终用户或组织交付已编写好的、完整的云应用程序。现在有那么多软件都在云上运行这看起来似乎并不显眼但是它却与用户或组织在本地设备和网络上安装并维护软件形成了鲜明对比。SaaS 提供了在云中管理的完整应用程序用户只需负责存储在该应用程序中的数据。甚至连数据管理也有部分是提供商处理的包括数据如何存储、备份等细节。Microsoft 365、Google G Suite和Dropbox 是 SaaS 的例子。云提供商领域的一些主要参与者包括Amazon Web Services、Microsoft Azure、Google Cloud Platform、IBM Cloud、Oracle Cloud 和Alibaba Cloud。13.4 深网和暗网你可能已经看过关于发生在暗网(dark Web)或深网(deep Web)中的邪恶事件的新闻。不幸的是这两个术语经常被搞混但它们的含义是不同的。如图 13-5 所示网络可以分成三大类表层网、深网和暗网。图 13-5 表层网、深网和暗网**任何人都可以免费访问的内容是表层网的一部分。**公共博客、新闻网站、公共推特帖子都是表层网内容的例子。表层网由搜索引擎索引有时表层网也被定义为可以用搜索引擎找到的内容。**深网是指不登录网站或网络服务就无法访问的网络内容。**大多数互联网用户会定期访问深网内容。查看银行账户余额、通过像Gmail这样的网站阅读电子邮件、登录Facebook、查看Amazon上的个人购买记录——这些都是深网活动的例子。**深网只是一些不公开的内容通常需要某种密码才能访问。**大多数用户不想公开自己的电子邮件或银行账户所以有充分的理由说明为什么这种内容不公开且不能被搜索引擎索引。**暗网是需要用专用软件来访问的网络内容。**只使用标准的网络浏览器是无法访问暗网的。最流行的暗网技术是 Tor洋葱路由器。通过加密和中继系统Tor 允许匿名访问网络防止用户的 ISP 监控访问了哪些网站也防止网站知道访问者的 IP 地址。此外Tor 还允许用户访问那些被称为洋葱服务的网站如果没有 Tor 就根本无法访问它们——这些网站就是暗网的一部分。Tor 隐藏了洋葱服务的 IP 地址使它们变成匿名的。如你所料暗网的匿名性有时会被用于犯罪目的。但是暗网提供的隐私也有其合法用途比如举报和政治讨论。建议在访问暗网内容时要谨慎。13.5 比特币**加密货币是一种用于金融交易的数字资产是传统货币的替代品。**加密货币的用户持有该货币的余额就像在传统的银行一样也可以把这些货币用于购物和服务。有些用户主要把加密货币看作一种投资而不是一种商业手段对这些用户来说它更类似于黄金。与传统货币不同的是加密货币通常是分散的 (decentralized)没有单一组织控制它们。13.5.1 比特币基础**比特币于 2009 年推出是第一种分布式加密货币也是现在最著名的加密货币。**从那时起大量的加密货币称为山寨币如雨后春笋般涌现但没有一个能挑战比特币的主导地位。比特币的主要货币单位也简称为比特币缩写为 BTC。**比特币和类似的加密货币都以区块链技术为基础。**在区块链中信息被分组成称为区块的数据结构区块按照时间顺序链接在一起。也就是说当创建一个新区块时它被添加到区块链的末端。以比特币为例区块保存着交易记录跟踪比特币的移动轨迹。图 13-6 展示了比特币的区块链。图 13-6 比特币的区块链按时间顺序链接交易记录区块区块链通过互联网等网络运行由多台计算机一起来处理交易和更新区块链。一起工作以处理比特币交易的计算机被称为比特币网络。连接到比特币网络的计算机被称为节点某些节点保存了区块链的副本没有单一的底本。通过加密和解密来保证交易的完整性并防止篡改区块链中的数据。一旦写入区块链中的数据就是不可变的即无法更改。比特币的区块链是一个公开的、分布式的、不可变的交易账本。这个账本用于记录比特币网络上发生的所有事件比如比特币的转账。13.5.2 比特币钱包最终用户的比特币存储在所谓的比特币钱包中。不过更准确地说是比特币钱包持有加密密钥对的集合如图 13-7 所示。图 13-7 比特币钱包包含密钥对比特币地址派生于公钥如图 13-7 所示钱包中的每一对密钥都含有两个数字一个私钥和一个公钥。私钥是一个随机生成的 256 位数字。这个数字必须保密任何知道私钥的人都可以使用与该密钥对关联的比特币。公钥用于接收比特币它从私钥派生而来。在接收比特币时公钥表示为比特币地址一个由公钥生成的文本字符串例如 13pB1brJqea4DYXkUKv5n44HCgBkJHa2v1。假设我有一个比特币要发给你。这个比特币和我控制的一个地址关联。也就是说我有这个地址的私钥。如果你把由你控制的比特币地址的文本字符串给我我就可以把我的比特币发送到这个地址。你不需要也不应该把你的私钥发给我。我可以把我的比特币发给你是因为我有自己地址的私钥这允许我使用自己的比特币。反过来我不能从你的地址转出任何比特币因为我没有你的私钥。这段话其实是在讲一件事为什么你可以把比特币地址给别人收钱但别人不能凭地址偷走你的币。可以这样理解概念相当于什么能不能给别人比特币地址银行账号 / 收款码可以给私钥银行卡密码 / 支付密码绝对不能给转账用私钥签名证明“我同意转走这笔钱”只有私钥持有者能做原话拆成白话版“我有一个比特币它和我控制的一个地址关联”意思是这笔币记录在区块链上属于某个地址。“我有这个地址的私钥”意思是我掌握这个地址的“支付密码”所以能花里面的币。“你把你的地址给我我就能把币转给你”意思是你只需要给我收款地址就像给我银行账号我就能往里面打钱。“你不应该把私钥发给我”意思是私钥等于资产控制权谁拿到私钥谁就能转走那个地址里的所有币。“我能转币是因为我有自己地址的私钥”意思是转账时我用我的私钥对交易做数字签名网络验证签名合法后才承认这笔钱是我同意转出去的。“我不能从你的地址转出币因为我没有你的私钥”意思是我知道你的地址只能往里面打钱没有你的私钥就签不了名也就动不了你的币。最简版本地址 收钱用的门牌号私钥 开门用的钥匙。别人知道门牌号只能往你家寄东西但只有拿着钥匙的人才能从屋里把东西拿走。要不要顺带说说公钥在这套机制里起什么作用私钥和公钥的配合方式其实是理解为什么地址不能反推私钥的关键。13.5.3 比特币交易让我们仔细看看这是如何工作的。比特币的转账被称为交易。为了发送比特币钱包软件会构造一个交易指定转账的细节用私钥对其进行数字签名并向比特币网络广播该交易。比特币网络中的计算机会验证交易并把它添加到区块链的一个新区块中。图 13-8 展示了一个比特币交易例子。图 13-8 比特币交易把 0.5 比特币移动到地址 B忽略交易费用如图 13-8 所示交易包含输入和输出表示比特币从哪里来到哪里去。图的左侧是前一个交易只显示了输出因为与前一个交易的输入无关。在前一个交易中有 0.5 比特币被送到了地址 A。图 13-8 的右侧是新的交易它把 0.5 比特币从地址 A 移动到地址 B。为了简单起见这个交易只有一个输入和一个输出。输入表示要转账的比特币的来源。你可能认为这是个比特币地址但它不是的。相反这个输入是前一个交易的输出。我们假设地址 A 是我的地址我想把 0.5 比特币转到你的地址即地址 B。现在我知道之前的 0.5 比特币已经转到了我的地址所以我可以把前一个交易的输出当作新交易的输入从而把 0.5 比特币转给你。交易的输出部分包含了发送比特币的地址。尽管你可以认为地址具有比特币余额但与地址关联的比特币数量并不存储在比特币钱包中并且余额也不会直接存储在区块链中。相反与这个地址相关的交易历史被存储在区块链中而且根据这个历史可以计算出某个地址的余额。提醒一下比特币钱包只包含支持比特币交易的密钥。13.5.4 比特币挖掘**维护比特币区块链的过程称为比特币挖掘 (Bitcoin mining)。**来自全球的计算机把交易区块添加到区块链中这些计算机被称为矿工(miner)。图 13-9 展示了比特币挖掘过程。图 13-9 比特币挖掘过程为了把交易区块添加到区块链矿工必须验证区块中包含的交易确保每个交易在语法上是正确的输入的货币尚未被消费等还必须完成一个困难问题的计算。要求矿工解决这个问题可以防止篡改区块链因为改变一个区块 就需解决 被改变区块以及该区块链上 其后所有区块的问题。作为阻止不需要行为的手段这种解决困难问题的系统被称为 “工作证明” (proof of work)。**要找到计算问题的解决方案就需要大量的试错计算。**解决方案难以产生但易于验证。第一个解决问题的矿工将获得一笔比特币。这就是新比特币产生并被引入系统的方式。在这种情况下比特币挖掘就类似于传统的挖矿——矿工进行工作并在可能的情况下 “挖到金子”。除了获得新 “铸造” 的比特币之外矿工还可以对该区块中包含的每笔交易收取一定费用这个费用要从交易的比特币总量中扣除。比特币被设计成总共只允许挖掘2100万比特币。一旦达到这个数字比特币矿工将不再获得比特币只能依靠交易费用来获得其运营资本。比特币的开端比特币区块链开始于 2009 年 “挖掘” 的第一个区块这个区块被称为 “创世区块”。这个区块由 Satoshi Nakamoto 挖掘他被视为比特币的发明人。“Satoshi Nakamoto” 被认为是一个化名在撰写本书时此人的身份仍存在争议。要通过比特币挖掘获利运行挖掘硬件的成本不能超过获得的比特币的价值。比特币挖掘硬件常常很耗电所以比特币挖掘者的电费可能很高。最初比特币是在普通计算机上挖掘的但现在使用专门的昂贵硬件进行尽可能快的挖掘请记住奖励授予第一个解决问题的计算机。这些成本加上比特币高度波动的价格意味着比特币挖掘不是一个有保障的盈利途径比特币区块链是公开的——任何人都可以查看全部交易。但是区块链不包含比特币转账的个人身份记录。所以虽然余额和交易历史记录是公开的但并没有便捷的方法能把地址和个人联系起来。出于这个原因比特币吸引了那些想要保持匿名的人比如那些在暗网上经营商业网站的人。区块链技术与加密货币密切相关它被用作金融账本还可以用于其他目的。任何需要防篡改历史记录的系统都可以使用区块链。时间会证明比特币或其他加密货币是否能取得长期成功但无论如何我们可能都会看到区块链以其他新颖的方式发挥作用。13.6 虚拟现实和增强现实虚拟现实 (Virtual RealityVR) 和增强现实 (Augmented RealityAR) 这两项技术有可能从根本上改变我们与计算机交互的方式。虚拟现实是一种计算形式它让用户沉浸在三维虚拟空间中这个空间一般通过头戴式设备来呈现。VR 允许用户通过各种输入方式与虚拟对象交互输入方式包括用户的注视、语音命令和专用手持控制器。相比之下增强现实是把虚拟元素叠加到现实世界中要么通过头戴式设备实现要么由用户 “通过” 手持便携设备比如智能手机或平板电脑实现。VR 让用户沉浸在另一个世界AR 改变现实世界。尽管几十年以来已经对 VR 进行了各种尝试但直到 21 世纪 10 年代VR 才变成主流。Google 在 2014 年通过 Google Cardboard 帮助推广了VRGoogle Cardboard 的命名出自 VR 头戴式设备可以由纸版、镜片和智能手机构成的想法。通过把左眼内容呈现在智能手机一半屏幕上右眼内容呈现在屏幕的另一半上专门设计的 Cardboard 应用程序把 VR 内容呈现给用户如图 13-10 所示。图 13-10 专门为 Google Cardboard 设计的应用程序的 VR 模式为 Cardboard 设计的应用程序依赖于智能手机检测陀螺仪运动的能力允许显示内容随着用户头部的移动而更新。这样的头戴式设备据说有 3 个自由度 (3DoF)头戴式设备可以追踪有限的头部运动但无法追踪空间中的其他运动。这使得用户可以使用头戴式设备环顾但不能移动。Cardboard 还支持基本的一键输入。Cardboard 简单但有效。它向许多用户介绍了 VR否则他们可能不会尝试 VR。更具有沉浸感的体验需要 6 个自由度 (6DoF)用户可以通过在现实空间中物理移动身体以实现在 VR 中的四处移动。有些 VR 头戴式设备支持6DoFVR 控制器可以支持 3DoF 或 6DoF。握在用户手中的 6DoF 控制器可以追踪控制器在 VR 空间中的位置从而允许与 VR 环境进行更自然的互动。自 Google Cardboard 推出以来消费市场已经发布了许多 VR 解决方案。有些依赖于智能手机Samsung Gear VR和Google Daydream。另外一些通过连接 VR 头戴式设备和控制器Oculus Rift、HTC Vive和Windows Mixed Reality使用个人计算机进行处理。还有一些是独立设备不需要智能手机或 PCOculus Go、Oculus Quest和Lenovo Mirage Solo。一般来说连接 PC 的解决方案提供了最高的图形保真度但也是最贵的特别是考虑到所需计算机的成本时。如前所述增强现实 (AR) 是一种相似但独特的技术。VR 试图让用户完全沉浸在虚拟世界中而 AR 则把虚拟元素叠加到现实世界中。这可以通过移动设备来完成使用后置摄像头观察现实世界将模拟元素叠加到摄像头所看到的内容上。先进的 AR 技术允许软件理解房间内的物理元素这样叠加的虚拟元素就可以与环境进行无缝交互。移动应用程序中的 AR 是以基本形式实现的但在专用设备中它的实现更为充分比如在Google Glass、Magic Leap 的头戴式设备和 Microsoft HoloLens。将这种 AR 设备戴在头上可以把计算机生成的图形叠加到用户视野中。用户能以各种方式比如语音命令或手部跟踪与虚拟元素进行交互。各种 VR 和 AR 技术统称为XR为软件开发人员提供了多种目标平台。许多 VR 开发人员依赖于现有的游戏引擎这些游戏引擎一般用于制作 3D 游戏比如 Unity 游戏引擎或 Unreal 游戏引擎。游戏开发人员对这些游戏引擎已经非常熟悉了使用它们能让开发人员相对轻松地面向多个 VR 平台制作自己的软件。网络开发人员可以使用被称为 WebVR 和 WebXR 的 JavaScript API 开发 VR 和 AR 内容。WebVR 先出现它专注于 VR。WebXR 紧随其后出现它同时支持 AR 和 VR。13.7 物联网传统上我们认为服务器在互联网上提供服务用户通过联网的个人计算机设备比如PC、笔记本计算机和智能手机与这些服务器进行交互。近些年我们已经看到与互联网连接的新型设备越来越多—如扬声器、电视机、恒温器、门铃、汽车、灯泡应有尽有这种把各种设备连接到互联网的概念称为物联网 (Internet of ThingsIoT)。电子元件的成本和物理尺寸正在下降Wi-Fi 和蜂窝互联网接入正在普及消费者希望他们的设备更加 “智能”。所有这些都促成了把一切都连接到互联网的趋势。如果没有某种网络服务的支持IoT 设备一般不会运行所以云计算的兴起也促进了物联网的传播。对消费者而言IoT 设备在 “智能家居” 中很突出而 “智能家居” 中所有类型的家用电器都能被监视和控制。在商业领域在制造业、医疗保健、交通运输等领域中都能找到 IoT 设备。虽然这些类型的连接设备带来了明显的好处但这些设备也带来了风险。它们的安全性是一个特别值得关注的领域。不是所有的 IoT 设备都能很好地抵御恶意攻击。即使攻击者对设备上的数据没兴趣攻击者也可能将这个设备充当攻击其他防御良好的网络的一个据点或者当成对不同目标进行远程攻击的发射点。特别是对消费者来说IoT 设备似乎已经足够无害了并且在把这样的设备连接到家庭网络时安全问题通常不是首要考虑的问题。隐私是 IoT 设备带来的另一个风险。许多这样的设备本质上就是收集数据的。这些数据常常被发送给云服务进行处理。最终用户应该在多大程度上信任使用他们的个人数据运行这些服务的组织即使是善意的组织也有可能成为数据泄露的受害者用户数据可能以意想不到的方式被暴露。**像智能音箱这样的设备必须一直处于听的状态以等待口头命令。这就产生了意外记录私人对话的风险。**看到今天的消费者心甘情愿用隐私换取便利George Orwell 的小说《1984》的现代读者可能会发现某种讽刺意味。IoT 设备的所有功能常常依赖于云服务这也是它们带来的一个风险。如果一个设备与互联网的连接中断这个设备可能会暂时变得不那么有用。更令人担忧的是设备制造商可能会在某天永久关闭支持该设备的服务。那时智能设备就会还原成非智能设备13.8 总结本章讨论了与现代计算机相关的各种主题。你学习了 app包括本机 app 和网络 app。你了解了虚拟化和仿真是如何让计算机在虚拟硬件上运行软件的。你还了解了云计算是如何为运行软件提供新平台的。你学习了表层网、深网和暗网的区别以及比特币等加密货币如何实现分布式支付系统。我们谈到了虚拟现实和增强现实以及它们如何为计算机提供独特的用户界面。你还了解了 IoT并有机会搭建一个联网的 “自动贩卖机”。在这里让我们总结性地回顾一些主要的计算机概念看看它们是如何结合在一起的。计算机是二进制数字设备其中的所有信息都表示为 0 和 1。二进制逻辑也被称为布尔逻辑为计算机运算打下了基础。计算机用数字电路实现其电平表示为二进制状态—低电平为 0高电平为 1。数字逻辑门是基于晶体管的电路它能执行布尔运算比如 AND 和 OR。我们可以把这样的逻辑门排布成更加复杂的电路比如计数器、存储设备和加法电路。这些类型的电路为计算机硬件提供了概念基础这些硬件包括执行指令的中央处理器 (CPU)上电时存储指令和数据的随机存取存储器 (RAM) 以及与外界交互的输入/输出 (I/O) 设备。计算机是可编程的它们可以在不改变硬件的情况下执行新任务。告诉计算机要做什么的指令被称为软件或代码。CPU 执行机器码而软件开发人员则通常用高级编程语言编写源代码。计算机程序一般在操作系统上运行操作系统即与计算机硬件通信并为程序执行提供环境的软件。计算机用互联网通信互联网是一组全球连接的计算机网络这些网络都使用 TCP/IP 协议套件。互联网的一个流行的应用是万维网它是一组分布式的、可寻址的、链接的资源通过 HTTP 在互联网上传递。所有这些技术都为现代计算机的创新提供了一个蓬勃发展的环境。我希望这本书能让你全面了解计算机是如何工作的。本书涵盖了大量的基础知识但我们仍然只涉及大多数主题的表面。**如果某个特定的领域引起了你的注意那么我鼓励你继续探索这个主题**还有大量关于计算机的知识有待发现。