跳转至

分散应用

分散式应用程序 ( DApps )是运行在分散式网络上的应用程序,不归中央机构所有或控制。它们与分布式应用程序的主要区别在于所有权。分布式应用程序可能运行在成千上万台计算机上,但是这些计算机和运行在它们上面的软件的管理是由一个中央权威机构控制的——Amazon、Microsoft 等等。分散式应用程序运行在典型的对等网络上,其设计方式使得任何人或组织都无法控制应用程序的运行。分散式应用程序不需要区块链。在区块链之前有多种分散式应用程序:BitTorrent、Tor 和乳齿象都是不使用区块链的分散式应用程序。

在本章中,我们将介绍以下内容:

  • 分散式应用程序的主要特征
  • 当今最大的分散式应用
  • 不基于区块链的分散式应用程序

本章的目的是让你了解分散式应用程序及其开发,并让你了解已经存在的生态系统和代码。如果您对构建一个分散的应用程序感兴趣,那么与现有生态系统的互操作性将大大提高您的胜算。

让我们先来看看是什么让应用程序去中心化。

是什么让应用程序去中心化

在本书的前面,我们讨论了分布式系统和分散式系统。分布式系统是由许多计算机组成的系统,系统的工作分布在所有这些机器上。通常,分布式网络中的计算机被放置在不同的地理区域,以保护系统免受断电、自然灾害或军事事件的影响。分散式网络不仅在地理上是分散的,而且在权限和控制方面也是分散的。像亚马逊云这样的分布式系统可以在全球范围内运行,但仍然处于中央机构的控制之下。分散的系统没有中央权威。

定义分散式应用程序

基于区块链的分散式应用程序的一个众所周知的资源是戴维·约翰逊写的题为分散式应用程序的一般理论,DApps 的白皮书。在这份白皮书中,他确定了成为 DApp 的四个关键标准:

  1. 应用程序必须完全开源;它必须自主运行,没有实体控制它的大部分令牌。应用程序可以根据建议的改进和市场反馈修改其协议,但所有的更改必须由用户一致同意。

  2. 应用程序的数据和操作记录必须加密存储在一个公共的、分散的区块链中,以避免任何中心故障点。

  3. 应用程序必须使用访问应用程序所需的加密令牌(比特币或系统自带的令牌),矿工/农民的任何价值贡献都应获得应用程序令牌的奖励。

  4. 应用程序必须根据标准加密算法生成令牌,作为节点对应用程序贡献价值的证明(比特币使用 PoW 算法)。

但是,这个定义非常有限。David 只考虑在区块链上运行的分散式应用程序,并且只考虑那些可以通过令牌激励的应用程序。在区块链之前,有许多不使用或不需要令牌的分散式应用程序。在本章中,我们将讨论区块链和非区块链的分散式应用程序,但重点是那些与区块链生态系统相关的应用程序。我们还将讨论非分散的区块链应用程序,尽管它们运行在分散的网络之上。

对于本书,我们将使用以下四个标准来描述分散式应用程序:

  • 该应用程序必须是完全开源的。
  • 它必须自主运行,没有个人、组织或有组织的团体控制应用程序的运行。应用程序可以根据建议的改进和市场反馈修改其协议,但所有的更改必须由用户一致同意。
  • 应用程序的数据必须以一种公开的、分散的方式存储,这种方式对检查是开放的,并且没有单点故障。
  • 应用程序必须提供一种方法,在所有关键用户群中调整应用程序的使用激励。

正如您所看到的,这个简化的定义保留了分散化的所有关键原则,而不依赖于区块链或令牌,因为有或没有区块链,分散化应用程序都有许多构造或使用的方式。正如我们在研究 IPFS 时将会看到的,完全有可能有一个没有区块链的去中心化应用程序,没有令牌的激励机制。

分散式应用和区块链

分散式应用程序是一个特定目的的分散式系统。例如,以太坊是一个分散的网络,因为任何人都可以加入,节点都是对等的,所以分散的应用程序将在网络上运行,为用户提供特定的服务或一组服务。在某种程度上,这种区别是没有实际意义的——您可以将以太坊视为一个提供智能合约服务和本地令牌传输的分布式应用程序。无论如何,关键的区别在于权力。

使用区块链不会使应用程序分散

单个实体或小组对应用程序的控制越多,它就越集中。任何一个团体越不能控制应用程序的命运和功能,它就越分散。正如分散式应用程序不需要区块链一样,在区块链上运行并不会使应用程序分散化。这意味着今天在区块链上运行的许多应用程序可能仍然不是真正的分散应用程序。这是真的,即使应用程序是完全开源的。

