Web3 技术栈开发人员指南 ( part 1)

Consensys管理小助手 2023-04-14 11:43:20

 

本指南提供了 web3 技术栈的概述,旨在帮助开发人员了解构建全栈、去中心化区块链应用程序的基本技术和工具。在 Infura,我们认为实现去中心化的最佳方式是为开发人员提供构建它的工具、技术和知识。定义 web3 技术栈需要深入研究和深入了解 web3 生态系统。Web3 技术栈开发人员指南详细介绍了开始构建全栈、去中心化应用程序所需的一切。第一部分,“什么是 Web3?” 定义 web3 并将其与之前的网络演化进行比较。第二部分,“什么是 Web3 技术栈?” 在传统技术栈的背景中定义 web3 技术栈。第三部分“web3 技术栈的组件”详细讨论了支持创建 web3 应用程序的工具和技术。在第四部分“开始构建”中,我们将向您展示如何开始。什么是 Web3?要完全理解 web3,我们需要背景。互联网自诞生以来就一直在不断发展,所以让我们先来看看以前的迭代。

Web1

互联网的第一个主流版本出现于 20 世纪 90 年代中期,主要由通过自托管网站和个人网页分发的内容组成。虽然用户可以将内容传播给比以前更广泛的受众,但在线内容仍然是静态的和只读的。

这意味着网站所有者无法更新已发布的内容,网站访问者也无法以任何方式与内容进行交互。此外,在线发布内容需要高水平的技能和努力,这使得Web1的使用仅限于技术熟练的个人。

Web1

互联网的第一个主流版本出现于 20 世纪 90 年代中期,主要由通过自托管网站和个人网页分发的内容组成。虽然用户可以将内容传播给比以前更广泛的受众,但在线内容仍然是静态的和只读的。

这意味着网站所有者无法更新已发布的内容,网站访问者也无法以任何方式与内容进行交互。此外,在线发布内容需要高水平的技能和努力,这使得Web1的使用仅限于技术熟练的个人。

Web1网站示例(个人主页)

Web2下一个版本的网络在 2000 年代初期发展起来。在此阶段,Twitter 和 Facebook 等网站使互联网具有交互性——例如,网站访问者可以点赞、评论和分享帖子。为此,这个互联网时代常被描述为读写阶段。

Web2 还使普通用户无需大量技能即可更轻松地在线创造和分发内容。这模糊了内容消费者和内容创造者之间的界限,开启了至今仍在延续的用户生成内容时代。维基百科和 YouTube 是 web2 如何使用户能够与内容交互和上传内容,同时抽象出底层技术的复杂细节的示例。

Facebook 是 web2 进化的早期产物

Web3

尽管 web2 创造了许多不可或缺的服务,如电子商务、数字银行、社交网络,但它也充斥着各种问题。例如,如今很大一部分网络流量和用户数据由少数几家大型科技公司拥有和控制。

这种对互联网基础设施的集中控制会产生包括审查制度、安全漏洞和用户数据盗窃、供应商锁定以及专利软件增加等问题。更何况,web2 平台从用户生成的内容和数据中榨取了更高的利润,却选择只把收入的一小部分留给用户。

Web2 的问题正是互联网的下一次迭代(web3)的必要性。通常被描述为互联网的可读、可写、可拥有的时代,web3 的目标是成为一个去中心化的、去信任的、开放的互联网演变——用户创造、拥有并从他们的内容中获利。

与 web2 不同,去中心化和可组合性是web3的核心。数字基础设施的去中心化控制可以防止审查,最大限度地减少对中央机构的信任,并防止腐败和不平等。此外,可组合性确保任何人都可以以无需许可的方式在他人的技术基础上进行构建。

这些特性——再加上其他改进,如提供原生支付层和自主身份——使 web3 在许多情况下都很有用。从去中心化金融 (DeFi)、去中心化自治组织 (DAO) 和不可替代代币 (NFT) 到去中心化身份和去中心化社交网络,web3 可以通过多种方式使用户受益。

 

什么是 Web3 技术栈?