为了举例说明,让我们考虑一个用 Solidity 编写的名为SpecialClub的小示例应用程序。这非常简单,只需保存一个成员列表(存储为地址),这些成员是Special Club的一部分:

pragma solidity ^0.4.23;

contract SpecialClub {
    // Centralized owner of this application
    address public owner;
    // we set members to true if they are a member, false otherwise.
    mapping(address => bool) public members;
    mapping(address => bool) internal requests; 

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner() {
      require(msg.sender == owner);
      _;
    }

    function approveMembership(address _address) onlyOwner external {
        members[_address] = true;
        requests[_address] = false;
        emit GrantedMembership(_address);
    } 

    function requestOwnership() external {
        requests[msg.sender] = true;
        emit RequestToJoin(msg.sender);
    }

    event RequestToJoin(address _address);
    event GrantedMembership(address _address);
}

尽管是用 Solidity 编写的,并且部署在区块链上,但是这些代码是完全集中的。它仍然是分布式的,因为如果部署的话,成员列表将在整个以太网中公开分发。然而,控制权仍然在一个地址——ownerowner地址对谁可以加入SpecialClub的会员名单有绝对的控制权。因此,基于该成员列表的任何进一步的功能通常将被集中。与传统应用程序相比,一个持续存在的优势是透明性——通过将代码及其状态写入区块链,每个人都清楚规则和成员列表。然而,要成为一个真正分散的应用程序,这个应用程序需要修改,例如,现有的成员可以投票决定接受或拒绝谁。

这是一个非常基本的例子:

pragma solidity ^0.4.23;

contract SpecialClub {
    address public owner;
    // we set members to true if they are a member, false otherwise.
    mapping(address => bool) public members;
    mapping(address => bool) internal requests;
    mapping(address => mapping(address => bool)) votedOn;
    mapping(address => uint8) votes;

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner() {
      require(msg.sender == owner);
      _;
    }

    modifier onlyMember() {
        require(members[msg.sender] == true);
        _;
    }

    function approveMembership(address _address) onlyOwner external {
        members[_address] = true;
        requests[_address] = false;
        emit GrantedMembership(_address);
    } 

    function requestOwnership() external {
        requests[msg.sender] = true;
        emit RequestToJoin(msg.sender);
    }

    function voteInMember(address _address) onlyMember external {
        //don't allow re-votes
        require(!votedOn[_address][msg.sender]);
        votedOn[_address][msg.sender] = true;
        votes[_address] = votes[_address] + 1;
        if (votes[_address] >= 5) {
            members[_address] = true;
            requests[_address] = false;
            emit GrantedMembership(_address);
        }
    }

    event RequestToJoin(address _address);
   event GrantedMembership(address _address);
}

这个版本允许新成员加入,如果至少有五个现有成员投票支持的话。虽然这样的应用程序开始时是集中式的,但是在五个成员之后,所有者将不再能够对成员列表施加任何控制。随着时间的推移,权力下放的程度将会增加。

主要的分散式区块链应用

假设本书的读者可能正在考虑启动他们自己的分散式应用程序项目或者为现有的项目做贡献。在构建新的分散式应用程序时,了解现有的功能非常重要,这样您的应用程序就可以利用现有的功能。有许多现有的分散式应用程序正在运行和生产,并且已经经历了实质性的开发。一般来说,这些应用程序提供服务来帮助其他分散的应用程序蓬勃发展。此外,这些应用程序都是开源的。如果您评估了这些项目中的一个,并发现它缺少了一些东西,那么对现有功能做出贡献或为现有功能做出贡献所需要的努力可能会大大减少。

IPFS 吗

IPFS 代表星际文件系统。IPFS 被设计成一个分散的、点对点的文件系统,可以从网上访问。IPFS 是一个分散的应用程序,但不涉及区块链。相反,它基于一种叫做有向无环图DAG 的相关技术。

典型的网络通信

要理解 IPFS,从典型的网络交流方式开始,然后确定它们的区别是比较容易的。在普通的 web 通信中,有两个主要角色:客户机和服务器。服务器托管应用程序、文件等,客户端连接到服务器。客户端通常不会相互连接。如果两个客户机要进行通信,它们首先要连接到服务器,并让它充当中介。