技术栈是用于构建和管理应用程序或项目的技术和服务的集合。Web2 开发人员可能熟悉 LAMP 和 MEAN——这些术语指的是用于构建特定类别应用程序的软件栈。例如,使用 LAMP(Linux、Apache、MySQL 和 PHP)技术栈的开发人员通常会在构建应用程序时使用这些技术:

Linux 作为操作系统 (OS),用于管理应用程序中的内存和进程。

Apache 作为 Web 服务器,用于向不同的客户端提供数据(例如,提供一组 HTML 页面以响应来自用户浏览器的 URL 请求)。

MySQL 作为数据库管理系统,用于存储和查询应用程序的实时和历史数据。

PHP 作为编写服务器端功能脚本的编程语言,包括与 Web 服务器和数据库通信的组件。

Web2 技术栈的其他组件包括用于管理 UI/UX 的前端框架(例如 React 和 jQuery)、用于身份和访问管理的身份验证框架(例如 OAuth 和 Auth0)以及用于连接到技术栈中其他组件的 API 服务。这个列表并不详尽,但在我们着手定义 Web3 技术栈时提供了足够的背景。

定义 Web3 开发栈

对于 web3 来说,技术栈的概念没有明确定义(证明了该技术的新生特性)。此外,由于去中心化是 web3 的核心精神,因此技术栈中的组件充分去中心化非常重要——这使得 web3 技术栈与传统编程中的技术栈相比更加复杂。

尽管如此,web3 多年的持续发展和创新已经产生了一系列用于开发 web3 应用程序的不同工具。虽然 web3 开发栈与 web2 栈有一些相似之处(尤其是前端开发),但它与传统开发人员所熟悉的有很大不同。

所谓 “web3 开发栈”,我们指的是支持去中心化、可组合和去信任(或信任最小化)应用程序的技术组合。与其他编程栈一样,web3 栈包括编程语言、后端工具、前端框架、数据库基础设施和用于应用程序与其他系统通信的 API。

下一节将深入探讨 web3 栈的不同部分。在那里,您将了解 web3 栈的每个组件如何运作以及它们如何协同工作。

Web3 开发栈的组件

 

区块链

区块链可以被描述为一个分布式的数字账本,它将信息存储在加密链接的区块中。区块链是 web3 栈的基础组件,在使功能性 dapp 得以实现方面发挥着关键作用。

区块链作为状态机

区块链维护 web3 应用程序的状态,并将用户帐户和余额等信息存储在键值存储中。虽然类似于传统的数据库和服务器,但区块链有一些与众不同的特质:

1.没有实体控制读写操作。区块链是一种公共数据库——任何人都可以写入或读取。当人们将区块链描述为“去中心化”和“抗审查”时,通常意味着没有个人或团体来控制谁或是什么条件下可以与区块链交互。

虽然没有人控制读写操作,但确保只有有效信息写入该公共数据库仍然很重要——否则应用程序将执行无效信息。因此,区块链具有共识算法,允许点对点网络的参与者集体验证和确认区块链的状态。

2. 存储在区块链中的信息是可公开验证和可审计的。信息通过交易写入区块链。这些交易被分批写入区块(为了提高效率),每个区块的副本存储在一个大型节点网络(点对点网络中的参与者拥有的计算机)中。

该系统确保任何人都可以轻松访问区块链并验证信息,而无需相信区块链数据是有效的。这就是人们说区块链“去信任”或“信任最小化”时的意思。

3. 区块链数据不可篡改。除了由一组交易和时间戳组成外,每个区块还包含前一个区块的加密哈希(形成“链”)。随着时间的推移,更多的区块被创建和链接起来,旧区块中的数据变得非常难以修改。

要更改过去的数据,您还需要更改每个后续块的数据。但这很难实现,因为每个块都在数千台计算机(节点)之间复制。因此,我们认为区块链中的数据是不可变的并且可以抵抗修改。

区块链作为操作系统除了存储应用程序状态外,区块链还提供了一个执行层(通常是虚拟机)来运行嵌入在智能合约中的应用程序逻辑(稍后会详细介绍)。该执行层相当于 web2 开发栈中的操作系统 (OS)。