这种方法很容易理解,公司已经学会了如何可靠地扩展它。企业转向亚马逊网络服务等服务,或使用 OpenStack 等软件,通过增加服务器容量来处理大量流量。

然而,这种方法的效率也很低。例如,想象一栋大楼里的 10 个人都在他们的笔记本电脑上看同一部电影。与其让所有 10 个客户端访问服务器并下载 10 份拷贝,为什么不让每个客户端下载电影的 1/10 th 然后与其他客户端共享,以大幅降低整体带宽并提高类似的速度呢?

对等文件传输

这种对等下载单个文件的不同部分,然后共享的方法是一种叫做 BitTorrent 的技术的核心。BitTorrent 允许对等点之间交换文件和文件碎片。这样做的缺点是,没有什么动力不下载你想要的文件,然后断开连接——防止其他人也这样做。为了避免这种情况,IPFS 从 BitTorrent 协议中获得灵感,并将其概括为一种技术,他们称之为 Bitswap 。Bitswap 的工作方式类似于 BitTorrent,但它受到了比特币及其工作证明激励系统的进一步启发。Bitswap 有自己的激励系统,如果客户下载并存储稀有数据——网络上尚未高度可用的数据——以保持高的全球可访问性。

对区块链项目的价值

而区块链提供了价值和数据交换分散方法;它们不太适合存储大型文件或内容,如图像和视频。考虑到现代客户和网络用户的期望,这是一个真正的问题。针对这些类型内容的大多数存储解决方案都是集中式的,而且价格昂贵。有了 IPFS,分散的应用程序就有了存储和访问这些内容的方法,而不会失去分散性。

阿拉贡

Aragon 是一个围绕分布式自治组织DAO s 的项目。以下是 Aragon 白皮书的摘录:

  • 阿拉贡是一个允许任何人创建和管理任何类型的组织(公司、开源项目、非政府组织、基金会、对冲基金)的 DApp...)在以太坊区块链。
  • Aragon 实现了一个组织的基本功能,如限额表、令牌转移、投票、角色分配、筹款和会计。阿拉贡组织的行为很容易通过修改章程来定制。此外,Aragon 组织可通过与组织合同交互的第三方模块进行扩展。
  • Aragon Core 是一组用 Solidity 编写的智能合同,允许分布式团队轻松地自我组织和处理典型集中式组织的活动,例如,处理工资、内部仲裁等。
  • Aragon Core 中的智能合约已经被其他项目使用,如 districtOx,作为更高级功能的基础。如果您的项目涉及任何类型的分布式治理,那么研究 Aragon Core 是有意义的。

0x 区

districtOx 网络建立在以太坊、阿拉贡和 IPFS 之上。它吸收了所有这些系统的功能,并对它们进行了扩展,以实现更具体的功能。在这种情况下,districtOx 提供了使用以太坊区块链和分散治理以分散方式运营在线市场或社区所必需的核心功能。

什么是地区?

地区是一个分散的市场/社区,建立在地区代码基础之上。d0xINFRA代码库由一组以太坊智能合约和基于浏览器的工具组成,可以与以太坊和 IPFS 进行交互。这两个代码库相互作用,提供了人们在集中式 web 上习惯的体验所必需的一组关键功能:发布和列出内容、搜索、声誉管理、支付和发票。

建立在d0xINFRA之上的每个区都将拥有这些基本功能。这个基线代码库使得将来的项目更容易、更快地开发出全功能的产品。

以太坊名称服务

以太坊地址通常写成十六进制字符串,例如0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0。这对于人来说可读性不是很好,如果你必须通过电话读给别人听、打字等等,这很容易出错。它也很容易被替换成另一个地址而不被人知道。事实上,这是少数 ICO 攻击中发生的情况。以太坊名称服务(ENS)是一个基于智能合同的系统,用于将人类可读的名称(如mytoken.ens)解析为地址。通过注册一个 ENS 地址,以太坊网络上的兼容应用程序和钱包可以将一个可读的名称(如MyTokenContract.eth)映射到以太坊地址,类似于互联网上 DNS 将域名映射到 IP 地址的方式。

强烈建议任何基于以太坊的项目都要有一个合适的 ENS 名称。它不仅对用户来说看起来更干净,而且有助于防止黑客利用这个名字试图窃取你的用户。

公民/支持

Civic 和 uPort 都是以太坊上的身份提供者 DApps。目前,您的身份信息通常由一个集中的实体持有:政府、脸书、谷歌等等。在网络上的许多地方,你可以被要求使用脸书或谷歌登录。在幕后,网站联系这些提供商之一,它提供身份凭证,然后网站让你进入。这样做的不利之处在于,您放弃的信息处于第三方的控制和管理之下。如果其中一个提供商决定停止为您服务,或者提供虚假信息,您将无能为力。

Civic 和 uPort 都是身份的分散解决方案,其中身份所有者在区块链上管理他们的身份,并可以通过他们控制的提供商服务授予和撤销权限。

许多即将推出的 DApps 融合了区块链行为、网络活动和移动应用行为。通过使用这些提供者之一,除了支持集中式提供者之外,您还可以插入新兴的分散式身份生态系统。

灵知

Gnosis 是以太坊上第一个主要的去中心化应用。Gnosis 提供了一个去中心化的预测市场和治理工具。预测市场可以在各种行业发挥作用,比如股票市场、事件博彩等等。通过使用一种分散的预测方法,人们希望这种预测更加准确,因为有更多种类的信息进入市场来调整预测。

作为以太坊最早的采用者之一,Gnosis 团队也在多签名钱包等各种工具上投入了大量的精力。

史汀

Steemit 是一款社交博客应用,类似于 Blogger 或 Tumblr。但是,内容、评论和投票都存储在区块链上并受到保护。斯蒂米特是一个 DApp,有自己的区块链。该内核改编自 Bitshares v2.0,但进行了大量修改,以适应应用的目的。

在 Steemit,用户提交内容和投票会得到奖励。每个用户的投票所携带的力量等同于他们在网络中的份额,被称为 Steem 力量。如果一个用户吸引了大量的追随者,或者拥有大量 Steem 力量的用户的追随者,那么回报可能是巨大的。报酬通常很小(从几便士到几美元),但一些作者已经能够获得数千的报酬,因为他们吸引了被称为鲸鱼的超级用户的青睐。在某些情况下,一条鲸鱼的投票本身就价值数百或数千美元。

如前所述,Steemit 不在以太坊上,不能用 Solidity 编程。然而,它确实有一个不断增长的应用生态系统,这些应用可以与 Steemit 区块链对话,并用于以不同方式管理、显示和货币化 Steemit 内容。任何考虑博客、社交媒体或类似内容应用的人,都应该仔细评估 Steemit 及其代码库。它是完全开源的,并且已经创造了一些修改过的克隆产品,比如 Golos(针对俄罗斯市场)和 Serey(针对柬埔寨市场)。

隐猫

CryptoKitties 是另一个基于以太坊的去中心化应用。CryptoKitties 是一个虚拟宠物模拟器,用户可以在区块链上购买、交易和繁殖小猫。CryptoKitties 是以太坊的一个重要里程碑,因为为 CryptoKitties 开发的技术适用于所有可能使用区块链的视频游戏。使用类似于 Cryptokitties 的技术,玩家装备、角色等可以存储在区块链上。

这一点很重要,因为许多在线视频游戏,如《《我的世界》》、《魔兽世界》等,都存在一些缺陷,游戏中的某些设备可能会被欺骗,人们可以无限制地进行克隆。使用区块链,每件商品都有一个唯一的参考号,可以像实物一样被跟踪和交易。

受 CryptoKitties 的启发,许多视频游戏正在使用这些系统进入市场,以创建真正稀缺和真实经济的世界。

摘要

您现在应该理解了分散式应用程序和分布式应用程序之间的区别。分布式应用程序是指分布在许多服务器和系统上的应用程序,理想情况下,为了备份、处理和可用性的目的,所涉及的计算机也分布在多个地理区域。在 DApp 中,没有一个公司、个人或团体能够控制应用程序的运行。

虽然有许多区块链应用程序进入市场,但并不是所有的都是真正去中心化的。在许多情况下,这些应用程序只是通过搭载在公共区块链网络上而与先前的应用程序不同地分布。如果一个公司或几个关键用户仍然控制着一个应用程序的运行和功能,那么这个应用程序就不是真正去中心化的,即使它运行在一个去中心化的网络上。

现在,您应该已经了解了目前存在的许多最大的面向区块链的分散式应用程序,以及它们之间的相互关系,您应该能够利用这些知识来指导未来的项目,并避免重新编写现有的代码。

接下来,我们将在第十八章挖矿中详细讨论区块链最大的两个网络——比特币和以太坊——是如何保障网络安全的。

参考

[1]https://github . com/DavidJohnstonCEO/分散应用


我们一直在努力

apachecn/AiLearning

【布客】中文翻译组