以太坊虚拟机 (EVM) 是 web3 应用程序运行时环境的一个示例。EVM 存储账户、余额、交易数据,以及最重要的智能合约代码。对于涉及特定 dapp 的每笔交易,应用程序的智能合约代码由以太坊节点执行——导致 EVM 全局状态发生变化。

基于区块链的虚拟机消除了开发人员管理后端基础设施(例如数据库或网络服务器)的需要。该任务由存储应用程序状态和代码的节点处理,并合作执行由应用程序用户触发的操作。这就是为什么区块链也被描述为“分布式计算平台”。

EVM 兼容 vs 非 EVM 区块链

虽然 EVM 是第一个引入可编程链上逻辑的,但它有几个限制——尤其是可扩展性和成本效益。一些区块链试图通过实施 EVM 的自定义变体来解决这个问题,同时优化架构以实现高速和低计算成本。这些被描述为与 EVM 兼容的区块链,具有与 EVM 工具和基础设施无缝集成的优势。因此,学习如何构建针对 EVM 的应用程序,可以让您将这些技能转移到除以太坊之外的其他生态系统中来构建 dapps。

 

除了执行层的差异,所有区块链都有一个原生代币(代币是代表资产或实现某种形式效用的价值单位)。需要这些代币来补偿节点的计算资源。区块链的代币也可以用作参与者保护和维护区块链基础设施的经济激励。

下表列出了当今使用的一些流行的(EVM 和非 EVM)区块链,包括:

 

智能合约

智能合约是在区块链执行层上运行的软件程序(任意代码块)。“智能合约”一词源于这些程序的不同性质。例如,智能合约对协议规则进行编码,并在满足预定义条件后执行这些规则。假设爱丽丝和鲍勃想在不依赖防止作弊的中介的情况下打赌。在这种情况下,获胜条件将被写入智能合约的规则中,只有在满足条件时才会将资金发放给获胜者。

 

因为智能合约存在于区块链上,所以合约条款(用代码行编写)是不可变的,并且结果是公开的——所有这些都不需要依赖中介来执行规则。此外,智能合约几乎可以自动执行,并显着降低人为错误或腐败的风险。

在 web3 技术栈中,智能合约可以被视为区块链应用程序的后端。传统应用程序由公司控制的后端服务器(物理或基于云)管理,而存储在区块链上的智能合约决定了 web3 应用程序的业务逻辑。但智能合约不仅仅是普通后端,它们是开放的、可组合的和公共的后端:

公共:智能合约存储在区块链中的特定位置(通过部署)。与存储在链上的其他信息一样,任何有权访问区块链节点的人都可以检查智能合约代码。没有隐藏的算法——可以检查每一行代码以确认 dapp 开发人员打算让应用程序做什么。

开放:一旦部署在网络上,任何能够向区块链提交交易的人都可以触发智能合约的逻辑。这使得 web3 不同于 web2,软件公司控制后端并决定谁可以或不能与应用程序交互。

可组合性:可组合性描述了修改、重用和组合现有软件组件以创建新应用程序的能力。作为在共享计算平台上的程序,智能合约默认是可组合的。智能合约可以在执行时触发其他合约中的特定逻辑,从而减少从头开始构建应用程序逻辑的每一部分的需要。

此外,智能合约代码通常是开源的。开源代码减少了对应用程序开发人员的信任,但更重要的是,它使开发人员能够相互借鉴彼此的成果。今天,您可以通过分叉流行的 web3 协议的代码库并为您的特定应用程序调整业务逻辑来快速创建 dapp。

智能合约编程语言

如果智能合约是代码块,web3 开发人员将需要学习编程语言来编写智能合约。幸运的是,有许多智能合约编程语言可供选择。
每种智能合约编程语言在工具的可用性、文档、生态系统支持、开发人员社区的规模、易用性和功能程度方面各不相同。您对智能合约编程语言的选择将取决于个别因素,例如您想要构建的区块链生态系统。

举个简单的例子,学习 Solidity 可以让您在为多个区块链构建 dapps 时处于有利地位。Solidity 是为 EVM 创建的。因此,其他 EVM 兼容的区块链支持使用它来编写智能合约。

下面是一个用 Solidity 编写的简单的“HelloWorld!” 智能合约:

 

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

contract HelloWorld {
    function sayHello() publicpure returns (string memory) {
        return"Hello World!";
    }
}

 

您还可以考虑其他因素,例如语言的流行度和易用性。例如,一些区块链允许用 Rust 编写智能合约,因为后者对 web2 开发人员来说更熟悉也更容易使用。程序示例:

下面是一个用 Rust 为 Solana VM 编写的简单的“HelloWorld!” 智能合约:

 

usesolana_program::{
    account_info::AccountInfo,
    entrypoint,
    entrypoint::ProgramResult,
    msg,
    pubkey::Pubkey,
};


entrypoint!(process_instruction);


fnprocess_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
) -> ProgramResult {
 
    msg!("Hello Solana! (From Rust!)");
    Ok(())
}

 

 

前端库

在软件开发中,前端架构控制着用户与应用程序的交互。因此,您会经常看到在应用程序的用户界面 (UI) 或 UX(用户体验)的上下文中描述的前端。

在大多数情况下,前端技术从 web2 到 web3 保持不变,开发人员依赖于众所周知的框架,如 HTML、CSS 和 JavaScript。React(一个 JavaScript 库)在为 web3 应用程序构建用户界面的开发人员中特别受欢迎。这种熟悉使得具有 web2 前端开发经验的开发人员更容易构建 dapp 前端。

然而,发生变化的是前端(客户端)与后端(基于区块链的智能合约)的通信方式。在常规的 web2 应用程序中,前端(例如 Web 应用程序 UI)使用请求-响应机制(通常是 HTTP)将用户请求传达给后端服务器。服务器接收请求,根据请求数据进行一些处理,然后将响应发送回客户端(通过前端)。

 


注意:虽然在 web2 中 web 应用程序的后端通常指的是服务器,但它也可以包括服务器可能与之通信以处理请求的所有底层组件——数据库(例如 MySQL 或 PostgreSQL)、键值存储 (例如,Redis),或持久文件存储(例如,MongoDB)。

在 web3 中,用户仍然(主要)通过使用 HTML、CSS 和 JavaScript 创建的前端与应用程序交互。但是,客户端在向 dapp 的后端(即基于区块链的智能合约)发送请求之前必须连接到一个节点(稍后会详细介绍)。此外,web3 应用程序中前端和后端之间的通信是通过自定义 JavaScript 库处理的,特别是 ethers.js 和 web3.js(用于与 EVM 兼容的区块链)。

Ethers.js 和 web3.js 提供用于处理 dapps 前端逻辑的实用程序,包括签署交易、获取用户余额、检索帐户信息、管理 web3 钱包等。这两个库还支持对区块链节点进行 RPC(远程过程调用)——使开发人员更容易读取和写入区块链。

 

 

下图描述了用户(客户端)尝试与 Web3 应用程序交互的典型工作流程。客户端将连接到一个节点,通常是通过像 Infura 这样的节点提供商,并提交一个请求(通过交易)触发特定的智能合约逻辑。该操作的结果可以通过区块链节点或区块浏览器获得。

 
除了 ethers.js 和 web3.js,您还会发现其他自定义 JavaScript 库,用于管理客户端与区块链的交互。以下是一些前端库,可用于为其他区块链上的 dapps 构建 UI 组件:

Blockchain

Frontend libraries

Solana 

Anchor, solana-web3.js

Polkadot (Substrate-based chains)

polkadot.js

NEAR

near-api-js

Cosmos

cosm.js

注意:web3 应用程序的前端存储在链下,不像智能合约那样存在于链上。由于链上计算非常昂贵,执行复杂的前端逻辑在经济上是不可行的。一些去中心化的 web3 原生解决方案越来越受欢迎,例如 Skynet Labs 的 Homescreen,但还没有行业标准。初始化 web3.js 并使用它来获取帐户列表:

 

const Web3 = require('web3');
const web3 = new Web3(Web3.givenProvider || 'ws//some.local-or-remote.node:8546');

web3.eth.getAccounts(console.log);
> ["0xd8da6bf26964af9d7eed9e03e53415d37aa96045","0x64ae4fD3E9906ee4A0189e3A393d19b3e35cdb67"]

 

节点和节点提供商

区块链架构中节点的定义有很多,但总的来说,节点是一台连接到区块链网络的计算机。例如,比特币节点通常会挖掘、存储和验证区块。在以太坊中,节点为 EVM 提供处理能力;它们还存储和执行智能合约代码、跟踪 EVM 状态、创建和验证新块等等。

RPC 端点

节点在区块链交互层运行,并提供对链上数据的访问。与任何区块链交互都需要连接到一个节点,您通常会使用 RPC 端点来实现。

根据定义,RPC 端点使开发人员能够使用远程过程调用与区块链进行通信。这基本上意味着有一些规则或特定的数据结构来促进通信。例如,您可以使用 JSON-RPC 规范发送交易、读取区块链数据以及执行其他有用的功能。这通常是通过在此规范之上构建的库从开发人员那里抽象出来的,例如 web3.js(我们之前讨论过)。

 

运行节点与使用节点提供商

因为大多数区块链基本上都是去中心化的,任何人(包括开发人员)都可以根据硬件要求运行一个节点。从理论上讲,网络中的节点越多,网络就越安全。拥有更多节点可以分散运营能力,提供更多参与者来帮助达成共识,并提高网络弹性。

然而,并不是每个人都有硬件或时间来致力于运行和维护自己的节点。特别是,开发人员可能会发现管理内部节点基础设施的成本太高或不可扩展。这就是我们随后讨论的节点提供商发挥作用的地方。

节点提供商区块链节点提供商通过为 web3 项目提供 API 和专用 RPC 端点,使开发人员可以轻松地与区块链进行交互。开发团队可以将此任务外包给节点提供商,并专注于为用户构建和改进产品,而不是将宝贵的资源浪费在维护节点硬件上。

节点提供商通常构建为基础设施即服务 (IaaS) 模型,并可根据需求轻松扩展。一些节点提供商还可能提供其他工具,例如软件开发工具包 (SDK) 和有用的 API,以简化团队的 web3 开发工作流程。

使用 Infura 获取地址余额:

const Web3 = require('web3');
const infuraURL = 'YOUR_INFURA_URL_HERE';
const web3 = new Web3(new Web3.providers.HttpProvider(infuraURL));

// Get current balance of address
const balance = await web3.eth.getBalance(address);

 

下面的列表重点介绍了一些流行的区块链节点提供商,以及有关支持的区块链和开发人员可用工具的更多信息:

 

API(索引和查询)

在传统的技术栈中,数据库以使应用程序能够有效使用数据的格式构建和组织数据。区块链以不同方式存储数据,更适合为基本读取操作返回信息。要执行复杂的排序/查询操作(例如构建索引和关系数据库),您需要管理昂贵的后端基础设施来缓存和同步数据。

这就是 The Graph、HAL 和 Moralis 等索引协议在构建 web3 应用程序中变得有用的地方。区块链索引器通过充当区块链和 dapp 之间的中间人,使数据查询变得简单高效。本质上,它们从区块链中提取信息,并允许您在应用程序中高效地查询/索引数据。

The Graph 在这种情况下非常流行,它允许任何人创建自定义和可公开访问的 API(subgraphs)来索引区块链数据。HAL 和 Moralis 还提供用于跟踪链上事件和过滤链上数据以查找特定 dapp 特定信息的实用程序。

从应用程序查询 Graph:

 

咨询我们的区块链专家

我们的全球解决方案团队提供区块链培训、战略咨询、实现服务和合作机会。

请与我们联系,了解更多资讯:wechat@consensys.net

 

 

...全文
1601 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

725

社区成员

发帖
与我相关
我的任务
社区描述
ConsenSys是一家领先的以太坊和去中心化协议软件公司,我们的产品套件由Infura、Quorum、Codefi、MetaMask、Truffle、Diligence 和我们的NFT 平台组成。
区块链 企业社区
社区管理员
  • csdnsqst0035
  • Ashley0001
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